log4j 输入自定义参数

使用log4j、log4j2输入日志时,有时想追加打印自定义参数(比如客户端环境:手机型号、浏览器数据,request数据、用户数据等),以便于快速定位问题所在。

亦或在多线程环境中,快速定位哪些日志是由同一用户输出,便于其他工具进行日志分析。

log4j提供了ThreadContext 线程上下文类,用于存储自定义数据,以便在输入日志时,包含指定数据。

测试代码如下:

package com.howtodoinjava.log4j2.examples;

import java.util.UUID;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class Log4j2HelloWorldExample {
    private static final Logger LOGGER = LogManager.getLogger(Log4j2HelloWorldExample.class.getName());
    public static void main(String[] args) {
        //Add context information
        ThreadContext.put("id", UUID.randomUUID().toString());
        ThreadContext.put("ipAddress", "192.168.21.9");

        LOGGER.debug("Debug Message Logged !!");
        LOGGER.info("Info Message Logged !!");
        LOGGER.debug("Another Debug Message !!");

        //Clear the map
        ThreadContext.clearMap();
		
        LOGGER.debug("Thread Context Cleaned up !!");
        LOGGER.debug("Log message with no context information !!");
    }
}

而后在 log4j.xml 中指定上述参数,

单独使用%X以包含地图的全部内容。
使用%X{key}包括指定的键。
使用%x包括堆栈的全部内容。

在实际应用时,一般是在过滤器、拦截器进行上述操作,方法之前,将数据绑定到线程中,方法完成后,清理线程数据。

转载自 https://blog.csdn.net/u010675669/article/details/86477427

 

 

 

你可能感兴趣的:(Java语言,框架,体系)