2017-10-19 65 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配置文件中读取更复杂的参数,并且我无法在logback文档和Google上找到任何信息。具体而言,我需要像

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在其领域的自定义对象下面必须持有正确的填充复杂,集合类型:

  • 的logback必须能够发现使用一个简单的XML元素名称的复杂对象 - >类名称映射
  • 复杂OBJ ect必须公开“加法方法”,例如如果复杂类型被称为Foo,它包含的Bar集合然后Foo必须公开public 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; 
    } 
} 

如果这一切都太尴尬,那么你可能要回落到一个简单的String属性(就像<mySimpleArg>),并通过在从中派生内MyCustomLayout“复杂对象的编码字符串。例如:

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

哇,谢谢你的答案。他们肯定应该把它写入文档。 – Kamil