Log4JConverter在日志中插入自定义内容

有这么一个需求,我希望在用log4j输出日志的时候,顺带输出这次调用是由谁发起的。也就是说,我需要在日志中打印出当前线程中所包含的用户登录信息。那么本文就给出了一个基于log4jConverter实现一个自定义插件。

我们一共需要做的事情就两件:

  • 配置日志输出格式(对应下文中log4j.xml配置)

  • 在插件中放入需要输出的内容(对应下文中两个Converter类的实现)

  • log4j.xml

    <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level [%userId,%userName] %logger{36} - %msg%n" /> </Console> </Appenders>

    其中 [%userId,%userName] 为指定格式

    Converter实现

    package cn.kobelee.logtest.log; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.pattern.ConverterKeys; import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; import org.apache.logging.log4j.core.pattern.PatternConverter; @Plugin(name = "UserIdConverter", category = PatternConverter.CATEGORY)//定义插件名称 @ConverterKeys({ "userId" })//指定需要转换的key public class UserIdConverter extends LogEventPatternConverter { private static final UserIdConverter INSTANCE = new UserIdConverter("userId","userId");//单例 public static UserIdConverter newInstance( final String[] options) { return INSTANCE; protected UserIdConverter(String name, String style) { super(name, style); @Override public void format(LogEvent logEvent, StringBuilder toAppendTo) { * 此override的方法为需要往日志中插入的内容, * 其key为UserIdConverter的构造方法中传入的Name 这样在xml中就可以按照key来获得这个值了 toAppendTo.append("001"); @Plugin(name = "UserNameConverter", category = PatternConverter.CATEGORY) @ConverterKeys({ "userName" }) public class UserNameConverter extends LogEventPatternConverter { private static final UserNameConverter INSTANCE = new UserNameConverter("userName","userName"); public static UserNameConverter newInstance( final String[] options) { return INSTANCE; protected UserNameConverter(String name, String style) { super(name, style); @Override public void format(LogEvent logEvent, StringBuilder toAppendTo) { toAppendTo.append("KobeLee");