我试过了
<target name="txtFile"
xsi:type="File"
fileName="${date:format=yyyy-MM-dd HH-mm-ss}.txt"
layout="${longdate} ${level} ${message}"/>
但它每分钟都会创建一个新文件。
我意识到有
${processinfo:property=StartTime}
,但是我无法格式化它。我试过了:${processinfo:property=StartTime:format=yyyy-MM-dd HH-mm-ss}
但这不起作用
最佳答案
使用缓存的布局渲染器
对于不需要代码的解决方案,请使用Cached Layout Renderer:
<target name="txtFile"
xsi:type="File"
fileName="${cached:cached=true:inner=${date:format=yyyy-MM-dd HH-mm-ss}}.txt"
layout="${longdate} ${level} ${message}"/>
使用自定义布局渲染器
上面的解决方案实际上并未使用流程开始时间。而是使用第一条日志消息路由到该目标的时间(例如,第一条日志到文件)。例如,如果您希望日志文件驻留在以进程开始时间命名的目录中,则可能会出现问题。
在这种情况下,可以使用自定义布局渲染器。将以下类添加到您的项目中:
namespace NLog.LayoutRenderers
{
using NLog.Config;
[LayoutRenderer("processstarttime")]
public class ProcessStartTimeLayoutRenderer : DateLayoutRenderer
{
private Process process;
protected override void InitializeLayoutRenderer()
{
base.InitializeLayoutRenderer();
this.process = Process.GetCurrentProcess();
}
protected override void CloseLayoutRenderer()
{
if (this.process != null)
{
this.process.Close();
this.process = null;
}
base.CloseLayoutRenderer();
}
protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent)
{
if (this.process != null)
{
builder.Append(this.process.StartTime.ToString(this.Format, this.Culture));
}
}
}
}
并按如下所示使用它:
<target name="txtFile"
xsi:type="File"
fileName="${processstarttime:format=yyyy-MM-dd HH-mm-ss}.txt"
layout="${longdate} ${level} ${message}"/>
该解决方案基于Process Info Layout Renderer。