Как регистрировать исключения с сетевыми целями в NLog - PullRequest
8 голосов
/ 03 апреля 2012

Я использую каркас ведения журнала NLog и пытаюсь получить информацию об исключениях и трассировке стека, отображаемую в любом приложении UDP-регистратора, например Sentinel и Log2Console , но может отображать только часть сообщения журнала.Вывод в файл работает хорошо, так как большинство примеров делают именно это, поэтому проблема заключается в использовании сетевых целей с NLog.

Бонус, если пользовательский формат может быть применен к внутренним исключениям и трассировке стека, но это не требуется.Exception.ToString () будет иметь большое значение.

Обратите внимание на пример кода: Log2Console Я нашел статью о том, как отправить исключение в виде отдельного журнала.запись.Хотя это сработало, я не был доволен решением.

Пример кода регистрации исключений:

Logger Log = LogManager.GetCurrentClassLogger();

try
{
    throw new InvalidOperationException("My ex", new FileNotFoundException("My inner ex1", new AccessViolationException("Innermost ex")));
}
catch (Exception e)
{
    Log.ErrorException("TEST", e);
}

Пример NLog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets async="true">

    <!-- Send by UDP to Sentinel with NLogViewer protocol -->
    <target name="network" xsi:type="NLogViewer" address="udp://192.168.1.3:9999" layout="${message}${onexception:inner=${newline}${exception:format=tostring}}" />

    <!-- Send message by UDP to Log2Console with Chainsaw protocol -->
    <target name="network2" xsi:type="Chainsaw" address="udp://192.168.1.3:9998" appinfo="Grocelist"/>

    <!-- Send exception/stacktrace by UDP to Log2Console with generic network protocol -->
    <target name="network2ex" xsi:type="Network" address="udp4://192.168.1.3:9998" layout="${exception:format=ToString}" />

    <target name="logfile" xsi:type="File" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}"
                createDirs="true"
                fileName="${basedir}/logs/${shortdate}.log"
                />
</targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="logfile" />
    <logger name="*" minlevel="Debug" writeTo="network" />
    <logger name="*" minlevel="Debug" writeTo="network2" />
    <logger name="*" minlevel="Warn" writeTo="network2ex" />
  </rules>
</nlog>

Некоторые ссылки:

Редактировать: После поиска еще немного это кажется ограничением для NLogконец.Похоже, что недавно вышло последнее исправление: log4jxmlevent не отображает исключениеПрограммы.Возможно, мне придется попробовать log4net, чтобы убедиться, что эти приложения действительно поддерживают то, чего я пытаюсь достичь.

Edit3: В настоящее время я использую string.Format () для объединения и форматирования сообщения и исключениянапиши сам.Это хорошо работает, но это не то, что я ищу здесь.

Ответы [ 6 ]

4 голосов
/ 20 марта 2013

Вы также можете расширить NLog, включив в него исключения для ведения журнала в сети.

Создание расширенного макета:

[Layout("Log4JXmlEventLayoutEx")]    
public class Log4JXmlEventLayoutEx : Log4JXmlEventLayout
{
    protected override string GetFormattedMessage(LogEventInfo logEvent)
    {
        string msg = logEvent.Message + " ${exception:format=Message,Type,ToString,StackTrace}";
        msg = SimpleLayout.Evaluate(msg, logEvent);    
        LogEventInfo updatedInfo;
        if (msg == logEvent.Message) { 
            updatedInfo = logEvent;
        } else {
            updatedInfo = new LogEventInfo(
                logEvent.Level, logEvent.LoggerName, 
                logEvent.FormatProvider, msg, 
                logEvent.Parameters, logEvent.Exception);
        }    
        return base.GetFormattedMessage(updatedInfo);
    }
}

Создание цели, использующей этот макет

[Target("NLogViewerEx")]
public class NLogViewerTargetEx : NLogViewerTarget
{
    private readonly Log4JXmlEventLayoutEx layout = new Log4JXmlEventLayoutEx();    
    public override Layout Layout { get { return layout; } set {} }
}

Обновление NLog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <extensions>
    <add assembly="Assembly.Name.That.Contains.Extended.Target"/>
  </extensions>
  <targets>
    <target name="logViewer" 
            xsi:type="NLogViewerEx" 
            address="udp://localhost:7071">
  </targets>
 ...
</nlog>
2 голосов
/ 17 ноября 2015

Несколько лет спустя, и это довольно тривиально, попробуйте добавить

includeSourceInfo = "истинный"

к вашему целевому файлу, поэтому он выглядит так:

 <target name="viewer"
            xsi:type="NLogViewer"
            includeSourceInfo="true"
            address="udp://127.0.0.1:9999" />

Предоставляет информацию об исходном файле, строке, классе и методе.

2 голосов
/ 30 апреля 2013

У меня была эта проблема, и я только что обновил свой пакет NLog nuget до 2.0.1.2

Теперь у меня есть исключения, поступающие в Log2Console просто отлично.

1 голос
/ 18 апреля 2013

В вашем файле NLog.config измените цель следующим образом.

<target name="file" xsi:type="File" fileName="log.txt" layout="${longdate}:${message} ${exception:format=message,stacktrace:separator=*}" /> 

Часть, которую вы ищете:

${exception:format=message,stacktrace:separator=*}

Для получения дополнительной информации об этом взгляде здесь .

1 голос
/ 04 апреля 2012

Просто скачайте и соберите последние версии (NLog-Build-2.0.0.2007-0-g72f6495) из GitHub: https://github.com/jkowalski/NLog/tree/ Эта проблема устранена разработчиком NLog.

1 голос
/ 04 апреля 2012

Вы пробовали последний снимок разработчика Chainsaw? Он будет отображать трассировки стека и поддерживает приложения log4net / UDP, и в соответствии с NLog вы также можете использовать его: http://nlog -project.org / вики / Chainsaw_target

Попробуйте последний снимок разработчика, имеет массу функций: http://people.apache.org/~sdeboy

...