หลังจากสร้าง draft ทิ้งไว้นานมาแล้ว วันนี้มาลองรื้อบทความเก่าๆมาเขียนให้เสร็จครับ สำหรับ Blog ตอนนีเป็นการลองใช้ Log4Net กับ console app ครับ เอาหละมาลุยกันเลยครับ
เตรียมตัว & ติดตั้ง
- สร้าง new project แบบ console app
- ติดตั้ง Apache log4net จากตัว nuget คลิกขวาที่ Project >> Manage Nuget Package >> Search "Nuget" >> Install ครับ
สร้าง Configuration file
- สร้างไฟล์ไว้ที่นี่
- สำหรับตัว Console App ลองเอา Config นี้มาใช้เลย
<log4net> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <file value="Logs\CommandLine.Log" /> <threshold value="ALL" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <maximumFileSize value="1MB" /> <maxSizeRollBackups value="10" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="*%-10level %-30date %message [%logger] [%thread] %newline" /> </layout> </appender> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="ERROR" /> <foreColor value="Red, highintensity" /> </mapping> <mapping> <level value="WARN" /> <foreColor value="Yellow, highintensity" /> </mapping> <mapping> <level value="ALL" /> <foreColor value="Green, highintensity" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="*%-10level %-30date %message [%logger] [%thread] %newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="RollingFile" /> <appender-ref ref="ColoredConsoleAppender" /> </root> </log4net>
- มาอธิบาย Log ดีกว่า โดยดูจากตัว Appender เป็นตัวที่บอกให้ log ว่าแสดงผลที่ไหน ทั้ง console, textfile หรือลง DB เป็นต้น มีการ Config อย่างไรครับ
- ColoredConsoleAppender - แสดงผลบนหน้า Console App ครับ โดยผมมีการ Map สีของ Log กับรูปแบบ ดังนี้
- ERROR - สีแดง
- WARN - สีเหลือง
- ALL - สีเขียว
- RollingFile - เขียนลง File ตาม path ที่กำหนดครับ โดยขนาดของ Log จะไม่เกิน 1 MB ครับ ถ้าเกินจากนั้นก็จะแยกไฟล์ และเก็บ log ล่าสุดไม่เกิด 10 ไฟล์ครับ
- ColoredConsoleAppender - แสดงผลบนหน้า Console App ครับ โดยผมมีการ Map สีของ Log กับรูปแบบ ดังนี้
- มาดูอีกส่วนใน config ส่วนของ root เป็นตัว Config ทำให้ Log ทำงานครับ
- อันนี้ผมเรียกใช้ทั้ง ColoredConsoleAppender และ RollingFile
เชี่อม config กับ Console App
- อย่าลืม Config ของ Log4Net ครับ กำหนด "Copy to Output Directory" เป็น "Copy if newer" หรือ "Copy Always"
- ทำให้ Console App ของเรา ดึงตัว Config ของ Log4Net ขึ้นมาครับ
- แก้ไขไฟล์ AssemblyInfo.cs ใน property เดิม Code นี้ลงไปครับ (ระวัง Path ของไฟล์ log4net.config.xml)
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config.xml", Watch = true)]
- ประกาศตัวแปรของ Log
private readonly log4net.ILog _logger = log4net.LogManager.GetLogger(typeof(Program));
- ลองเรียกใช้ Log ตาม Code ตัวอย่างครับ อย่างผมลอง TestException แบบ Throw กับ Rethrow ครับ
using log4net; using log4net.Config; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ConsoleException { class Program { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); static void Main(string[] args) { var timer = Stopwatch.StartNew(); try { log.Info("Start"); log.Warn("Testing Throw vs Rethrow"); //Console.Write(TestThrowEx(5, 0)); Console.Write(TestReThrowEx(5, 0)); } catch (Exception ex) { log.Error(ex.StackTrace); //Console.Write(ex.StackTrace); } finally { log.InfoFormat("application completed in {0}ms", timer.ElapsedMilliseconds); Console.ReadKey(); } } public static Decimal TestReThrowEx(Decimal a, Decimal b) { try { return a / b; } catch(DivideByZeroException ex) { log.Debug(ex.StackTrace); throw; } } public static Decimal TestThrowEx(Decimal a, Decimal b) { try { return a / b; } catch (DivideByZeroException ex) { log.Debug(ex.StackTrace); throw ex; } } } }
- มาดูผลลัพธ์กันครับ ฝั่ง Console
- มาดูผลลัพธ์กันครับ ฝั่ง Log file
- ลองกลับไปดู Log จาก Console เก็บชนิด Log | เวลา | Log Message + Class + stack track และ อื่นๆ ถ้ามี
- สำหรับ Code ลองดูได้จาก Git เลยครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.