首先收藏一下log4j2的官网:http://logging.apache.org/log4j/2.x/manual/plugins.html#TypeConverters

有时候需要在日志中实现类似aop的效果,统一加进去某些参数。对于这种需要,log4j2则 可以使用 插件机制。

具体做法:

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; * Created by hotusm 2017/2/16. @Plugin(name = " LogIdPatternConverter " , category = PatternConverter.CATEGORY) @ConverterKeys({ " y " , " logId " }) public class LogIdPatternConverter extends LogEventPatternConverter { private static final LogIdPatternConverter INSTANCE = new LogIdPatternConverter(); public static LogIdPatternConverter newInstance( final String[] options) { return INSTANCE; private LogIdPatternConverter(){ super( " LogId " , " logId " ); @Override public void format(LogEvent event , StringBuilder toAppendTo) { toAppendTo.append(Math.random());

定义一个类继承 LogEventPatternConverter

1.定义的这个类必须提供一个 newInstance方法,参数是 final String[] options,返回值 为定义的类(对于是否是单例没有明确的要求)

2.提供一个私有的构造函数,调用父类的构造函数,函数需要提供两个参数 第一个参数是转换器的名称,第二个是css样式,

3.还有主要的工作 format,这里有两个参数, LogEvent是系统已经存在的一些可选数据, StringBuilder 表示的是最终的输出字符流。一般都是将自定义的
append进去

4.注解:Plugin 表示的是这是一个插件,name是名称,category为 PatternConverter.CATEGORY(目前插件只有这个选择)
ConverterKeys表示的就是自定义的参数,可以多个

定义好了之后,然后在log4j2的配置文件中设置

<configuration status="WARN" packages="com.hotusm.ticket.interceptor">

打印格式:

<Property name="patternStyle">lodId:%-10y %d{HH:mm:ss.SSS}

最后就ok了。下面是输出:

以上是log4j2的配置,使用log4j可以 继承patternLayout和patternParser,自定义一个patternConverter实现。如下:

public class ExtPatternLayout extends PatternLayout {
    public ExtPatternLayout(String pattern) {
        super(pattern);
        System.out.println("pattern is null ???:" + pattern);
    public ExtPatternLayout() {
        super(DEFAULT_CONVERSION_PATTERN);
    @Override
    protected PatternParser createPatternParser(String pattern) {
        System.out.println("pattern is null ???:" + pattern);
        return new ExtPatternParser(pattern == null ? DEFAULT_CONVERSION_PATTERN: pattern);

pattern解析器:

public class ExtPatternParser extends PatternParser {
    public static final ThreadLocal<Map<String, Object>> TH_LOCAL = new ThreadLocal<Map<String, Object>>(){
        @Override
        protected HashMap<String, Object> initialValue() {
            return new HashMap<String, Object>();
    public static void setCurrentValue(String key, Object value) {
        Map<String, Object> map = TH_LOCAL.get();
        map.put(key, value);
    public ExtPatternParser(String pattern) {
        super(pattern);
    @Override
    protected void finalizeConverter(char c) {
        if (c == '#') {
            String option = super.extractOption();
            addConverter(new ExtPatternConverter(this.formattingInfo,option));
            currentLiteral.setLength(0);
        } else {
            super.finalizeConverter(c);

pattern转换器:

public class ExtPatternConverter extends PatternConverter {
    private String cfg;
    @Autowired
    public ExtPatternConverter(FormattingInfo fi, String cfg) {
        super(fi);
        this.cfg = cfg;
    @Override
    protected String convert(LoggingEvent event) {
        System.out.println("start char convert");
        Map<String, Object> valueMap = ExtPatternParser.TH_LOCAL.get();
        if (valueMap != null) {
            Object value = valueMap.get(cfg);
            if (value != null) {
                return String.valueOf(value);
        return "notExist";
通过配置Layout打印格式化的日志,
Log4j2支持很多的Layouts:
CSV GELF HTML JSON Pattern Serialized Syslog XML YAML
本文仅介绍Pattern Layouts的详细使用。
本文基于Log4j2基本使用入门。
请先参考上面的基本使用入门。
2.Pattern Layouts
Pattern Layou...
最近用到一个项目,需要在一个类中,将日志区分打印到不同的日志文件中
比如同一个地方打印两条日志“receive message from port[123]”,"receive message from port[456]"
这两条日志的内容一样的,只不过里面的参数port不一样。
在这里,我们使用gradle工程来实现,总体目录如下
工程的gradle.build...
                                    在log4j中可以指定特定的输出源append。在数据库记录日志时,可以将日志文件记录到多个数据库表中。
 [code="java"]# This is the configuring for logging displayed in the Application Server
log4j.rootCategory=DEBUG,logfile,stdout
log4j.logger.S...
                                    c category的名称,可使用{n}限制输出的精度。例如:logger名为"a.b.c",%c{2}将输出"b.c"。
C 产生log事件的java完全限定类名。可使用{n}限制输出的精度。例如:“org.apache.xyz.SomeClass”,%C{2}将输出“SomeClass”。
d 时间和日期的输出格式,例如:%d{yyyy MM dd HH:mm:ss,SS},可不带后...
                                    首先声明本文并不教您怎么用log4j2,仅仅只对子节点进行说明。
要看懂本文需要对log4j2有一定的了解,至少能够知道、和的区别。
本文主要参考对象为log4j2官方手册:《Apache Log4j 2 v. 2.1 User's Guide》,但是鉴于官方手册的不少细节描述得并不是非常清楚,甚至还有错误,所以还希望大家自己多试验,毕竟如果官方文档有错误或写得不清楚,我也没办法。
                                    在某种情况下,我们需要在不影响原有代码的基础上自定义log4j输出格式。例如这样的需求,硬性规定了项目的日志格式为: 日期 日志等级 ClassName:line - [版本号] [请求ip地址] [项目应用名称] [服务接口模块] [模块方法] [业务参数1] [业务参数2] [业务参数3] 日志详细内容(必须为json格式)示例:2018-05-10 14:04:50,972  INFO V...
                                    http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html  参数说明例子%c列出logger名字空间的全称,如果加上{&lt;层数&gt;}表示列出从最内层算起的指定层数的名字空间log4j配置文件参数举例输出显示媒介假设当前logger名字空间是"a.b.c"%ca.b.c%c{2}b.c%20c(若...
                                    1. 关于Log4j2(为什么要使用Log4j2Log4jLog4j2是什么?
Log4j(Log for java)是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件等。同时,我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4j2Log4j的作者重新架构的一款日志组件,他抛弃了之前Log4j的
package cn.java.log4j2.demo.plugin.fooone;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.lo...
1、pom.xml文件中添加log4j2依赖,并排除掉spring默认的日志依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>
本节介绍Log4j输出格式的详细说明1、PatternLayout参数charset ##指定字符集
pattern ##指定格式
alwaysWriteExceptions ##默认为true,输出异常
header ##可选项。包含在每个日志文件的顶部
footer ##可选项。包含在每个日志文件的尾部。2、pattern属性参数格式描述######### 常见参数 #########