2009-08-27 3 views
46

Đây là cấu hình của tôi cho log4net:Nhận log4net log file trong C#

<log4net> 
    <appender name="MyLogger" type="log4net.Appender.RollingFileAppender"> 
     <file value="MyLog.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="20"/> 
     <maximumFileSize value="1000KB"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%p,%m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="MyLogger" /> 
    </root> 
</log4net> 

Trong C# Tôi đang cố gắng để có được tên của tập tin log (đó là MyLog.log). Tôi googled và cố gắng nhiều điều nhưng không làm như vậy. Bất kỳ giúp đỡ?

Cảm ơn!

+0

Bạn có nói rằng bạn đang cố gắng để phân tích các tập tin cấu hình log4net trong một nỗ lực để có được những tên tệp bạn đang đăng nhập? Câu hỏi không rõ ràng. Chính xác thì bạn đang cố gắng làm gì, và vấn đề là gì? –

+0

Tôi đang cố gắng lấy phần này của cấu hình "", tôi đang cố di chuyển khỏi phân tích cú pháp bản thân nó (hiện tại), vì tôi nghĩ rằng asp4net có thể đã được tạo theo cách đó, tôi không thể tìm thấy nó. Nếu không, tôi sẽ phải tự phân tích cú pháp. – Carlo

Trả lời

78

Giải pháp khá dễ dàng trong hoàn cảnh của bạn; chỉ sử dụng mã này:

var rootAppender = ((Hierarchy)LogManager.GetRepository()) 
             .Root.Appenders.OfType<FileAppender>() 
             .FirstOrDefault(); 

string filename = rootAppender != null ? rootAppender.File : string.Empty; 
+0

Làm việc như một sự quyến rũ. Cảm ơn! – Carlo

+1

tôi cũng sử dụng như vậy. nhưng (FileAppender) ((log4net.Repository.Hierarchy.Hierarchy) LogManager.GetRepository()) Root doesnt có một mảng các Appender như được chỉ định trong giải pháp trên. Bất kỳ ý tưởng ??? – Sandeep

+0

user762730 bạn đã định cấu hình đăng nhập chưa? Không có ứng dụng nào nếu không ... – Yakeen

-1

Tôi không tìm thấy mã ở trên hoạt động. này làm việc cho tôi

var filename= ((log4net.Appender.FileAppender)(((log4net.Appender.IAppender[])((((((log4net.Repository.Hierarchy.Hierarchy)((((log4net.Core.LoggerWrapperImpl)(log)).Logger).Repository)).Root).Hierarchy.Root).Appenders).SyncRoot))[0])).File

+12

Chà ... mã đó trông rất phức tạp!Tôi ngay lập tức không tin tưởng mã như thế. –

+0

nơi 'nhật ký' này xuất phát từ phần này' (log4net.Core.LoggerWrapperImpl) (nhật ký) '? –

0

Nếu cấu hình của bạn không có một < gốc > nút sau đó giải pháp trên sẽ không làm việc cho bạn. Đọc tiếp.

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="${LOCALAPPDATA}\Anonymous.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="2000KB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="AnonymousLog"> 
    <level value="All" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </logger> 
</log4net> 

này lấy ra các log file:

string path = path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 

The (hy vọng) chống tai nạn phiên bản:

string path = null; 
if (LogManager.GetCurrentLoggers().Length > 0 && LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders().Length > 0) 
{ 
    path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 
} 

Cuối cùng, nếu bạn gặp khó khăn với log4net thêm video này vào < appSettings bạn > phần:

<add key="log4net.Internal.Debug" value="true"/> 
6

Vì tôi đã có một trình ghi nhật ký được xác định trong lớp tôi vừa sử dụng nó. Một điều cần lưu ý là có thể có nhiều hơn một appender và thường là người đầu tiên là console (không có file). Đây là giải pháp của tôi cho giá trị của nó.

using log4net; 
using log4net.Appender; 
using log4net.Repository; 

namespace MyNameSpace { 
public class MyClass { 

    private static readonly ILog logger = LogManager.GetLogger(typeof(MyClass)); 

    public String GetLogFileName() { 

     String filename = null; 

     IAppender[] appenders = logger.Logger.Repository.GetAppenders(); 
     // Check each appender this logger has 
     foreach (IAppender appender in appenders) { 
      Type t = appender.GetType(); 
      // Get the file name from the first FileAppender found and return 
      if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) { 
       filename = ((FileAppender)appender).File; 
       break; 
      } 
     } 
     return filename; 
    } 
} 

}

+0

Tôi thích điều này với một số điều chỉnh để tìm kiếm một số appender/logger cụ thể. –

0
 String filename = null; 

     Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; 
     Logger logger = hierarchy.Root; 

     IAppender[] appenders = logger.Repository.GetAppenders(); 

     // Check each appender this logger has 
     foreach (IAppender appender in appenders) 
     { 
      Type t = appender.GetType(); 
      // Get the file name from the first FileAppender found and return 
      if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) 
      { 
       filename = ((FileAppender)appender).File; 
       break; 
      } 
     } 

     System.Diagnostics.Process.Start(filename); //for example, open file in notepad 
12

Khi có nhiều appenders tập tin, bạn có thể muốn có được chúng bằng tên. Ngoài ra để đảm bảo để có được appender thậm chí nếu nó không được tham chiếu bởi nút gốc, đoạn code sau sẽ giúp:

public static string GetLogFileName(string name) 
{ 
    var rootAppender = LogManager.GetRepository() 
            .GetAppenders() 
            .OfType<FileAppender>() 
            .FirstOrDefault(fa => fa.Name == name); 

    return rootAppender != null ? rootAppender.File : string.Empty; 
} 
+1

** Điều này cần nhiều phiếu bầu hơn! ** Ngắn, thanh lịch và cho phép chọn một trong các ứng cử viên theo tên. Hầu hết các giải pháp khác tôi thấy ở đây chỉ cần chọn appender 1 mà không phải lúc nào cũng đúng. Theo câu hỏi bạn sẽ sử dụng 'GetLogFileName (" MyLogger ")' – Matt

+2

Điều duy nhất tôi muốn thay đổi là sử dụng 'rootAppender? .File ?? string.Empty' (toán tử C# 6 ** ['Elvis'] (https://csharp.today/c-6-features-null-conditional-and-and-null-coalescing-operators/)) ** thay vào đó của 'rootAppender! = null? rootAppender.File: string.Empty', ngắn hơn. – Matt