2017-10-19 9 views
0

属性:Logbackのカスタムレイアウトは、私はベースのカスタムlogbackのレイアウト作成しています、だから、

public class MyCustomLayout extends LayoutBase<ILoggingEvent> { 
    private String mySimpleArg; 

    public void setMySimpleArg(String mySimpleArg) { 
     this.mySimpleArg = mySimpleArg; 
    } 

    public String doLayout(IlogginEvent iLoggingEvent) { 
     //generate log in my format and use mySimpleArg 
    } 
} 

と私logback.xmlで、私は今

<appender ...> 
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
     <layout class="path.to.MyCustomLayout"> 
      <mySimpleArg>some text</mySimpleArg> 
     </layout> 
    </encoder> 
... 
</appender> 

持っているが、問題は、私はまた、ありますXMLのconfからより複雑な引数を読み取る必要があり、Googleと同様にlogback docsの情報を見つけることができません。具体的には、私はLogbackは、カスタムオブジェクト上の複雑な、コレクション型を移入するためには

public class MyCustomLayout extends LayoutBase<ILoggingEvent> { 
    private String mySimpleArg; 
    //the Pair here is just to show I need something key -> value based 
    private Pair<String, Object>[] myComplexArray; 

    public void setMySimpleArg(String mySimpleArg) { 
     this.mySimpleArg = mySimpleArg; 
    } 

    public void setMyComplexArray(Pair<String, Object>[] myComplexArray) { 
     this.myComplexArray = myComplexArray; 
    } 

    public String doLayout(IlogginEvent iLoggingEvent) { 
     //generate log in my format and use mySimpleArg and myComplexArray 
    } 
} 

とlogback.xml

<appender ...> 
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
     <layout class="path.to.MyCustomLayout"> 
      <mySimpleArg>some text</mySimpleArg> 
      <myComplexArray> 
       <myComplexElement key="key1" value="value1"/> 
       <myComplexElement key="key2" value=5/> 
      </myComplexArray> 
     </layout> 
    </encoder> 
... 
</appender> 

答えて

1

のようなものを必要とする以下が成立しなければなりませんそのドメイン:

  • Logbackは、単純なXML要素名を使用して、複雑なオブジェクトを発見することができなければならない - >クラス名のマッピング
  • 複雑OBJ ectは '加算メソッド'を公開する必要があります。複合型がFooと呼ばれ、Barのコレクションを含む場合、Foopublic addBar(Bar bar){}メソッドを公開する必要があります。これを考慮して

、以下の設定...

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
    <layout class="path.to.MyCustomLayout"> 
     <mySimpleArg>some text</mySimpleArg> 
     <myComplexArray> 
      <myComplexElement> 
       <key>key1</key> 
       <value>value1</value> 
      </myComplexElement> 
      <myComplexElement> 
       <key>key2</key> 
       <value>value2</value> 
      </myComplexElement> 
     </myComplexArray> 
    </layout> 
</encoder> 

... ...限り、あなたはこのようMyCustomLayoutを宣言するよう

public class MyCustomLayout extends LayoutBase<ILoggingEvent> { 
    private String mySimpleArg; 
    private MyComplexArray myComplexArray; 

    public void setMySimpleArg(String mySimpleArg) { 
     this.mySimpleArg = mySimpleArg; 
    } 

    public void setMyComplexArray(MyComplexArray myComplexArray) { 
     this.myComplexArray = myComplexArray; 
    } 

    public String doLayout(ILoggingEvent iLoggingEvent) { 
     // generate log in my format and use mySimpleArg and myComplexArray 
     return "..."; 
    } 
} 

に動作します... MyComplexArrayMyComplexElementのクラス定義は次のとおりです(これらのクラスの名前はで、logback.xmlで使用する要素名と一致する必要があります)。

public class MyComplexArray { 

    private List<MyComplexElement> myComplexElements = new ArrayList<>(); 

    public MyComplexArray() { 
    } 

    public void addMyComplexElement(MyComplexElement myComplexElement) { 
     myComplexElements.add(myComplexElement); 
    } 
} 

public class MyComplexElement { 

    private String key; 
    private String value; 

    public MyComplexElement() { 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

それはすべて、あなたが戻って(ちょうど<mySimpleArg>のような)単純な文字列プロパティに落ち、あなたが「複雑なオブジェクトのMyCustomLayout内部の派生元となるエンコードされた文字列で渡したいことがありすぎて厄介だ場合。例:

<myComplexArg>foo=bar,bas=1|x=y,z=2</myComplexArg> 
+0

うわー、答えに感謝します。彼らは確かにドキュメントに入れてください。 – Kamil

関連する問題