如何将NLog用于DLL

时间:2011-03-11 13:19:15

标签: c# dll logging nlog

我正在尝试使用Nlog Refresh 1.0为类库项目实现一个简单的日志。 似乎nlog在从dll中实例化时不会创建日志文件。

还有其他方法吗?

我的配置文件如下所示:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="true">

    <targets>
      <target name="file" xsi:type="File" fileName="${basedir}/nlog.txt" />
        <target name="console" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="file" />
        <logger name="*" minlevel="Info" writeTo="console" />
    </rules>

</nlog>

我知道这个配置没有任何问题,因为它可以在exe项目中运行。

编辑: 只是为了澄清: 我无法访问使用我的dll作为插件的调用程序。调用程序实际上是outlook,它使用我的dll作为插件。我想保留一个只与我的dll相关的日志,与outlook本身无关。

3 个答案:

答案 0 :(得分:32)

你必须将nlog.config添加到使用dll的exe文件的位置!

编辑: 您不必修改exe文件只需将nlog.config放在同一目录中,如果没有选项我猜你必须从代码https://github.com/nlog/NLog/wiki/Configuration-API配置它

答案 1 :(得分:7)

NLog将从exe中查找包含DLL的配置文件。因此,每次要使用DLL时,都需要复制NLog的配置文件。

理论上,这是正确的设计模式,因为许多第三方应用程序可以以不同的方式使用您的DLL,并且希望将DLL的日志与其日志集中在一起。

在我的情况下(也许是你的),我们想确保100%使用我们自己的配置文件保存DLL的日志,以确保将所有致命错误报告给我们的SqlServer等。因此,我们不要不希望第三方应用程序设置自己的日志记录逻辑。

我们遇到了同样的问题,NLog(或Log4Net)无法找到配置文件,因此没有启动日志记录活动,也没有从NLog或Log4Net打印异常/错误消息。

唯一的选择是使用代码在DLL中配置NLog(或Log4Net)。 NLog为您提供配置API,以便您可以放弃配置文件。见NLog configuration API

在我的情况下,我的DLL中有一个名为“Utils”的静态类,它是从使用我的DLL的任何第三方类调用的(例如它们Utils.doSomething())。所以我在静态构造函数中配置NLog:

static Utils() // static constructor
{
    // Step 1. Create configuration object 
    var config = new LoggingConfiguration();

    // Step 2. Create targets and add them to the configuration 
    var consoleTarget = new ColoredConsoleTarget();
    config.AddTarget("console", consoleTarget);

    var fileTarget = new FileTarget();
    config.AddTarget("file", fileTarget);

    // Step 3. Set target properties 
    consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}";
    fileTarget.FileName = @"C:\global-logs\logs.txt";
    fileTarget.Layout = "${message}";
    // Step 4. Define rules
    var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget);
    config.LoggingRules.Add(rule1);

    var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
    config.LoggingRules.Add(rule2);

    // Step 5. Activate the configuration
    LogManager.Configuration = config; 
}

答案 2 :(得分:2)

您应该将上面的配置文件放在web应用程序的web.config中或Windows应用程序的app.config中。这不是自动完成的,如果您的类库有app.config,那么当另一个应用程序调用类库时,无论如何都不会使用它。