2011-03-11 108 views
12

我想实现一个简单的日志使用Nlog Refresh 1.0的类库项目。 看来nlog不会在dll内实例化时创建日志文件。如何使用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作为一个插件调用程序的访问权限。调用程序实际上是使用我的dll作为插件的outlook。我想保留一个只与我的dll相关的日志,并且与outlook本身无关。

回答

32

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

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

+2

我已经编辑我的问题,我要它调用我的DLL exe文件不能访问,我宁愿希望从withing我的DLL配置n日志。 – Oysio 2011-03-11 13:35:39

+2

这应该被标记为“答案”,因为@Petoj已准确指出使用配置API作为解决方案。我的Upvote! – dotnetguy 2012-10-16 04:48:00

2

你应该将上面的配置文件部分放在Web应用程序的web.config中或Windows应用程序的app.config中。这不是自动完成的,如果你的类库有一个app.config,当这个类库被另一个应用程序调用时,这是不管用的。

+3

nlog确实支持nlog.config作为独立,因此您不必将其添加到web.config/app.config中 – Peter 2011-03-11 13:24:31

5

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

从理论上讲,这是因为许多第三方应用程序可以使用您的DLL以不同的方式,并希望能有您的DLL的日志与他们的日志集中正确的设计模式。

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

我们有同样的问题,即NLOG(或log4net的)找不到配置文件,因此没有记录活动已经开始,从NLOG或log4net的印刷也不例外/错误消息。

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

就我而言,我有一个名为“utils的”静态类在我的DLL,这是从使用我的DLL任何第三方类调用(如他们做Utils.doSomething())。所以我配置NLOG在静态构造函数:

static void 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; 
} 
+0

您可以更多解释一下吗? – 2016-05-30 10:35:34

+0

已编辑。这对你有帮助吗? – TheWalkingPanda 2016-05-30 11:01:23