c #, Nlog и изменить цель - PullRequest
0 голосов
/ 14 марта 2019

у меня запущена служба windows, и я хочу, когда я бегу в отладке, чтобы написать на консоль и когда в качестве службы для просмотра событий.

в PowerShell я установил

New-EventLog –LogName Application –Source "mySource"

У меня есть nlog.config:

<nlog>
<targets>
<target name="debugger" type="Debugger" layout="${logger}::${message}"/>
<target name="console" type="Console" layout="${logger}::${message}"/>
<target name="file" type="File" layout="${longdate} ${logger}::${message}" fileName="${basedir}/Logs/${shortdate}.log"/>
<target name="eventLog" type="eventlog" layout="${logger}::${message}" source="mySource"/>
</targets>
<rules>
<logger name="" minlevel="Trace" writeTo="debugger"/>
<logger name="" minlevel="Trace" writeTo="console"/>
<logger name="*" minlevel="Trace" writeTo="file"/>
<logger name="*" minlevel="Debug" writeTo="eventLog" />
</rules>
</nlog> 

я запускаю init при запуске службы:

    public static void InitLogger()
    {
        NLog.Targets.Target target = null;

        target = LogManager.Configuration.FindTargetByName("eventlog");

        NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Info);
        LogManager.Configuration.Reload();

    }

чтобы проверить это, я изменяю его в обоих случаях, чтобы написать в "eventlog" даже в режиме отладки. но он не работает правильно при использовании средства просмотра событий (VS работает в режиме администратора)

enter image description here

я устанавливаю в каждом классе

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

чего не хватает?

1 Ответ

1 голос
/ 14 марта 2019

Эта строка будет загружать NLog.config и искать именованную цель:

target = LogManager.Configuration.FindTargetByName("eventlog");

Эта строка будет отбрасывать исходную конфигурацию NLog (со всеми правилами и целями) и создавать новую с одной целью:

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Info);

Эта строка ничего не будет делать:

LogManager.Configuration.Reload();

Я полагаю, вы пытаетесь добавить дополнительную цель в существующую конфигурацию.Это может быть сделано следующим образом (Замена всего кода выше):

LogManager.Configuration.AddRule("*", LogLevel.Info, target):
LogManager.ReconfigExistingLoggers();

Кстати.если вы не настроите свойство Source для EventLog-target, то оно будет использовать AppDomain.FriendlyName

...