如何将NLog用于DLL

Oys*_*sio 14 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ter 32

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

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

  • 我已经编辑了我的问题,我无法访问调用我的dll的exe,我宁愿想用我的dll来配置nlog. (2认同)
  • 这应该标记为"答案",因为@Petoj已准确指出使用配置API作为解决方案.我的Upvote! (2认同)

The*_*nda 7

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

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

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

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

唯一的选择是使用代码在DLL中配置NLog(或Log4Net).NLog为您提供配置API,以便您可以放弃配置文件.请参阅NLog配置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; 
}
Run Code Online (Sandbox Code Playgroud)