Как я могу получить имя файла, в который пишет NLog? - PullRequest
1 голос
/ 09 июля 2011

Я пишу заявление, которое будет использоваться членами нашей операционной группы. Я хотел бы показать на экране имя файла, в который пишет NLog. Это позволит им просматривать файл при необходимости.

Я мог бы жестко закодировать имя, но я хотел бы разрешить вместо этого использовать файл NLog.config. Я хотел бы иметь возможность получить фактическое имя файла, в который выполняется запись.

Ответы [ 3 ]

3 голосов
/ 09 июля 2011

Между несколькими комментариями, которые я нашел в Интернете и размышлениями о сборке с Telerik JustDecompile, я смог придумать это решение.

Когда мне нужно точное имя одной из моих целей, я могу просто вызвать метод ниже, как этот

string fileName = GetLogFileName("file");

где файл - это имя моей цели в файле nlog.config

public string GetLogFileName(string targetName) {
    string rtnVal = string.Empty;

    if (LogManager.Configuration != null && LogManager.Configuration.GetConfiguredNamedTargets().Count != 0) {
        Target t  = LogManager.Configuration.FindTargetByName(targetName);
        if(t != null){
            Layout layout = new Layout((t as NLog.Targets.FileTarget).FileName);
            rtnVal = layout.GetFormattedMessage(null);
        }
    }

    return rtnVal;
}

для выпуска 2.1.0.0 NLog мне пришлось изменить код на этот

public string GetLogFileName(string targetName) {
    string rtnVal = string.Empty;

    if (LogManager.Configuration != null && LogManager.Configuration.ConfiguredNamedTargets.Count != 0) {
        NLog.Targets.Target t = LogManager.Configuration.FindTargetByName(targetName);
        if (t != null) {
            NLog.Layouts.Layout layout = (t as NLog.Targets.FileTarget).FileName;
            rtnVal = layout.Render(LogEventInfo.CreateNullEvent());
        }
    }

    return rtnVal;
}
2 голосов
/ 31 мая 2012

вам нужно написать собственную цель

, следуя инструкциям в nlog-project.org / wiki / How_to_write_a_Target

, затем изменить его, чтобы он был только перехватчиком, идобавьте свойство ActualLogfile

[Target("Interceptor")]
public sealed class InterceptTarget : FileTarget
{
    public string ActualLogfile { get; set; } 

    protected override void Write(LogEventInfo logEvent)
    {
        ActualLogfile = this.FileName.Render(logEvent);
        string logMessage = this.Layout.Render(logEvent);
        base.Write(logEvent);
    }
} 

NLog.config должен выглядеть примерно так:

<nlog>
  <targets>
    <target name="i" 
            xsi:type="Interceptor"
            fileName="${basedir}\logs\${shortdate}.log" />
  </targets>
  <rules>
    <logger name="*" minLevel="Trace" writeTo="i"/>
  </rules>
</nlog>

примечание: будьте уверены, что нужно сгенерировать очень раннее сообщение журнала (при запуске pgm) перед ActualLogFileпуст.

0 голосов
/ 09 июля 2011

Почему бы просто не проанализировать NLog.config для любых / всех х

...