NLog - 仅在调试时记录

Sti*_*ijn 4 nlog

采用这个简单的NLog示例配置:

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

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

如何将其设置为仅在调试时记录,而不是在生产中运行时?

编辑:

使事情变得更具挑战性:我的NLog配置文件是集中的,在所有应用程序/服务/站点上共享.所以我想避免改变每个项目,只需修改配置文件.

jwe*_*ich 14

一个简单的解决方案是拥有一个NLog.config文件(其内容将被覆盖 - 您稍后会看到),以及每个解决方案配置/环境中的一个NLog配置文件(比如说,NLog.debug.configNLog.release.config).例如:

所有需要的NLog配置文件

然后配置a Pre-build event command line复制与当前活动配置对应的配置文件:

预构建事件命令行

您应该粘贴的完整命令:

del "$(ProjectDir)NLog.config"

if "$(ConfigurationName)"=="Debug" (
  copy "$(ProjectDir)NLog.debug.config" "$(ProjectDir)NLog.config"
) else (
  copy "$(ProjectDir)NLog.release.config" "$(ProjectDir)NLog.config"
)
Run Code Online (Sandbox Code Playgroud)

如果DEBUG是当前活动配置/环境,则将复制NLog.debug.configNLog.config(有效地覆盖它),否则它将复制NLog.release.config.

较短的版本看起来像这样(注意文件命名差异):

del "$(ProjectDir)NLog.config"
copy "$(ProjectDir)NLog.$(ConfigurationName).config" "$(ProjectDir)NLog.config"
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的事情是,在编译期间,编译器将抛出有关与NLog相关的重复声明的各种警告.原因是编译器将为NLog找到2个(或更多)不同的配置文件,它们的声明将发生冲突.为了解决这个问题,您必须更改Properties每个额外的 NLog配置文件,以使构建操作不复制它们.例如:

NLog.debug.config属性

不要重复自己

最后,您可能不希望复制公共/共享目标|规则,以避免在多个文件中更改它们.为此,您可以将这些公共/共享部分移动到另一个文件并使用<include />.

  • @Davatar,使用 Post-build 事件的缺点是在发布项目时不起作用。如果部署得到解决,我更喜欢你的方法。有任何想法吗? (2认同)

nel*_*eus 7

我在这看到三种解决方案.

1)使用配置文件及其转换.目前,Web应用程序支持转换(我在谈论VS2012).对于桌面应用,您需要安装其他扩展程序.

2)使用两个目标,一个用于开发(我假设在您的情况下调试=开发),第二个用于生产.在运行时,您需要通过删除另一个来保留实际.

UPDATE

3)如果您不想更改项目,可以根据自定义布局渲染器将自定义条件应用于记录器(请参阅如何制作自定义布局渲染器的示例).在您的情况下,布局渲染器应返回执行程序集的当前构建配置(调试或释放).因此,条件将如下所示:

<rules>
    <logger name="*" writeTo="logfile">
        <filters>
            <when condition="equals('${buildConfiguration}','Release')" action="Ignore" />
        </filters>
    </logger>
</rules>
Run Code Online (Sandbox Code Playgroud)

其中$ {buildConfiguration}是您的自定义布局渲染器.

PS并且别忘了把这个

<extensions>
    <add assembly="NameOfMyAssemblyThatContainsMyLayoutRenderer" />
</extensions>
Run Code Online (Sandbox Code Playgroud)

到nlog.config,以便NLog知道布局渲染器.

  • 对于这个特定的实验,自定义布局渲染器看起来如何。我不明白 NLog 文档。如果您也可以将其添加到您的答案中,则+1。 (2认同)