02/10/2018, 00:10

Lập trình CSharp - Sử dụng Log4Net để ghi lại nhật ký khi chạy web hoặc ứng dụng

Hôm nay mình sẽ làm ví dụ về sử dụng Log4Net trong lập trình 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à ...

Hôm nay mình sẽ làm ví dụ về sử dụng Log4Net trong lập trình 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 lap trinh csharp 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.

Download log4net từ đây (nên chọn bản mới nhất). File mà bạn tải xuống là source code. Bạn vào trong thư mục ..log4net-2.0.8srcobjDebuglog4net.dll
laptrinhvb.net-csharp-su-dung-log4net-ghi-log-ung-dung-1

  •  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ề.( in et* eleaselog4net.dll)

Viết hàm main như sau:

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

namespace UsingLog4Net
{
   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ả sẽ như thế này:

laptrinhvb.net-charp-su-dung-log4net-ghi-log-ung-dung-2

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

laptrinhvb.net-charp-su-dung-log4net-ghi-log-ung-dung-3

Ví dụ: Nếu bạn tạo 1 đối tượng logger và gán nó với cấp độ INFO. Thì bạn sẽ 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:
- Add reference file Log4Net.dll mới tải hồi nãy 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)]

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ên_class_của_bạ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:

Chú thích:

  1.  Đường dẫn file ta ghi thông tin lỗi
  2. 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)
  3. Kích thước tối đa của 1 file log (ở đây mình config là 1 Megabyte)
  4. Đị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 tbl_log (
[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:

Chú thích:

  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.
  2.  Kết nối tới loại csdl cần lưu trữ (SQL Server hoặc Oracle, MySql).
  3.  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:
  4. Câu lệnh hoặc stored procedure dùng cho việc insert tới Database.
  5. 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.
  6.  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

Chúc thành công !

Tags:
0