[C#] ลองใช้ Log4Net มาเก็บบันทึกของ Console App กัน

หลังจากสร้าง 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 ไฟล์ครับ
  • มาดูอีกส่วนใน 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));
    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.