使用当前日期和时间创建NLog文件而不缓存它,保持存档文件名相同

Bra*_*don 14 c# nlog

我正在使用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只根据文件大小和日期归档文件,并忽略归档编号和日期格式?我正在尝试生成日志文件,其名称是创建时间的时间戳,其中新文件仅在特定大小或每天创建.

编辑: 这是我想要实现的目标:

在申请开始

  1. "yyyy-MM-dd hh.mm.ss".txt使用当前时间戳创建具有文件名的日志文件(示例 - >"2014-04-29 11:11:11.txt")
  2. 应用程序会在该文件中记录一段时间,直到它为止
    • 变得太大(超过定义的限制)或
    • 存档时间过去了(在我的情况下,这是一天)
  3. 然后记录器停止写入在1.("2014-04-29 11.11.11.txt")中创建的文件,并且不重命名它或以其他方式添加顺序/滚动数字或日期格式.
  4. 重复步骤1-3直到时间结束.

离开我的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)

Jul*_*ian 5

这是一个老问题,但是这种情况最近有了一些改进。

我不确定为什么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)

  • 这是一个很棒的答案,完美地解决了我同样的问题!很高兴在单个日志文件中获取运行的所有日志输出,而不是在运行的每分钟内分散在单独的文件中。就我而言,文件配置如下所示: fileName="\\MyOrgData2Server${var:runEnvironmentDNSSuffix}.my.org.net\Data2\myorg\MyApp\MyAppImagingTransactions\Logs\MyAppReleaseImages_${cached:cached=true:Inner= ${date:format=yyyy-MM-dd hh.mm.ss}:CacheKey=${shortdate}}_${var:machineName}.log" /&gt; 请注意,我还在环境中使用 NLog 变量(开发、质量检查、生产)和机器 ID。 (2认同)

AFr*_*act 1

我不知道你是否可以使用本机布局来做到这一点,但是实现你自己的 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)

(当然这只是一个例子)

请随意调整布局渲染器以满足您自己的需求。