2011-02-20 35 views
7

tôi biết có một số mức độ đăng nhập BUILTIN trong NLog như dấu vết, thông tin, gây tử vong vvnLog và Custom Mức

tôi muốn xác định một vài cái mới như "DBLog" và có thể chỉ cấu hình tất cả các bản ghi với DBlog để được nhắm mục tiêu đến một Mục tiêu nhất định.

có cách nào để làm điều đó không? hoặc tôi phải xác định một nhật ký tùy chỉnh?

Trả lời

20

@SemVanmeenen là đúng, NLog không cho phép thêm các mức tùy chỉnh (có nghĩa là, mở rộng các giá trị có thể có trong lớp LogLevel). Ngoài ra, với cách mà các mức hoạt động, ít nhất là trong NLog, mỗi cấp thường chỉ ra mức độ ưu tiên của thông báo. Vì vậy, bạn nếu bạn có một số (hoặc tất cả) loggers cấu hình để đăng nhập chỉ Lỗi và tin nhắn cấp cao hơn, bất kỳ Trace, Debug, Thông tin, và cảnh báo tin nhắn sẽ không nhận được đăng nhập. Cấp độ DBLog sẽ phù hợp ở đâu? Có vẻ như đó sẽ là một "danh mục" (có thể tương tự như các tên logger) chứ không phải là một cấp độ.

Bạn có thực sự cần một cấp đặc biệt (hoặc nhiều hơn một) để ghi lại các nội dung như "DBLog" không? Tại sao không chỉ định nghĩa một trình ghi khác trong tệp cấu hình của bạn có tên là "DBLog"? Bằng cách đó, bạn có thể sử dụng tính năng lọc và Mục tiêu để gửi các nhật ký đó đến một Mục tiêu cụ thể hoặc bật hoặc tắt trình ghi nhật ký đó. See this link for some examples of stuff you can do with NLog configuration.

Một trong những mô hình phổ biến nhất trong NLog và log4net là phải có một logger mỗi lớp, như thế này:

class MyClass 
{ 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

Bạn cũng có thể sử dụng tên logger tùy ý:

class MyDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

class MyOtherDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

Trong ví dụ thứ hai, cả hai lớp đang sử dụng cùng một trình ghi nhật ký ("DbStuff") và cả hai có thể được kiểm soát (mức ghi nhật ký, Mục tiêu, vv) dựa trên tên của trình ghi nhật ký đó.

Bạn cũng có thể sử dụng các trình ghi khác nhau trong cùng một lớp (có thể theo mặc định bạn sử dụng kiểu logger "mỗi lớp", nhưng bạn cũng xác định một số nhật ký "cắt ngang" để dễ dàng đăng nhập hơn - và kiểm soát - thông tin tương tự qua các lớp). Bạn có thể có một trình ghi nhật ký được gọi là "SQL" hoặc "HIỆU SUẤT" mà bạn thỉnh thoảng sử dụng để ghi lại thông tin cụ thể mà bạn muốn kiểm soát ở cấp độ khác với cấp lớp.

Sử dụng các tên trình ghi nhật ký khác nhau, bạn chắc chắn có thể định tuyến các thông điệp ghi nhật ký đến các mục tiêu khác nhau mà không cần xác định các cấp nhật ký mới.

Nếu điều này không hữu ích, có thể bạn có thể giải thích chi tiết về câu hỏi của mình về chính xác những gì bạn muốn làm. Bạn muốn viết loại mã đăng nhập nào mà bạn cảm thấy bạn không thể viết ngay bây giờ?

[UPDATE]

<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> 
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> 
<logger name="Name.Space.*" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Warn" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> 

Giả sử rằng f1, f2, f3, f4 và là tập tin mục tiêu.

Dòng 1 sẽ làm cho trình ghi nhật ký Class1 ghi vào mục tiêu f1 cho Debug và các thông báo mức cao hơn (tức là Trace sẽ bị bỏ qua).

Dòng 2 sẽ gây ra các logger cho Class1 ghi vào mục tiêu f1 CHỈ Debug và mức Lỗi tin nhắn (tức là Trace, Thông tin, cảnh báo, và Fatal sẽ bỏ qua)

dòng 3 sẽ làm cho người khai thác gỗ cho tất cả các lớp trong không gian tên Name.Space để ghi vào các mục tiêu f3 và f4 bất kể mức độ.

Dòng 4 sẽ làm cho người khai thác gỗ cho tất cả các lớp trong namespace Name.Space để viết thư cho mục tiêu f3 và f4 chỉ khi mức độ ghi là Cảnh báo hoặc cao hơn (tức là Trace, Debug, và thông tin sẽ được bỏ qua)

Dòng 5 sẽ gây ra các logger cho tất cả các lớp trong namespace Name.Space để loại bỏ bất kỳ thông điệp nào có mức độ giữa Debug và Error. Chúng bị từ chối vì không có mệnh đề writeTo. Không có quy tắc nào khác được xử lý cho nhật ký do final=true

Những ví dụ này cho thấy cách lọc ở cấp độ trình ghi nhật ký. Bạn có thể lọc thêm ở cấp Mục tiêu bằng cách sử dụng FilteringTargetWrapper. Tôi đã không sử dụng nó, nhưng có một ví dụ về cấu hình một FilteringTargetWrapper đây:
Most useful NLog configurations

tôi có các ví dụ trên các file Help đi kèm với refresh NLog 1.0 cài đặt. Tôi chưa cài đặt NLog 2.0 vì tôi đang ở giữa dự án và muốn đợi cho tới khi NLog 2.0 hết phiên bản beta trước khi tôi chuyển sang dự án. Nếu bạn đang sử dụng NLog 2.0 và tệp trợ giúp không có các ví dụ tốt hơn là trên trang web NLog, bạn có thể xem xét việc cài đặt ít nhất trợ giúp NLog 1.0. Bạn có thể nhận trợ giúp NLog 1.0 tại đây: http://nlog.codeplex.com/releases/view/32601

+0

Vấn đề là tôi có kết nối với máy chủ tôi đã tạo nhật ký cho mỗi "đối tượng kết nối" bây giờ cho phép tôi thực hiện logger.trace và log.warn nếu tôi muốn lọc dấu vết (chỉ) mà không hiển thị cảnh báo? – Stacker

+1

Khi bạn định cấu hình trình ghi nhật ký của mình trong tệp cấu hình, bạn có thể định cấu hình các cấp độ minLevel, maxLevel hoặc rời rạc cho mỗi tệp. Vì vậy, đối với logger "A", bạn có thể cấu hình nó để chỉ ghi các thông điệp theo dõi và cho trình ghi "B", bạn có thể cấu hình nó để chỉ ghi các thông báo Warn (hoặc Warn và thấp hơn). Tôi sẽ thêm một vài ví dụ cho câu trả lời của tôi. – wageoghe

+0

+1 cho nhật ký "cắt chéo" –

0

Theo như tôi biết, không thể. The log level class của nlog thậm chí không có một hàm tạo công khai và chỉ có các đối tượng lén lút tĩnh được xác định trước (tức là Thông tin, Dấu vết, v.v.).

Nhưng có lý do nào khiến mục tiêu không đủ?