我正在使用NLog进行一些日志记录,我遇到了归档和文件名的问题.
我正在代码中创建日志记录配置(我正在编写一个包装器来公开一些特定的功能),并且我已经FileTarget使用这些选项创建了对象:
this._fileTarget.FileName = "${date:format=yyyy-MM-dd hh.mm.ss}.log";
this._fileTarget.ArchiveAboveSize = Math.Pow(1024, 2) * 5; //5MB
this._fileTarget.ArchiveNumbering = ArchiveNumberingMode.Date;
this._fileTarget.ArchiveEvery = FileArchivePeriod.Day;
this._fileTarget.ArchiveDateFormat = "yyyy-MM-dd hh.mm.ss";
Run Code Online (Sandbox Code Playgroud)
我不确定为什么NLog会这样做,但是文件名布局会每秒创建一个新的日志文件,而不是仅仅使用文件名,直到存档期间结束.
我将缓存的目标包装器添加到文件名中:
this._fileTarget.FileName = "${cached:cached=true:inner=${date:format=yyyy-MM-dd hh.mm.ss}.log}";
Run Code Online (Sandbox Code Playgroud)
但是所有购买的东西都是一个现在永远不会改变的文件名,在归档时看起来像这样
2014-12-03 12.00.00.2014-12-03 12.00.00.log
2014-12-03 12.00.00.2014-12-03 12.10.00.log
etc...
Run Code Online (Sandbox Code Playgroud)
是否可以告诉NLog只根据文件大小和日期归档文件,并忽略归档编号和日期格式?我正在尝试生成日志文件,其名称是创建时间的时间戳,其中新文件仅在特定大小或每天创建.
编辑: 这是我想要实现的目标:
在申请开始
"yyyy-MM-dd hh.mm.ss".txt使用当前时间戳创建具有文件名的日志文件(示例 - >"2014-04-29 11:11:11.txt")离开我的Log文件夹看起来像这样:
Logs
|
|> 2014-12-10 12:50:50.txt (1024 kb)
|> 2014-12-10 12:50:55.txt (1020 kb)
|> 2014-12-10 12:51:01.txt (1024 kb)
|> 2014-12-10 12:51:10.txt (1003 kb)
|> 2014-12-10 12:51:20.txt (400 kb) <-The currently active log file.
Run Code Online (Sandbox Code Playgroud)
这是一个老问题,但是这种情况最近有了一些改进。
我不确定为什么NLog会这样做,但是该文件名布局将每秒创建一个新的日志文件,而不是仅使用文件名直到存档期结束。
从NLog 4.3.9开始,您可以配置“ cachekey”,因此可以控制何时使缓存无效。
对于这种情况,以下配置为您提供文件名中的日期和时间,但每天只有1个文件。文件名中的时间将是当天的第一个日志事件的时间。
filename="${cached:cached=true:Inner=${date:format=yyyy-MM-dd hh.mm.ss}:CacheKey=${shortdate}}.log"
Run Code Online (Sandbox Code Playgroud)
我不知道你是否可以使用本机布局来做到这一点,但是实现你自己的 LayoutRenderer 来实现这一点相对容易。
几年前我做了一些非常接近你想要的事情:
[LayoutRenderer("UniqueName")]
public class UniqueNameLayoutRenderer : LayoutRenderer
{
#region Fields (1)
private string _constantName;
#endregion Fields
#region Enums (1)
public enum PatternType
{
/// <summary>
/// Long date + current process ID
/// </summary>
LongDateAndPID,
/// <summary>
/// Long date (including ms)
/// </summary>
LongDate,
}
#endregion Enums
#region Properties (2)
public string ConstantName
{
get
{
if (_constantName == null)
{
if (Format == PatternType.LongDateAndPID)
{
string pid;
try
{
pid = Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture);
}
catch
{
pid = "000";
}
_constantName = DateTime.Now.ToString("yyyy-MM-dd_HHmmss-ffff") + "_pid" + pid;
}
else if (Format == PatternType.LongDate)
{
_constantName = DateTime.Now.ToString("yyyy-MM-dd_HHmmss-ffff");
}
}
return _constantName;
}
}
[DefaultParameter]
public PatternType Format { get; set; }
#endregion Properties
#region Methods (2)
// Protected Methods (1)
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append(ConstantName);
}
// Private Methods (1)
#endregion Methods
}
}
Run Code Online (Sandbox Code Playgroud)
它将在第一次调用时生成当前长时间的文件名,并保留到执行结束。我主要将其与 NLog 2 一起使用,但看起来它与 NLog 3.2 配合得很好。
它的目的是与
"{UniqueName:format=LongDate}"
Run Code Online (Sandbox Code Playgroud)
例如在 NLog 配置文件中。“LongDateAndPID”在名称末尾添加进程 ID,它可用于跟踪启用滚动日志的不同实例。
在使用它之前,您应该使用以下命令注册附加程序:
"{UniqueName:format=LongDate}"
Run Code Online (Sandbox Code Playgroud)
要在启用滚动的情况下使用它,只需使用如下所示的内容:
<extensions><add assembly="MyAssemblyWhichContainsRenderer"/></extensions>
Run Code Online (Sandbox Code Playgroud)
(当然这只是一个例子)
请随意调整布局渲染器以满足您自己的需求。
| 归档时间: |
|
| 查看次数: |
6655 次 |
| 最近记录: |