1

次のような NLog レイアウト構成を作成しようとしています。

layout = "${callsite} > ${message} (${exception:format=tostring})"

このレイアウトの出力は (私がテストしたとき):

TestProject.Program.Main > スローされた例外 (System.Exception: 例外メッセージ)

ただし、例外のないメッセージを出力しようとすると、次のように表示されます。

TestProject.Program.Main > 例外はスローされません ()

実際に例外がある場合にのみ括弧が表示されるように、このレイアウトを変更する方法はありますか?

4

1 に答える 1

0

次のように独自のLayoutRendererを作成できます。

  [LayoutRenderer("MyCustomExceptionLayoutRenderer")]
  class MyCustomExceptionLayoutRenderer : LayoutRenderer
  {
    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
      if (logEvent.Exception == null)
      {
        builder.Append("no exception thrown");
      }
      else
      {
        //Might want fancier formatting of exception here...
        builder.Append("exception thrown ({0})", logEvent.Exception.ToString());
      }
    }

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
    {
      return 100;
    }
  }

次のように1つ(または複数のパラメーター)を取るようにLayoutRendererを定義することもできると思います(ただし、試したことはありません)。

  public enum BracketOption
  {
    None,
    Parentheses,        // ()
    CurlyBraces,        // {}
    SquareBraces,       // []
    LessThanGreaterThan // <>
  }

  [LayoutRenderer("MyCustomExceptionLayoutRenderer")]
  class MyCustomExceptionLayoutRenderer : LayoutRenderer
  {
    public BracketOption Option { get; set; }

    private string left = "";
    private string right = "";

    public MyCustomExceptionLayoutRenderer()
      :base()
    {
      Option = BracketOption.None;
    }

    protected override void Initialize()
    {
      switch(Option)
      {
        case BracketOption.Parentheses:
          left = "(";
          right = ")";
          break;
        case BracketOption.CurlyBraces:
          left = "{";
          right = "}";
          break;
        case BracketOption.SquareBraces:
          left = "[";
          right = "]";
          break;
        case BracketOption.LessThanGreaterThan:
          left = "<";
          right = ">";
          break;
        case BracketOption.None:
        default:
          left = "";
          right = "";
          break;
      }
    }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
      if (logEvent.Exception == null)
      {
        builder.Append("no exception thrown");
      }
      else
      {
        //Might want fancier formatting of exception here...
        builder.Append(string.Format("exception thrown {0}{1}{2}", 
                        left, logEvent.Exception.ToString(), right);
      }
    }

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
    {
      return 100;
    }
  }

使用するには、次のような行をNLog.config(またはインラインで構成している場合はapp.config)に追加します。

<extensions>
  <add assembly="MyNLogExtensions" />
</extensions>

そして、次のようにレイアウトに追加します。

<targets>
  <target type="Console" layout="Exception: ${MyCustomException}" />
</targets>

パラメータ化されたレイアウトは次のようになります(オプションを指定するための正確な形式はわかりません)。

<targets>
  <target type="Console" layout="Exception: ${MyCustomException:BracketOption=Parentheses}" />
</targets>
于 2010-10-27T21:20:01.987 に答える