log4J2自定义pattern参数输出

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

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

具体做法:

复制代码
package com.hotusm.ticket.interceptor;

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";
    }
}


 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 `log4j.properties` 中配置自定义日志输出路径,可以按照以下步骤进行操作: 1. 在 `log4j.properties` 文件中添加一个新的 appender,指定日志输出路径。例如: ```properties log4j.appender.custom=org.apache.log4j.RollingFileAppender log4j.appender.custom.File=/path/to/custom.log log4j.appender.custom.MaxFileSize=10MB log4j.appender.custom.MaxBackupIndex=10 log4j.appender.custom.layout=org.apache.log4j.PatternLayout log4j.appender.custom.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n ``` 在上面的配置中,`custom` 是 appender 的名称,`/path/to/custom.log` 是自定义日志输出路径,`MaxFileSize` 和 `MaxBackupIndex` 分别指定文件大小和备份文件数。 2. 在 `log4j.properties` 文件中指定日志输出目的地。例如: ```properties log4j.rootLogger=INFO, custom ``` 在上面的配置中,`custom` 是上一步中定义的 appender 名称。 3. 在代码中获取 Logger 对象并使用。例如: ```java import org.apache.log4j.Logger; public class MyApplication { private static final Logger logger = Logger.getLogger(MyApplication.class); public static void main(String[] args) { logger.info("Hello, world!"); } } ``` 在上面的代码中,使用 `Logger.getLogger(MyApplication.class)` 获取 Logger 对象,并调用 `logger.info("Hello, world!")` 输出日志信息。日志信息将会输出自定义的日志输出路径 `/path/to/custom.log`。 注意:如果你已经在 `log4j.properties` 文件中定义了其他的 appender 和日志输出目的地,需要将自定义的 appender 和日志输出目的地添加到现有配置中。例如: ```properties log4j.rootLogger=INFO, console, file, custom log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=/path/to/file.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n log4j.appender.custom=org.apache.log4j.RollingFileAppender log4j.appender.custom.File=/path/to/custom.log log4j.appender.custom.MaxFileSize=10MB log4j.appender.custom.MaxBackupIndex=10 log4j.appender.custom.layout=org.apache.log4j.PatternLayout log4j.appender.custom.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n ``` 在上面的配置中,`console` 和 `file` 是已经定义的 appender 和日志输出目的地,`custom` 是自定义的 appender 和日志输出目的地。注意在 `log4j.rootLogger` 中将它们都添加进去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值