1

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

对于 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");
    }

谢谢!

4

3 回答 3

3

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

开玩笑地说,我用 google'd log4com找到了这个。我没用过,但可能值得一看!

于 2009-09-11T11:31:47.280 回答
3

我认为答案是我根本不需要新的存储库。我只是把事情弄得太复杂了。这个抽取的版本似乎工作正常:

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");
    }
于 2009-09-11T13:13:09.953 回答
1

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

于 2009-09-11T11:47:24.777 回答