在此处查看我对类似问题的回答:
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");
}
我认为这应该让您深入了解如何完成您正在尝试做的事情。
希望这可以帮助!
祝你好运!