2009-02-23 30 views
67

Trong this thread nhiều người đã chỉ ra rằng họ sử dụng log4net. Tôi là một fan của TraceSources và muốn biết tại sao log4net lại được sử dụng.log4net so với TraceSource

Đây là lý do tại sao tôi thích nguồn trace:

  • nghe Pluggable - XML, textfile, Console, EventLog, cuộn của riêng bạn
  • tùy chỉnh dấu vết switch (lỗi, cảnh báo, thông tin, tiết, bắt đầu, kết thúc , tùy chỉnh)
  • tùy chỉnh cấu hình
  • các Logging Application Block chỉ là một tập hợp lớn của TraceListeners
  • tương quan của hoạt động/phạm vi (ví dụ, liên kết tất cả các bản ghi trong một ASP.NET r equest với một khách hàng nhất định
  • Trình theo dõi dịch vụ cho phép bạn trực quan hóa các sự kiện đối với các hoạt động này riêng lẻ
  • Tất cả đều có thể định cấu hình trong app.config/web.config.

Vì khuôn khổ .NET sử dụng nội bộ TraceSources, nó cũng cung cấp cho tôi cách nhất quán để định cấu hình truy tìm - với log4net, tôi phải định cấu hình log4net cũng như TraceSources.

Log4net cho tôi biết rằng TraceSources không (hoặc không thể thực hiện bằng cách viết một vài TraceListeners tùy chỉnh)?

+22

Tôi thấy câu hỏi này xứng đáng với SO và cũng tìm thấy một số câu trả lời đủ thông tin để tôi không còn phải tìm kiếm thêm thông tin. Bất cứ ai đóng câu hỏi này là 'không xây dựng' tôi đặt câu hỏi có hay không nó đã được thực hiện vì một thiên vị đối với log4net và một sự không hài lòng chung với dòng câu trả lời được nhận. Câu hỏi này và nhiều câu trả lời giúp làm rõ sự sợ hãi, không chắc chắn, nghi ngờ và thông tin sai lệch đơn giản xung quanh cả log4net và .NET Tracing. –

+3

Tôi cũng thấy câu hỏi này hữu ích. Và trên thực tế phù hợp chính xác những gì tôi đang tìm kiếm. – Darkonekt

Trả lời

9

Tôi nghĩ rằng log4net đang làm mọi thứ bạn liệt kê cho tôi.

Người nghe có thể nghe được âm thanh như người phụ thêm - có rất nhiều người trong số họ và thậm chí tôi đã tấn công tệp nhật ký cuộn để luôn kết thúc bằng .log (đối với liên kết tệp), thêm trường cc vào ứng dụng email và cuối cùng đã điều chỉnh giá trị yêu thích của tôi cho appender console màu. Nếu tôi có thể quá táo bạo - giao diện điều khiển màu của tôi hạnh phúc:

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
<!-- Can Use: 
     Blue 
     Green 
     Red 
     White 
     Yellow 
     Purple 
     Cyan 
     HighIntensity 
     --> 
<mapping> 
    <level value="FATAL" /> 
    <foreColor value="Yellow, HighIntensity" /> 
    <backColor value="Red" /> 
</mapping> 
<mapping> 
    <level value="ERROR" /> 
    <foreColor value="White" /> 
    <backColor value="Purple, HighIntensity" /> 
</mapping> 
<mapping> 
    <level value="WARN" /> 
    <backColor value="Blue" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="INFO" /> 
    <backColor value="Green" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="DEBUG" /> 
    <foreColor value="White" /> 
</mapping> 
<layout type="log4net.Layout.PatternLayout"> 
    <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> 
    <!--<conversionPattern value="%-5level %file:%line - %message%newline" />--> 
    <conversionPattern value="%level %logger:%line %newline  %message%newline" /> 
</layout> 

tùy chỉnh dấu vết công tắc: Log4net chỉ đi kèm với lỗi nghiêm trọng WARN INFO DEBUG theo thứ tự tăng tính cách rườm rà. Người duy nhất tôi thực sự bỏ lỡ là KIỂM TOÁN cho những người đã làm gì đăng nhập.

Tùy chỉnh cấu hình: Tôi sử dụng một file log4net.config mà tôi tải lên trong thời gian chạy (hoặc viết một bản ghi vào c:. \ Rên rỉ mà tôi không thể tìm ra cấu hình)

Try 
     ' Get log4net configuration from file 
     Dim logConfigFile As FileInfo 
     logConfigFile = New FileInfo(".\log4net.config") 

     If logConfigFile.Exists Then 
      XmlConfigurator.Configure(logConfigFile) 
     Else 
      CreateEmergenceLogFile(logConfigFile.FullName) 
     End If 

    Catch ex As Exception 
     Console.Out.WriteLine("Could not load the log4net config file") 
    End Try 

chỉ là một lớn thiết lập của TraceListeners: xin lỗi bỏ qua cái đó - Tôi sẽ lấy từ của bạn cho nó.

Tương quan hoạt động/phạm vi: ý bạn là mọi tệp (lớp đọc) đều có nhật ký được đặt tên riêng có thể có các ngưỡng cấp nhật ký riêng biệt. Trong thực tế, bạn có thể phân khúc khai thác gỗ thậm chí trong một lớp học duy nhất (mà trong thực tế có thể đã phát triển để làm quá nhiều ...)

trong một tập tin lớp:

Private Shared _logger As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) 

Private Shared _loggerAttribute As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute") 

Private Shared _loggerCache As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache") 

Dịch vụ vết Viewer: trong log4net .config:

<logger name="NipissingU.ADWrapper.EntryTools.Attribute"> 
    <level value="INFO" /> 
    </logger> 
    <logger name="NipissingU.ADWrapper.EntryTools.Cache"> 
    <level value="WARN" /> 
    </logger> 

Tất cả cấu hình này có thể định cấu hình trong app.config/web.config: cũng có thể là một điều tốt trong ASP.NET, tôi không biết, nhưng khi làm cho ứng dụng đếm khách hàng phong phú Tôi thích một tập tin cấu hình riêng biệt.

Mọi thứ ở đây chỉ là các mẹo sử dụng nhỏ của riêng tôi.

hth, -Mike

+0

cảm ơn Mike. Tương quan hơi khác một chút - bạn có thể kết hợp một guid và siêu dữ liệu về một bối cảnh "log" - tất cả các dấu vết từ đó cho đến khi bối cảnh "đóng" sau đó liên quan đến ngữ cảnh đó. giúp bạn dễ dàng xem tất cả các nhật ký liên quan đến một Đơn đặt hàng hoặc Khách hàng cụ thể ví dụ: –

+0

ngược lại, có các tệp nhật ký khác nhau cho mỗi khách hàng/đơn đặt hàng có thể khá khó chịu –

+0

ngữ cảnh cũng hỗ trợ lồng ghép từ những gì tôi có thể biết, mặc dù tôi chưa thử Điều này –

3

Lý do tôi thích Log4Net sử dụng Trace một trong nhắm mục tiêu - với Log4Net, tôi có thể độc lập các lớp ứng dụng khác nhau của tôi (Truy cập dữ liệu, Dịch vụ, Logic nghiệp vụ, v.v) và các hệ thống phụ khác nhau (Xác thực, Xử lý, v.v.) và bật/tắt ghi nhật ký của từng hệ thống phụ một cách độc lập.

Tính linh hoạt này cho phép tôi định cấu hình ghi nhật ký chi tiết cho một hệ thống phụ mà không cần bật firehose cho toàn bộ hệ thống. Các phương pháp tĩnh được cung cấp trên lớp Trace [như TraceInformation()] không cung cấp bất kỳ cách nào để chỉ định hệ thống con nào ghi nhật ký, vì vậy đây không phải là thứ dễ dàng được cung cấp bằng cách viết TraceListener của riêng tôi.

Lý do khác là hiệu suất - có một phần ứng dụng của tôi có thể đăng nhập vài nghìn thư mỗi giây. Log4Net áp đặt chi phí thấp. Ngược lại, lần cuối cùng tôi nhìn vào nó, khối ứng dụng ghi nhật ký reparsed cấu hình XML của nó cho mỗi thông điệp được đăng nhập, làm cho khối rất nặng và chậm.

+12

Re: targetting - TraceSource cung cấp tính năng này.Bạn có thể có nhiều TraceSources được cấu hình và điều chỉnh từng cái một. –

+1

Re: hiệu suất. Tôi sẽ ngạc nhiên nếu đây vẫn là trường hợp, nhưng đó chắc chắn là điều tôi sẽ điều tra. Làm thế nào để mọi người đối phó với việc đọc một nghìn thông điệp tường trình mỗi giây? :) –

+1

Tôi biết rằng khóa học đọc tốc độ sẽ có ích – stimms

0

Trong khi Im chỉ bí mật với cách log4net hoạt động, một phần thưởng rõ ràng để sử dụng khuôn khổ đó là sự quen thuộc ngay lập tức cho những người quen sử dụng log4j.

Một lợi ích nhỏ khác là kiểm tra ghi nhật ký bằng log4net cực kỳ đơn giản; logger thực hiện log4net.ILog. Một lần nữa Im không quen thuộc với các giải pháp của Microsoft, nhưng Im tự hỏi làm thế nào người ta sẽ làm điều này mà không cần đầu tiên viết một mặt tiền cho lớp System.Diagnostics.Trace.

Với một cái nhìn lướt qua về tài liệu nguồn theo dõi, tôi không thể tìm thấy tương đương với bố cục và sẽ muốn biết liệu tương đương có tồn tại hay không. Các PatternLayout là khá thuận tiện để định dạng các entry bản ghi với dữ liệu phổ biến như datestamps, thông tin chủ đề, đăng nhập bối cảnh, vv Log4net PatternLayout tài liệu: http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

Bên cạnh đó, cho rằng văn bản mở rộng đến một khung đăng nhập có lẽ là một 'siêu vấn đề' cổ điển , log4net mang lại một danh sách lớn các trình nghe tương đương có thể cắm vào bảng.

Danh sách appenders: http://logging.apache.org/log4net/release/config-examples.html

+0

Xem dự án Chẩn đoán khái quát trên Codeplex (http://essentialdiagnostics.codeplex.com/) cho một System.Diagnostics TraceListener với hỗ trợ mẫu/định dạng, cũng như giao diện và mặt tiền cho TraceSource (mặc dù bạn có thể kiểm tra bằng cách gắn một kiểm tra trình theo dõi). –

54

Trong những ngày rất sớm (.NET 1.0) truy tìm trong .NET Framework là khá hạn chế. Ví dụ:

Ví dụ: Phân đoạn TraceSource không đến cho đến .NET 2.0 và bạn chỉ có bốn cấp (Lỗi, Cảnh báo, Thông tin, Chi tiết), mặc dù bạn có thể sử dụng nửa tá công tắc boolean để phân vùng nếu muốn.

log4j phổ biến trong Java và do đó nhận được rất nhiều hỗ trợ cho cổng .NET và một khi nó trở nên phổ biến, nó vẫn giữ nguyên cách đó, mặc dù mọi người thậm chí không sử dụng nó đúng cách singleton logger và mất tính năng chính của nó). Tuy nhiên, tôi nghĩ rằng log4net và các khung công tác khác (ví dụ NLog, Common.Logging và thậm chí EntLib) đã đi sai đường bằng cách triển khai hệ thống ghi nhật ký của riêng họ từ đầu, nghĩa là thay đổi ngay cả cách bạn viết các câu lệnh log nơi đầu tiên.

Tôi sẽ có nhiều ưu tiên để xem nỗ lực, đặc biệt là từ .NET 2.0, đưa vào mở rộng cơ sở vững chắc của những gì đã có trong .NET. Đối với một dự án mở rộng những gì đã có, hãy xem dự án Chẩn đoán khái quát trên CodePlex (http://essentialdiagnostics.codeplex.com/).

Một số thế mạnh của log4net:

  • Nó tương tự như log4j, nếu bạn chạy một môi trường hỗn hợp và muốn khai thác gỗ phù hợp.

  • Phân cấp nhật ký tự động kế thừa cài đặt khá gọn gàng, so với số lượng nguồn theo dõi bạn triển khai và phải định cấu hình từng nguồn. (mặc dù có lẽ quá mức cần thiết trong một số trường hợp).

  • log4net đã có khoảng 28 ứng dụng (tương đương với trình theo dõi), trong khi System.Diagnostics chỉ có 10 (nhưng xem dự án Essential.Diagnostics để biết thêm), vì vậy nếu bạn thực sự nghĩ mình có thể cần RemoteSyslogAppender, NetSendAppender, AnsiColorTerminalAppender hoặc TelnetAppender, sau đó bạn có may mắn.

Nhược điểm (so với System.Diagnostics):

  • Bạn cần phải sử dụng cú pháp khai thác gỗ khác nhau, vì vậy nếu bạn đang sử dụng source.TraceEvent(), bạn cần phải đi qua và thay thế mọi điều.

  • Điều này cũng mở rộng đến cú pháp khác nhau cho tương quan, vì vậy bạn cần thay đổi từ CorrelationManager thành ngữ cảnh log4net.

  • Không dễ dàng tích hợp với theo dõi khung (ví dụ: WCF).

  • Hỗ trợ kém cho ID sự kiện (cần sử dụng dự án mở rộng riêng biệt IEventLog).

  • Chưa hỗ trợ theo dõi sự kiện cho Windows (Vista) hoặc định dạng XML trình theo dõi dịch vụ.

4

Một lý do khác cho việc sử dụng TraceSources thay vì Log4Net được Tracing bản thân: Log4Net chỉ có thể được sử dụng để đăng nhập (tin nhắn) nhưng làm thế nào để theo dõi một đối tượng (nhiều thông tin cùng một lúc)? Tất nhiên Log4Net có rất nhiều Người nghe thực hiện, nhưng tôi có cần tất cả những thứ này không? Trong hầu hết các trường hợp thì không. Và nếu tôi cần một người nghe đặc biệt, nó không phải là khó thực hiện một của riêng tôi, phải không? Ví dụ tôi cần một người nghe để theo dõi vào một cơ sở dữ liệu (không chỉ các thông báo mà còn thông tin khác nhau {string's, int's, etc.} cùng một lúc).

Tôi có đúng không?

+0

Thực ra tôi tin rằng bạn (ít nhất là ở bên TraceSource) – Mark