2009-08-20 91 views
2

我將爲每次在WCF服務中執行特定過程時寫出單獨的日誌。我有一個使用log4net的整個應用程序的標準日誌。我是否應該爲特定的進程添加appender和過濾器,然後將其刪除?該過程處理處理上傳的文件。任何其他的想法?log4net ....單獨的日誌文件

回答

1

I'ved做類似的東西之前,我們使用的代碼是這樣的:

奧利

class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.BasicConfigurator.Configure(); 

     var file = Path.Combine(Directory.GetCurrentDirectory(), Guid.NewGuid() + ".log"); 
     var log = InitialiseLogToFile(file); 
     log.Info("Made it here!"); 
     log.Error("Made it here!"); 

     var file2 = Path.Combine(Directory.GetCurrentDirectory(), Guid.NewGuid() + ".log"); 
     var log2 = InitialiseLogToFile(file2); 
     log2.Info("Made it here!"); 
     log2.Error("Made it here!"); 
    } 

    public static ILog InitialiseLogToFile(string file) 
    { 
     LogManager.ResetConfiguration(); 
     var hierarchy = (Hierarchy)LogManager.GetLoggerRepository(); 

     var patternLayout = new PatternLayout(); 
     patternLayout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n"; 
     patternLayout.ActivateOptions(); 

     var appender = new FileAppender {File = file, AppendToFile = true, Layout = patternLayout}; 
     appender.ActivateOptions(); 

     var logger = (Logger)hierarchy.GetLogger(file); 
     logger.AddAppender(appender); 
     hierarchy.Configured = true; 

     return LogManager.GetLogger(file); 
    } 
} 
+0

我有問題,這可能不是我的問題。上傳後我正在運行一個文件,並且我希望每個文件處理都有一個日誌文件。如果添加appender並且不使用過濾器,我會將所有日誌消息添加到該文件中,而不是僅處理該文件的消息。 – CSharpAtl 2009-08-21 13:36:49

+0

這就是爲什麼我們稱爲'ResetConfiguration'... – AwkwardCoder 2009-08-21 13:40:53

+0

但是這意味着現在我只有1 appender,如果應用程序中有其他東西需要記錄,他們將記錄到新文件中...我只需要從此進程登錄到新文件以及常規日誌文件中的所有其他日誌記錄中即可。 – CSharpAtl 2009-08-21 13:46:49

1

好了怎麼樣創建ILog的接口也實現IDisposable的自定義實現 - 你當它被創建時添加appender並且在它被丟棄時將它移除...

例如。

class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.BasicConfigurator.Configure(); 

     var file = Path.Combine(Directory.GetCurrentDirectory(), Guid.NewGuid() + ".log"); 
     using (var log = new CustomFileLogger(file)) 
     { 
      // Process file... 
      log.Info("file: Made it here!"); 
      log.Error("file: Made it here!"); 
     } 

     var file2 = Path.Combine(Directory.GetCurrentDirectory(), Guid.NewGuid() + ".log"); 
     using (var log = new CustomFileLogger(file2)) 
     { 
      // Process file... 
      log.Info("file2: Made it here!"); 
      log.Error("file2: Made it here!"); 
     } 
    } 
} 

public sealed class CustomFileLogger : ILog, IDisposable 
{ 
    private ILog _log; 
    private FileAppender _appender; 
    private string _file; 

    public CustomFileLogger(string file) 
    { 
     _file = file; 

     var hierarchy = (Hierarchy)LogManager.GetRepository(); 
     hierarchy.Configured = false; 

     var patternLayout = new PatternLayout(); 
     patternLayout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n"; 
     patternLayout.ActivateOptions(); 

     var appender = new FileAppender { File = file, AppendToFile = true, Layout = patternLayout }; 
     appender.ActivateOptions(); 

     var logger = (Logger)hierarchy.GetLogger(file); 
     logger.AddAppender(appender); 

     hierarchy.Configured = true; 
     _log = LogManager.GetLogger(file); 
    } 

    public ILogger Logger 
    { 
     get { return _log.Logger; } 
    } 

    public void Dispose() 
    { 
     var hierarchy = (Hierarchy)LogManager.GetRepository(); 
     hierarchy.Configured = false; 

     var logger = (Logger)hierarchy.GetLogger(_file); 
     logger.RemoveAppender(_appender); 

     hierarchy.Configured = false; 


     _appender = null; 
     _log = null; 
     _file = null; 
    } 

    public void Debug(object message) 
    { 
     _log.Debug(message); 
    } 

    public void Debug(object message, Exception exception) 
    { 
     _log.Debug(message, exception); 
    } 

    public void DebugFormat(string format, params object[] args) 
    { 
     _log.DebugFormat(format, args); 
    } 

    public void DebugFormat(string format, object arg0) 
    { 
     _log.DebugFormat(format, arg0); 
    } 

    public void DebugFormat(string format, object arg0, object arg1) 
    { 
     _log.DebugFormat(format, arg0, arg1); 
    } 

    public void DebugFormat(string format, object arg0, object arg1, object arg2) 
    { 
     _log.DebugFormat(format, arg0, arg1, arg2); 
    } 

    public void DebugFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     _log.DebugFormat(provider, format, args); 
    } 

    public void Info(object message) 
    { 
     _log.Info(message); 
    } 

    public void Info(object message, Exception exception) 
    { 
     _log.Info(message, exception); 
    } 

    public void InfoFormat(string format, params object[] args) 
    { 
     _log.InfoFormat(format, args); 
    } 

    public void InfoFormat(string format, object arg0) 
    { 
     _log.InfoFormat(format, arg0); 
    } 

    public void InfoFormat(string format, object arg0, object arg1) 
    { 
     _log.InfoFormat(format, arg0, arg1); 
    } 

    public void InfoFormat(string format, object arg0, object arg1, object arg2) 
    { 
     _log.InfoFormat(format, arg0, arg1, arg2); 
    } 

    public void InfoFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     _log.InfoFormat(provider, format, args); 
    } 

    public void Warn(object message) 
    { 
     _log.Warn(message); 
    } 

    public void Warn(object message, Exception exception) 
    { 
     _log.Warn(message, exception); 
    } 

    public void WarnFormat(string format, params object[] args) 
    { 
     _log.WarnFormat(format, args); 
    } 

    public void WarnFormat(string format, object arg0) 
    { 
     _log.WarnFormat(format, arg0); 
    } 

    public void WarnFormat(string format, object arg0, object arg1) 
    { 
     _log.WarnFormat(format, arg0, arg1); 
    } 

    public void WarnFormat(string format, object arg0, object arg1, object arg2) 
    { 
     _log.WarnFormat(format, arg0, arg1, arg2); 
    } 

    public void WarnFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     _log.WarnFormat(provider, format, args); 
    } 

    public void Error(object message) 
    { 
     _log.Error(message); 
    } 

    public void Error(object message, Exception exception) 
    { 
     _log.Error(message, exception); 
    } 

    public void ErrorFormat(string format, params object[] args) 
    { 
     _log.ErrorFormat(format, args); 
    } 

    public void ErrorFormat(string format, object arg0) 
    { 
     _log.ErrorFormat(format, arg0); 
    } 

    public void ErrorFormat(string format, object arg0, object arg1) 
    { 
     _log.ErrorFormat(format, arg0, arg1); 
    } 

    public void ErrorFormat(string format, object arg0, object arg1, object arg2) 
    { 
     _log.ErrorFormat(format, arg0, arg1, arg2); 
    } 

    public void ErrorFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     _log.ErrorFormat(provider, format, args); 
    } 

    public void Fatal(object message) 
    { 
     _log.Fatal(message); 
    } 

    public void Fatal(object message, Exception exception) 
    { 
     _log.Fatal(message, exception); 
    } 

    public void FatalFormat(string format, params object[] args) 
    { 
     _log.FatalFormat(format, args); 
    } 

    public void FatalFormat(string format, object arg0) 
    { 
     _log.FatalFormat(format, arg0); 
    } 

    public void FatalFormat(string format, object arg0, object arg1) 
    { 
     _log.FatalFormat(format, arg0, arg1); 
    } 

    public void FatalFormat(string format, object arg0, object arg1, object arg2) 
    { 
     _log.FatalFormat(format, arg0, arg1, arg2); 
    } 

    public void FatalFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     _log.FatalFormat(provider, format, args); 
    } 

    public bool IsDebugEnabled 
    { 
     get { return _log.IsDebugEnabled; } 
    } 

    public bool IsInfoEnabled 
    { 
     get { return _log.IsInfoEnabled; } 
    } 

    public bool IsWarnEnabled 
    { 
     get { return _log.IsWarnEnabled; } 
    } 

    public bool IsErrorEnabled 
    { 
     get { return _log.IsErrorEnabled; } 
    } 

    public bool IsFatalEnabled 
    { 
     get { return _log.IsFatalEnabled; } 
    } 
} 
1

你可以很容易地做到這一點,但它意味着將自己綁定到特定的實現而不是接口。例如:

log4net.ILog log = log4net.LogManager.GetLogger(loggerName); 
log4net.Repository.Hierarchy.Logger logImpl = log.Logger as log4net.Repository.Hierarchy.Logger; 
if (logImpl != null) 
    logImpl.AddAppender(uploadLogAppender); 
else { 
    // unexpected logger type - handle this case somehow 
} 
ProcessUpload(); // does logging 
if (logImpl != null) 
    logImpl.RemoveAppender(uploadLogAppender); 

由於附加器是目前唯一同時ProcessUpload運行,這應該給你你需要的效果。 uploadLogAppender只是一個FileAppender實例,其文件名由您決定,比如說每上傳一次。