Log4j2 ThreadContext - 标记相同事务的日志

Log4j2 ThreadContext允许您使用多个唯一标记标记日志语句,以便在运行时诊断问题时分析日志 - 主要是在多线程应用程序中,应用程序在短时间内生成大量日志记录。例如,您可能希望扫描特定用户事务或完整会话的所有日志。此过程也称为鱼标记(即在每个日志语句中添加一些额外的上下文信息)。这种鱼标记可以帮助使用Splunk等日志的自动化工具。

让我们看看我们如何在log4j2中使用ThreadContextclass进行鱼类标记。

在ThreadContext中添加上下文信息

要唯一标记每个请求,请ThreadContext提供put(String key, String value)接受密钥及其值的方法。您可以根据需要添加任意数量的标记来捕获整个上下文信息。请注意,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 !!");

    }

}

或者您可以将ThreadContext的Stack实现与ThreadContext.push(String value)一起使用,如下所示:

//Add context information

ThreadContext.push(UUID.randomUUID().toString());

ThreadContext.push("192.168.21.9");

 

LOGGER.debug("Debug Message Logged !!");

LOGGER.info("Info Message Logged !!");

LOGGER.debug("Another Debug Message !!");

 

//Clear the map

ThreadContext.clearStack();

 

LOGGER.debug("Thread Context Cleaned up !!");

LOGGER.debug("Log message with no context information !!");

事务结束或不再需要上下文信息后,您可以使用ThreadContext.clearMap()方法清空信息。

ThreadContext的Stack和Map是按线程管理的ThreadLocal,默认情况下是基于的。通过将system属性设置isThreadContextMapInheritabletrue,将将上下文映射的内容传递给子线程。

修改log4j2.xml中的转换模式

现在要在日志语句中打印上面的标记,您需要修改log4j2配置文件中的转换模式。

"1.0" encoding="UTF-8"?>

"INFO">

    

        "console" target="SYSTEM_OUT">

            

                pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%X{id}] [%X{ipAddress}] %c{1} - %msg%n" />

        

    

    

        "debug" additivity="false">

            "console" />

        

    

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

现在当你运行上面的代码时 - 你会得到以下输出:

[DEBUG] 2016-06-21 13:09:56.485 [main] [7cdd4cf0-2c26-4b81-b374-1adce3781499] [192.168.21.9] Log4j2HelloWorldExample - Debug Message Logged !!

[INFO ] 2016-06-21 13:09:56.487 [main] [7cdd4cf0-2c26-4b81-b374-1adce3781499] [192.168.21.9] Log4j2HelloWorldExample - Info Message Logged !!

[DEBUG] 2016-06-21 13:09:56.487 [main] [7cdd4cf0-2c26-4b81-b374-1adce3781499] [192.168.21.9] Log4j2HelloWorldExample - Another Debug Message !!

[DEBUG] 2016-06-21 13:09:56.487 [main] [] [] Log4j2HelloWorldExample - Thread Context Cleaned up !!

[DEBUG] 2016-06-21 13:09:56.487 [main] [] [] Log4j2HelloWorldExample - Log message with no context information !!

正如您所看到的,前三个日志语句中添加了上下文信息 - 而其他两个语句没有此类信息。

你可能感兴趣的:(java)