4

我想将一个独立的字符串(如水平线或分隔符)写入日志文件。

如果我使用

string delimiter = "------------------------------------------------";
_logger.Info(delimiter);

然后在日志文件中我得到:

2013-01-08 15:58:54.4008 INFO ------------------------------------------------

我不想要行首的额外信息。

有没有办法用 NLog 编写这样的分隔符?我检查了 NLog wiki,但没有找到任何东西。

4

1 回答 1

3

在此处查看我对类似问题的回答:

Nlog - 为日志文件生成标题部分

总而言之,我建议定义另一个日志记录目标。如果要记录到文件,请定义第二个文件目标,指向同一个文件,但布局不同。定义布局,使其具有您想要的格式。您可以将布局定义为硬编码为所需的标头值(在您的情况下为“---------------”),或者您可以定义布局以仅记录消息和然后你可以将布局传递给它。

这是可能工作的最短的事情。请注意,我从上面链接的答案中剪切并粘贴,并针对您的情况稍作修改。我没有测试它。

定义布局:

<variable name="HeaderLayout" value="${message}"/>
<variable name="FileLayout" value="${longdate} | ${logger} | ${level} | ${message}" />

使用布局定义目标:

<target name="fileHeader" xsi:type="File" fileName="xxx.log" layout="${HeaderLayout}" />
<target name="file" xsi:type="File" fileName="xxx.log" layout="${InfoLayout}" />

定义规则/记录器:

<rules>
  <logger name="headerlogger" minlevel="Trace" writeTo="fileHeader" final="true" />
  <logger name="*" minlevel="Trace" writeTo="file" />
</rules>

使用记录器:

public class MyClass
{
  private static Logger logger = LogManager.GetCurrentClassLogger();
  private static Logger headerLogger = LogManager.GetLogger("headerlogger");

  public void DoSomething()
  {
    headerLogger.Info("---------------------");
    logger.Info("Inside DoSomething");
    headerLogger.Info("---------------------");
  }
}

或者,您可以定义布局,使其具有标题定义:

<variable name="HeaderLayout" value="-----------------------------"/>
<variable name="FileLayout" value="${longdate} | ${logger} | ${level} | ${message}" />

然后你会像这样使用它:

Logger headerLogger = LogManager.GetLogger("headerlogger"); //Assuming same rules/loggers definition as above.

headerLogger.Info("It doesn't matter what you put here because the layout has the header message hardcoded");

您可以编写一个辅助函数,这样您就不必显式处理标头记录器:

public void WriteHeader()
{
  LogManager.GetLogger("headerlogger").Info("This string does not matter");
}

我认为这应该让您深入了解如何完成您正在尝试做的事情。

希望这可以帮助!

祝你好运!

于 2013-01-08T15:02:19.653 回答