2009-09-11 97 views
1

我已經編寫了一個.NET DLL,它是使用COM interop從另一個應用程序中調用的。我想使用log4net,但我需要在運行時從其他應用程序指定日誌文件的位置。log4net - 通過COM interop調用一個dll的日誌記錄

我一直以最簡單的方式爲WinForms項目使用log4net,但由於DLL項目沒有app.config,我的調用應用程序也沒有(甚至不是.NET) ,我已經試過了解一下log4net是如何工作的,並試圖在不使用.config文件的情況下設置它。

我它得到它編譯和排序都符合我的log4net的微小的認識階段,但它並沒有寫入日誌文件。

這裏是我到目前爲止,任何人都可以指出我的明顯的錯誤/誤解,或者告訴我,從我的dll記錄的更好的辦法?

private log4net.Core.ILogger _ilogger; 
    private ILog _logger; 

    public void Initialize(String LogFileName) 
    { 
     log4net.Repository.ILoggerRepository Repo = null; 
     try { 
      Repo = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly().FullName); 

     } catch (log4net.Core.LogException) { 
      //ignore, domain not yet created 
     } 

     if (Repo == null) { 
      Repo = log4net.LogManager.CreateRepository(Assembly.GetExecutingAssembly().FullName); 

      log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender(); 
      appender.Layout = new log4net.Layout.PatternLayout("%d - %m%n"); 
      appender.File = LogFileName; 
      appender.MaxSizeRollBackups = 10; 
      appender.MaximumFileSize = "100MB"; 
      appender.AppendToFile = true; 
      appender.Threshold = log4net.Core.Level.Debug; //NEW: set level to Debug 
      appender.ActivateOptions(); 

      Repo.Threshold = log4net.Core.Level.Debug; //NEW: set level to Debug 

      log4net.Config.BasicConfigurator.Configure(Repo, appender); 
     } 

     // This doesn't seem to create the interface I need for logging 
     _ilogger = Repo.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName); 

     // This doesn't seem to write to the log file for some reason. 
     _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName); 
     _logger.Debug("Application started"); 
    } 

謝謝!

回答

3

編輯 - 更新。重讀這個問題。它看起來像你只需要call the overloaded version of this(傳遞一個配置文件的詳細信息) - 你基本上只想配置從COM DLL內的日誌記錄?

開玩笑我google'd log4com和found this。我沒有使用它,但它可能值得 看!

+0

多麼可怕的想法! :)我的調用應用程序確實有它自己的日誌記錄,並且這個DLL不僅僅用於日誌記錄,我不想將詳細信息傳遞迴父應用程序以進行日誌記錄,這是COM流量的保存,我讀過的流量很慢,而且在出現某種故障並且父應用程序無法記錄的情況下可以進行一些活動。我對COM的世界有點新鮮......我想這可能不是祕密。如果我無法得到這個工作,那麼我會讓我的DLL報告絕對一切的調用應用程序,然後記錄在那裏。 – 2009-09-11 11:39:18

+0

我重讀了你的問題,我想我現在得到你要問的東西。 – RichardOD 2009-09-11 11:42:07

+0

有沒有辦法使用這種方法更改日誌文件的目標?我可能會感到困惑。 – 2009-09-11 13:03:36

1

儘量明確設置的級別進行調試你的記錄儀和追加程序兩者。

+0

嗯...它仍然沒有寫任何東西到日誌文件 – 2009-09-11 12:07:13

2

我想答案是我並不需要新的存儲庫都沒有。我只是把事情搞得太複雜了。這個抽取的版本似乎工作正常:

public void Initialize(String LogFileName) 
    { 
     log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender(); 
     appender.Layout = new log4net.Layout.PatternLayout("%d - %m%n"); 
     appender.File = LogFileName; 
     appender.MaxSizeRollBackups = 10; 
     appender.MaximumFileSize = "100MB"; 
     appender.AppendToFile = true; 
     appender.Threshold = log4net.Core.Level.Debug; 
     appender.ActivateOptions(); 
     log4net.Config.BasicConfigurator.Configure(appender); 

     _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName); 
     _logger.Debug("Application started"); 
    } 
+0

感謝你 - 正是我需要的...... – Matt 2009-10-06 09:59:43