2009-09-11 85 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