文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

log4j2的异步使用及添加自定义参数方式是什么

2023-06-22 04:41

关注

今天就跟大家聊聊有关log4j2的异步使用及添加自定义参数方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

log4j2异步使用及添加自定义参数

关于log4j2的性能和原理就不赘述了,这篇主要讲使用,配置文件解读,和添加自定义参数,偏应用的一篇文章。

相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;

目前看来,log4j2的性能最突出。

添加依赖(这里省略了版本号)

<dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 去掉springboot默认配置 --><exclusion> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion> </exclusions> </dependency> <dependency> <!-- 引入log4j2依赖 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>

然后再各个项目中添加文件log4j2.xml,在要使用的类上添加@slf4j 注解(lombok的),即可使用log对象。

log4j 2.0与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。在默认情况下,系统选择configuration文件的优先级如下:(classpath为src文件夹)

level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

下面写一个生产可用的log4j2.xml的模板

<?xml version="1.0" encoding="UTF-8"?><!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--><!-- monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--><configuration status="WARN"><Properties><!--常用变量配置 供下文中使用--><property name="APP_NAME">项目名称</property><property name="LOGGER_LEVEL">INFO</property><!--日志路径 对应服务器路径--><property name="LOGGER_PATH">/data/logs</property> <Property name="LOG_HOME">${LOGGER_PATH}/${APP_NAME}</Property><!--文件大小--><Property name="FILE_SIZE">10M</Property><!--日志格式--><Property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n</Property><!--日志文件命名格式--><Property name="rolling_file_name">-%d{yyyy-MM-dd}.%i.zip</Property><!--日志留存最大文件数--><Property name="rollover_strategy_max">30</Property><Property name="LOG_HOME_PROJECT">${LOG_HOME}/${APP_NAME}-project</Property><Property name="LOG_HOME_PROJECT_ERROR">${LOG_HOME}/${APP_NAME}-project-error</Property><Property name="LOG_HOME_SQL">${LOG_HOME}/${APP_NAME}-sql</Property></Properties><appenders><!--控制台打印 及格式--><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="${log_pattern}" /></Console><!--定义rolling() 供下文使用--><RollingRandomAccessFile name="projectRolling"fileName="${LOG_HOME_PROJECT}.log"filePattern="${LOG_HOME_PROJECT}${rolling_file_name}"immediateFlush="false" append="true"><PatternLayout><Pattern>${log_pattern}</Pattern><Charset>UTF-8</Charset></PatternLayout><Policies><!--滚动规则 时间或者文件大小 滚动后将按照filePattern命名--><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="24"/><SizeBasedTriggeringPolicy size="${FILE_SIZE}"/></Policies><DefaultRolloverStrategy max="${rollover_strategy_max}" /></RollingRandomAccessFile><RollingRandomAccessFile name="projectErrorRolling"fileName="${LOG_HOME_PROJECT_ERROR}.log"filePattern="${LOG_HOME_PROJECT_ERROR}${rolling_file_name}"immediateFlush="false" append="true"><Filters><!-- 只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)可以使用多个ThresholdFilter 达到精准过滤某个级别的日志--><ThresholdFilter level="${LOGGER_LEVEL}" onMatch="ACCEPT" onMismatch="DENY" /></Filters><PatternLayout><Pattern>${log_pattern}</Pattern><Charset>UTF-8</Charset></PatternLayout><Policies><SizeBasedTriggeringPolicy size="${FILE_SIZE}"/></Policies><DefaultRolloverStrategy max="${rollover_strategy_max}" /></RollingRandomAccessFile></RollingRandomAccessFile><RollingRandomAccessFile name="sqlRolling"fileName="${LOG_HOME_SQL}.log"filePattern="${LOG_HOME_SQL}${rolling_file_name}"immediateFlush="false" append="true"><PatternLayout><Pattern>${log_pattern}</Pattern><Charset>UTF-8</Charset></PatternLayout><Policies><SizeBasedTriggeringPolicy size="${FILE_SIZE}"/></Policies><DefaultRolloverStrategy max="${rollover_strategy_max}" /></RollingRandomAccessFile></appenders><!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--><loggers><!--异步日志 区别于普通使用的logger root 搭配--><!--name 为包名 对应配置日志输出等级level --><!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。--><!--将org.springframework包下的日志打印到Console控制台,projectRolling文件,projectErrorRolling(error级别单独一个文件)--><AsyncLogger name="org.springframework" level="${LOGGER_LEVEL}" additivity="false"><appender-ref ref="Console"/><appender-ref ref="projectRolling"/><appender-ref ref="projectErrorRolling"/></AsyncLogger><AsyncLogger name="com.alibaba.dubbo" level="${LOGGER_LEVEL}" additivity="false"><appender-ref ref="Console"/><appender-ref ref="projectRolling"/><appender-ref ref="projectErrorRolling"/></AsyncLogger><AsyncLogger name="druid.sql" level="${LOGGER_LEVEL}" additivity="false"><appender-ref ref="Console"/><appender-ref ref="sqlRolling"/></AsyncLogger><AsyncLogger name="org.mybatis" level="${LOGGER_LEVEL}" additivity="false"><appender-ref ref="Console"/><appender-ref ref="sqlRolling"/></AsyncLogger><AsyncLogger name="com.项目包名" level="${LOGGER_LEVEL}" additivity="false"><appender-ref ref="Console"/><appender-ref ref="projectRolling"/><appender-ref ref="projectErrorRolling"/></AsyncLogger><AsyncRoot level="${LOGGER_LEVEL}"><appender-ref ref="Console"/><appender-ref ref="projectRolling" /><appender-ref ref="projectErrorRolling" /></AsyncRoot></loggers></configuration>

如上配置会产生3个日志文件

补充知识

onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL

分别介绍这两个配置项的三个属性值:

自定义日志格式

如何在日志中添加自己想传的参数?

定义拦截器(web服务拦controller,dubbo服务拦api),每次请求过来,拦住,然后将自定义参数传入。至于自定义参数怎么存,就是另一个问题了。

eg: traceId 跟踪号 对应log4j2.xml中的 %X{traceId}

下面是关键代码:

public class ContextFilter implements Filter {    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        String traceId = UUID.randomUUID().toString().replaceAll("-", "");// org.slf4j.MDC         MDC.put(CommonConsts.TRACE_ID_LOG, traceId);// 用来给日志文件使用// org.apache.logging.log4j.ThreadContext    ThreadContext.put(CommonConsts.TRACE_ID_LOG, traceId); //经测试,这两行都可行。    filterChain.doFilter(servletRequest, servletResponse);}

最后的日志打印效果如下:

2019-05-29 12:04:30.122 [http-nio-8080-exec-2] [2333333] INFO com.core.web.filter.ContextFilter - 接口调用时间:245毫秒

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 中指定上述参数,

log4j2的异步使用及添加自定义参数方式是什么

单独使用%X以包含地图的全部内容。

使用%X{key}包括指定的键。

使用%x包括堆栈的全部内容。

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

看完上述内容,你们对log4j2的异步使用及添加自定义参数方式是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯