在运行时仅记录到特定目标

时间:2014-01-14 19:08:31

标签: c# nlog

我正在使用NLog和两个目标:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <targets async="true">
    <target name="logfile" xsi:type="File" fileName="my.log"/>
    <target name="console" xsi:type="Console"/>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logfile"/>
    <logger name="*" minlevel="Info" writeTo="console"/>
  </rules>
</nlog>

是否可以仅将消息记录到“logfile”目标,而不将消息写入“console”目标?

修改

澄清一下:我想在运行时将来自同一类的消息定向到不同的记录器(无需更改XML)。类似的东西:

class Program
{
    static Logger _logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        // Note - _logger.InfoToTarget() does not really exist
        _logger.InfoToTarget("logfile", "This is my very detailed message, possibly with object dumps");
        _logger.InfoToTarget("console", "Short message");
    }
}

我知道这会将我的代码与NLlog.config文件结合在一起。

3 个答案:

答案 0 :(得分:2)

实现您正在寻找的功能的一种方法是命名您的记录器

_logger = LogManager.GetLogger("MyConsoleLogger")
_logger.Info("This will log to the console...");
_logger = LogManager.GetLogger("MyFileLogger")
_logger.Trace("This will log to a file...");

而不是使用

LogManager.GetCurrentClassLogger().              

然后,您可以在配置文件中列出规则

<rules>
<logger name="MyFileLogger" minlevel="Trace" writeTo="logfile"/>
<logger name="MyConsoleLogger" minlevel="Info" writeTo="console"/>
</rules>

到目前为止,这不是最好看的解决方案,但它确实为您提供了所需的功能。

答案 1 :(得分:0)

有几种方法可以做到这一点,正确的方法取决于您的情况。

请注意,您通常希望避免让您的应用对日志记录的内部工作了解太多。如果可能的话,最好配置nlog来决定应该记录的位置。

是否存在不应记录到控制台的特定命名空间?这很容易配置。此外,您可以使用“何时”过滤器(https://github.com/nlog/nlog/wiki/When-filter)或条件(https://github.com/nlog/nlog/wiki/Conditions

最好有多个记录器实例,因此您可以调用适合每种情况的记录器(每个类的记录器)(Why do loggers recommend using a logger per class?)。

答案 2 :(得分:-1)

当然,我假设您在发布时意味着您不再希望登录控制台。您可以通过删除或注释掉写入控制台目标的侦听器来轻松完成此操作。现在它只会写入日志文件目标。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets async="true">
       <target name="logfile" xsi:type="File" fileName="my.log"/>
       <target name="console" xsi:type="Console"/>
    </targets>

    <rules>
       <logger name="*" minlevel="Trace" writeTo="logfile"/>
       <!--<logger name="*" minlevel="Info" writeTo="console"/>-->
    </rules>
</nlog>

写入控制台的规则现已停用,但日志文件处于活动状态。如果这是在发布期间,您可能希望更改规则以不将跟踪日志记录作为日志文件的最低级别进行处理,因为它会因过多的IO而降低应用程序的速度。我过去曾问过这个问题,最佳做法似乎是通过XML配置文件来完成。 (Logging in Release Build of Application (C#)