[置顶] Log4j ObjectRenderer定制对象显示

log是每个应用必备的功能,log4j是其中使用很多的一个:

logger.info("something happend");


Log4j不仅仅能log String

可能有人认为log4j只能log一般的String,其实不然,log4j也能log一般的Object:

logger.info(new Hello("kiwi", "Good morning"));

但是这个时候,显示的是:

0    [main] INFO  org.kiwi  - org.kiwi.Hello@f5e12

因为,在log中,调用的是对象的toString方法,而我们没有overrideHello这个类的toString方法。


Log4j如何自定义log中Object的显示方式

一种方法,当然是最直接的override Hello的toString方法,但是这样,我们讲log的显示逻辑放到Hello本身,这样必然不是很好。

另一种可选的方法就是使用log4j ObjectRenderer:

public class HelloRenderer implements ObjectRenderer {
    @Override
    public String doRender(Object o) {
        Hello hello = (Hello) o;
        return hello.getUser() + ": " + hello.getMessage();
    }
}

配置log4j.properties:

log4j.renderer.org.kiwi.Hello=org.kiwi.HelloRenderer

这个配置的意思就是,当log org.kiwi.Hello的时候,我们将会使用org.kiwi.HelloRenderer进行render,再用render以后的字符串写到log中


搞定!

0    [main] INFO  org.kiwi  - kiwi: Good morning


提示:

Log4j中String对象是不可render的,如果想要改变String的显示,可以考虑自定义Layout

你可能感兴趣的:(log4j,toString,String,ObjectRenderer)