Как установить имя файла NLog на дату начала процесса?

Я пытался

<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}

но это не работает


person Jader Dias    schedule 01.03.2012    source источник
comment
NLog 4.4 позволяет использовать формат. См. github.com/NLog/NLog/wiki/ProcessInfo-Layout-Renderer   -  person Rolf Kristensen    schedule 11.12.2016


Ответы (2)


Использование кэшированного средства визуализации макета

Для решения, не требующего кода, используйте кэшированный модуль рендеринга макета:

<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}"/>

Это решение основано на модуле визуализации макета информации о процессе .

person kshahar    schedule 11.06.2012
comment
Есть идеи, как заставить обновлять имя кешированного файла (скажем, когда файл будет заархивирован?) - person Brandon; 01.12.2014

Я решаю это путем закрепления имени файла из кода.
Вот пример для вашего случая:

FileTarget fileTarget =
    LogManager.Configuration.AllTargets.
        Where( t => t.Name == "txtFile" ).First() as FileTarget;

DateTime Now = DateTime.Now;

fileTarget.FileName =
    string.Format( "{0}.txt", Now.ToString( "yyyy-MM-dd HH-mm-ss" ) );
  • Обратите внимание, что обработка ошибок не включена, вы должны позаботиться об этом по своему усмотрению.
person AVIDeveloper    schedule 01.03.2012