复杂的logback自定义布局属性
问题描述:
所以,我创建基于自定义的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>
答
为了要的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 "...";
}
}
...你提供MyComplexArray
和MyComplexElement
以下类定义(注:这些类必须符合您在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>
哇,谢谢你的答案。他们肯定应该把它写入文档。 – Kamil