Sử dụng Log4net trong C#

Sử dụng Log4net trong C#

Log4net là một công cụ giúp người lập trình ghi lại những thông tin trong lúc chạy ứng dụng. Trong trường hợp ứng dụng của bạn có lỗi mà vẫn không tìm được nguyên nhân, log4net có thể là vị cứu tinh để giúp bạn xác định nơi gây lỗi.

Ngoài ra, Log4net còn có thể thay đổi trạng thái log lúc chương trình chạy mà không cần ngừng chương trình. Bên cạnh đó, khi sử dụng log4net sẽ không ảnh hưởng đáng kể đến performance của ứng dụng, log4net còn được thiết kế với tính flexibility rất cao, chúng ta có thể mở rộng và thêm thắt những thứ mình muốn vào thư viện log4net, chẳng hạn như cách thức log, định dạng log, …
Có rất nhiều cách để Appender, tuy nhiên ta quan tâm 2 cách hay dùng nhất là:
+Log ra File (trong đó RollingFileAppender được dùng nhiều nhất)
+Log ra Database (ở đây sử dụng MS SQL Server)

Trong bài viết này mình sẽ giới thiệu cách sử dụng Log4net bằng 2 cách trên, nhưng trước tiên mình sẽ làm 1 ví dụ console đơn giản sử dụng log4net.
Viết log trong 1 chương trình console
Các bước như sau:
+ Download log4net từ http://logging.apache.org/log4net/download.html (nên chọn bản mới nhất).
+ Mở visual studio và tạo một ứng dụng console
+ Thêm log4net.dll vào reference trong thư mục vừa tải về.( \bin\net\*\release\log4net.dll)
+ Viết hàm main như sau:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;

namespace DemoLog4Net
{
   class Program
   {
    protected static readonly ILog log = LogManager.GetLogger(typeof(Program));
    static void Main(string[] args)
    {
       log4net.Config.BasicConfigurator.Configure();
       log.Debug("Debug level");
       log.Info("Info level");
       log.Warn("Ware level");
       log.Error("Error level");
       log.Fatal("Fatal level");
       Console.ReadLine();
    }
   }
}

Kết quả:

• Có 7 cấp độ log như hình bên dưới đây:

Ví dụ: Nếu bạn tạo 1 đối tượng logger và gán nó với cấp độ INFO. Nên khi bạn gọi phương thức sau:

Logger.Info("message");
Logger.Debug("message");
Logger.Warn("message");

Phương thức đầu tiên, level của phương thức Info() bằng với level được gán cho logger nên nó hiện thị “message”.
Phương thức thứ 2, level của phương thức Debug () nhỏ hơn level được gán cho logger nên yêu cầu bị từ chối và nó không hiện thị message.
Tương tự bạn dễ dàng biết được kết quả của phương thức thứ 3 rồi phải không :) .
All: cho phép tất cả các yêu câu, OFF: từ chối tất cả các yêu cầu.
Bây giờ, mình sẽ giới thiệu cách sử dụng log4net trong ứng dụng web application
Các bước cơ bản:
- Download log4net về, add reference vào ứng dụng của mình.
- Cấu hình file AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]

- Cấu hình log4net trong web.config
- Đăng ký log4net trong Application_Start() trong Global.asax

void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
}

- Sử dụng:
+ Using namespace log4net ở những nơi bạn cần sử dụng
+ Tạo thuộc tính sau vào các lớp cần sử dụng

private static readonly ILog log = LogManager.GetLogger(typeof(TênLớpCủaBạn).Name);

Hoặc cách tổng quát hơn là:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

+ Tại những nới cần log thì thêm đoạn code sau

log.Info("log.Info");
log.Debug("log.Debug");
log.Error("log.Error");

Trường hợp 1: Log ra file
Cấu hình trong web.config

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
			<file value="App_Data/log.txt" />
			<appendToFile value ="true" />
			<rollingStyle value="Size"/>
			<maximumFileSize value="1MB"/>
			<maxSizeRollBackup value ="10" />
			<staticLogFileSize value="true"/>
			<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n">
			</layout>
			</appender>
		<root>
			<level value="DEBUG"/>
			<appender-ref ref="RollingFileAppender"/>
		</root>
</log4net>

Giải thích

i.      <file value=”App_Data/log.txt” />

- Đường dẫn file ta ghi thông tin lỗi

ii.      <maxSizeRollBackup value =”10″/>
- Ta sử dụng RollingFileAppender, nếu kích thước file vượt quá quy định thì nó sẽ đổi tên file cũ và ghi vào file mới. Tổng số file tối đa ở đây mình do mình config (ở đây là 10), các file cũ nhất sẽ bị xóa đi khi số lượng file vượt quá số lượng config (ở đây là 10)

iii.      <maximumFileSize value=”1MB”/>
- Kích thước tối đa của 1 file log (ở đây mình config là 1 Megabyte)

iv.      <layout></layout
- Định dạng của thông tin log cần ghi ra file kèm theo một số thông tin, bạn có thể tùy biến sao cho thông tin dễ nhìn nhất, ở đây tôi config
value=”%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n”>

Trường hợp 2: Log ra database (MS SQL Server)
Cấu trúc bảng cần định nghĩa (tùy vào việc cần lưu cái gì mà mình định nghĩa bảng này sao cho hợp lý, tuy nhiên bảng sau chứa các thuộc tính cơ bản cho việc log.

CREATE TABLE tblLog (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)

Cấu hình trong web.config

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>

<log4net>
		<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
			<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
			<connectionString value="Data Source=.;Initial Catalog=Log4Net;Persist Security Info=True;User ID=sa;Password=xxxxxx"/>
			<commandText value="INSERT INTO tblLog ([Date],[Thread],[Level],[Logger],[Message],[Exception) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
			<parameter>
				<parameterName value="@log_date" />
				<dbType value="DateTime" />
				<layout type="log4net.Layout.RawTimeStampLayout" />
			</parameter>
			<parameter>
				<parameterName value="@thread" />
				<dbType value="String" />
				<size value="255" />
				<layout type="log4net.Layout.PatternLayout">
					<conversionPattern value="%thread" />
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@log_level" />
				<dbType value="String" />
				<size value="50" />
				<layout type="log4net.Layout.PatternLayout">
					<conversionPattern value="%level" />
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@logger" />
				<dbType value="String" />
				<size value="255" />
				<layout type="log4net.Layout.PatternLayout">
					<conversionPattern value="%logger" />
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@message" />
				<dbType value="String" />
				<size value="4000" />
				<layout type="log4net.Layout.PatternLayout">
					<conversionPattern value="%message" />
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@exception" />
				<dbType value="String" />
				<size value="2000" />
				<layout type="log4net.Layout.ExceptionLayout" />
			</parameter>
		</appender>
		<root>
			<level value="DEBUG"/>
			<appender-ref ref="AdoNetAppender"/>
		</root>
	</log4net>

Giải thích
i.      <bufferSize value=”1″/>
- Log vào Database theo từng batch, nếu test thì ta nên để giá trị = 1 vì nếu để 100 thì phải có 100 lỗi ,nó mới log 1 lần dẫn đến nhầm lẫn tưởng là log không chạy.

ii.      <connectionType>
- Kết nối tới loại csdl cần lưu trữ (SQL Server hoặc Oracle, MySql)

iii.    <connectionString>
- Chuỗi kết nối tới csdl bạn cần lưu thông tin log
- Nếu trong web.config của bạn đã có connectionString rồi thì ta chỉ cần gán tên của nó tại đây: <connectionStringName value=” ” />

iv.    <commandText></ commandText>
- Câu lệnh hoặc stored procedure dùng cho việc insert tới Database

v.     <parameter></parameter>

- Tham số cung cấp cho câu lệnh hoặc stored procedure insert, chứa tên, loại dữ liệu, định dạng thông tin cần log.

vi. <root></root>
- Thiết lập level
Lưu ý: Đối với trường hợp là winform application cũng có cách làm gần tương tự, thay vì config trong web.config thì mình sẽ phải config trong App.config.
Link tham khảo:
http://logging.apache.org/log4net/release/config-examples.html
http://www.codeproject.com/Articles/140911/log4net-Tutorial

Happy coding :)

Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!