【问题标题】:log4net - logging for a dll called via COM interoplog4net - 记录通过 COM 互操作调用的 dll
【发布时间】:2009-09-11 11:27:02
【问题描述】:

我编写了一个 .NET DLL,它是从另一个使用 COM 互操作的应用程序调用的。我想使用 log4net,但我需要在运行时从其他应用程序指定日志文件的位置。

我一直以最简单的方式将 log4net 用于 WinForms 项目,但由于 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");
    }

谢谢!

【问题讨论】:

    标签: c# .net dll log4net com-interop


    【解决方案1】:

    编辑-更新。重读问题。看起来您只需要call the overloaded version of this(传递配置文件的详细信息)-您基本上只是想从 COM DLL 中配置日志记录?

    开玩笑地,我用谷歌搜索了 log4com 和 found this。我没用过,但它可能值得 看!

    【讨论】:

    • 多么可怕的想法! :) 我的调用应用程序确实有自己的日志记录,而且这个 DLL 不只是用于日志记录,我不将详细信息传递回父应用程序进行日志记录的想法是节省 COM 流量,我读过它很慢,而且万一出现某种故障并且父应用程序无法记录它,则有点弹性。我对 COM 的世界有点陌生……我想这可能不是必需的。如果我不能让它工作,那么我会让我的 DLL 将所有内容报告给调用应用程序,然后在那里记录。
    • 我重读了你的问题,我想我明白你现在要问的了。
    • 有没有办法用这种方法改变日志文件的目的地?我可能会感到困惑。
    • 我通过查看 XmlConfigurator.Configure 和 BasicConfigurator.Configure 的不同重载找到了我的最终答案,所以我会接受这个,因为你把我引向了正确的方向。谢谢!
    • 很好,你已经把它整理好了——看起来你在我看到你之前的评论之前已经解决了这个问题。
    【解决方案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");
        }
    

    【讨论】:

      【解决方案3】:

      尝试在 Logger 和 Appender 上将级别显式设置为 DEBUG。

      【讨论】:

      • 嗯...它似乎仍然没有向日志文件写入任何内容
      猜你喜欢
      • 2017-04-28
      • 2022-01-22
      • 2012-07-19
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多