หลังจากสร้าง draft ทิ้งไว้นานมาแล้ว วันนี้มาลองรื้อบทความเก่าๆมาเขียนให้เสร็จครับ สำหรับ Blog ตอนนีเป็นการลองใช้ Log4Net กับ console app ครับ เอาหละมาลุยกันเลยครับ
Table of Contents
เตรียมตัว & ติดตั้ง
- สร้าง 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)]
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.

