我正在尝试使用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本身无关。
答案 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,那么当另一个应用程序调用类库时,无论如何都不会使用它。