如何使用NLog的DLL

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

还有其他方法吗?

我的配置文件如下所示:

          

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

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

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

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

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

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

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

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

唯一的选择是使用代码在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; } 

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