8

NLogロギング フレームワークを使用しており、 SentinelLog2Consoleなどの UDP ロガー アプリケーションに表示される例外およびスタック トレース情報を取得しようとしていますが、表示されるログ メッセージ部分しか取得できません。ファイルへの出力は、ほとんどの例と同じようにうまく機能するため、問題は 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 は例外をレンダリングしません

Edit2: NLog をパッチで再構築しましたが、Sentinel または Log2Console アプリでは役に立たないようです。これらのアプリが私が達成しようとしているものを実際にサポートしていることを確認するために、log4net を試す必要があるかもしれません。

Edit3: 私は現在 string.Format() を使用して、メッセージと例外テキストを自分で結合してフォーマットします。これはうまく機能しますが、ここで探しているものではありません。

4

6 に答える 6

4

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>
于 2013-03-20T09:34:19.837 に答える
1

チェーンソーの最新の開発者スナップショットを試しましたか?スタックトレースを表示し、log4net / UDPアペンダーをサポートします。また、NLogによると、これも使用できます:http: //nlog-project.org/wiki/Chainsaw_target

最新の開発者スナップショットを試してみてください。たくさんの機能があります:http://people.apache.org/~sdeboy

于 2012-04-03T22:51:11.120 に答える
1

NLog.config で、次のようにターゲットを変更します。

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

お探しのパーツは

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

詳細については、こちらをご覧ください

于 2013-04-18T19:13:37.667 に答える
1

GitHub から最新の (NLog-Build-2.0.0.2007-0-g72f6495) ソースをダウンロードしてビルドするだけです: https://github.com/jkowalski/NLog/tree/ この問題は NLog 開発者によって修正されています。

于 2012-04-04T14:20:21.667 に答える