Làm Thế Nào Config Log4Net Trong C#

Log4net là gì?

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. Nó chính là một phiên bản chuyển thể từ log4j và vẫn tiếp tục được phát triển kể từ năm 2001. 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,

Sử dụng như thế nào?

Trong bài viết này, tôi sẽ giới thiệu cách sử dụng log4net cho một window application và cách config cho log4net ghi thông tin log ra file bằng một file config. Thực ra đối với web application thì cách sử dụng hoàn toàn tương tự. Chỉ có một số trường hợp file log của bạn không sinh ra được vì không đủ quyền. Như các bạn biết thì Web application chạy dưới 1 process bằng quyền của user ASPNET trong Windows, dó đó nếu user này không đủ quyền ghi file vào folder web của bạn thì file log tương ứng cũng có thể không được tạo ra.

Hãy download version mới nhất của log4net từ website apache. và add reference vào project của bạn như hình sau:

Sau khi bạn đã reference Log4net vào project của mình hoàn chỉnh, các bước còn lại bạn tiếp tục config để project của bạn hiểu Log4Net ở đâu. Để project hiểu bạn cần config code mỗi khi project gọi Log4Net, như vậy thì rất dài dòng và phức tạp vì phải gọi đi gọi lại nhiều lần. Cách đơn giản hãy tạo một class dùng chung và bạn có thể gọi bất cứ đâu mà bạn muốn :

public static class LogService
{
      #region Members
      private static readonly ILog logger = LogManager.GetLogger(typeof(LogService));
     #endregion
      #region Constructors
      static LogService()
     {
          BasicConfigurator.Configure();
          XmlConfigurator.Configure();
     }
     #endregion
     #region Methods   
    public static void WriteLog(LogLevel logLevel, String log)
    {
         if (logLevel.Equals(LogLevel.DEBUG))
             logger.Debug(log);
        else if (logLevel.Equals(LogLevel.ERROR))
            logger.Error(log);
        else if (logLevel.Equals(LogLevel.FATAL))
            logger.Fatal(log);
        else if (logLevel.Equals(LogLevel.INFO))
            logger.Info(log);
        else if (logLevel.Equals(LogLevel.WARN))
            logger.Warn(log);
    }
    #endregion
}

Bây giờ chúng ta đã có class dùng chung trong project của bạn, câu hỏi ở đây là chúng ta sẽ gọi chúng như thế nào? và còn config nào nữa ?. Câu trả lời cho các bạn là còn rất nhiều bạn cứ từ từ và xem tiếp theo. Trước tiên bạn xem project của bạn thuộc một thể loại nào Application hay Web, không sao dù là project nào thì đều có file config riêng cho nó.

Application thì ta có App.config

Web thì ta có Web.config.

Bạn hãy thêm config này vào trong config file của bạn :

Trong file cấu hình này, tôi sử dụng RollingFileAppender. Có rất nhiều loại Appender được xây dựng sẵn trong thư viện log4net. Mỗi loại sẽ có công dụng ghi nội dung log vào một nơi khác nhau. Trong đó RollingFileAppender là được sử dụng nhiều nhất và cũng dễ sử dụng nhất. Tôi sẽ giải thích những gì tôi nghĩ là khó hiểu nhất

<file value="Log4netSampleLog.txt">

Thông tin log của chúng ta sẽ được ghi vào file Log4netSampleLog.txt, file này sẽ nằm ở thư mục chạy của ứng dụng, cùng cấp với file exe và file .config của chúng ta. Nếu muốn nó lưu file vào chỗ khác chúng ta có thể hardcode đường dẫn ở đây.

<maxsizerollbackups value="3" />

Dữ liệu log sẽ được ghi vào file, vì ta đang sử dụng là RollingFileAppender, nên khi kích thước file vượt quá một mức nào đó thì nó sẽ đổi tên file cũ và ghi vào file mới. Tổng số lượng file tối đa sẽ là 10 và những file cũ nhất sẽ bị xóa nếu số lượng file vượt quá 3.

<maximumfilesize value="1MB">

Kích thước file log tối đa sẽ là 1MB.

Layout: Đây là phần khá thú vị, những text log mà chúng ta ghi ra sẽ kèm thêm một số thông tin theo như phần định dạng trong layout như ngày tháng, threadId, className, ... Các bạn có thể tùy biến phần layout này để được log output dễ nhìn nhất.

<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
<layout>

Level: Level mặc định sẽ là Debug cho mọi nơi có sử dụng log trong chương trình của bạn. Nghĩa là nếu bạn khai báo như hình, thì mọi chỗ bạn log đều được ghi xuống file vì level DEBUG là level thấp nhất, nhưng nếu chỗ này bạn để là ERROR thì chỉ có những log với level cao hơn hoặc bằng ERROR mới được ghi xuống file. Khi deploy chương trình cho khách hàng, thường thì chúng ta sẽ để level default là ERROR, khi sử dụng có lỗi ta sẽ yêu cầu khách hàng sử lại thành DEBUG nếu cần thiết.

<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
</root>

- Thông thường người ta sử dụng full name của class (kèm theo đầy đủ namespace) để dùng như loggerName. Cách dùng này rất hợp lý vì chúng ta sẽ biết đoạn log của mình sinh ra từ class.nào. Để ghi Log bạn cần phải xác định rằng bạn ghi cái gì và ghi như thế nào?

Để ghi thông tin bạn làm như sau:

Để ghi lỗi bạn làm như sau :

Còn nhiều và nhiều cách config cho Log4Net bạn có thể tham khao các cách config tại trang wen của nó. 

Chúc bạn thành công.