[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));
  • ลองเรียกใช้ 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.