java日志框架详解-Log4j2

一、概述

     Apache Log4j 2 (Log4j – Apache Log4j 2)是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并参考了Logback中优秀的设计,同时修复了Logback架构中的一些问题。被誉为是目前最优秀的Java日志框架;企业中通常使用SLF4j门面+Log4j2来记录日志。
    Log4j2主要的性能提升:
    异常处理:在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
    性能提升:log4j2 相较于log4j 和 logback 都具有明显的性能提升,有18倍性能提升,后面会有官方测试的数据。
    自动重载配置: 参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
    无垃圾机制: log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制【对象重用、内存缓冲】,避免频繁的日志收集导致的 jvm gc。

自动重新加载配置

与 Logback 一样,Log4j 2 可以在修改时自动重新加载其配置。与Logback不同,它会这样做 在进行重新配置时不会丢失日志事件。

高级过滤

与 Logback 一样,Log4j 2 支持基于上下文数据、标记、正则表达式和其他组件进行过滤 日志事件。可以指定筛选以在传递到记录器之前或通过时应用于所有事件 追加器。此外,过滤器还可以与记录器相关联。与 Logback 不同,您可以使用通用 Filter 类 在任何这些情况下。

二、Log4j2入门案例

开发实例:

依赖引入POM.xml:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Log4j2配置
log4j2默认加载classpath下的 log4j2.xml 文件中的配置。

<?xml version="1.0" encoding="UTF-8"?><!--status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。此处表示每隔600秒重读一次配置文件
-->
<Configuration status="OFF" monitorInterval="600"><!--日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL--><!--如果设置为WARN,则低于WARN的信息都不会输出--><Properties><!-- 配置日志文件输出目录,此处为项目根目录下的logs文件夹 --><Property name="LOG_HOME">/app/applogs</Property><!-- 配置日志文件名称前缀 --><Property name="LOG_FILE_NAME">cu-upcc-ccc1-provider</Property><!-- 配置输出日志级别-通用日志 --><Property name="LOG_LEVEL">INFO</Property><!-- 配置输出日志级别-重要日志1 --><Property name="LOG_LEVEL_V1">DEBUG</Property><!-- 配置日志输出源appender的名称 --><Property name="APPENDER_NAME">APP-PROVIDER</Property><!-- 配置子Logger是否继承父Logger的输出源,true-是,false-否,默认true --><Property name="LOGGER_ADDITIVITY">true</Property><!-- 触发日志文件分割的时间间隔,此配置必须和filePattern协调, 如果后者是精确到HH, 则此配置项单位是小时,若后者精确到dd, 则此配置项单位是天--><Property name="POLICY_TIME_BASED_INTERVAL">1</Property><!-- 日志清理规则 从basePath起清理日志文件的目录层级深度 --><Property name="DELETE_MAX_DEPTH">1</Property><!-- 日志清理规则 文件名称匹配规则 --><Property name="DELETE_IF_FILE_NAME">*.log-*</Property><!-- 日志清理规则 归档日志文件存在时长匹配规则,此配置项必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用, 另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功! --><Property name="DELETE_IF_LAST_MODIFIED_AGE">24H</Property></Properties><Appenders><!--这个输出控制台的配置--><Console name="Console" target="SYSTEM_OUT"><!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/><!--日志输出的格式--><PatternLayout pattern="|%d{yyyy-MM-dd HH:mm:ss.SSS}|%5p|%5t|%4c:%L|%X{PtxId}|%X{clientNodeName}|%X{serverNodeName}|%X{clientSysName}|%X{serverSysName}|%X{txId}|%X{logType}|%m|%n" /></Console><RollingRandomAccessFile name="${APPENDER_NAME}" fileName="${LOG_HOME}/${LOG_FILE_NAME}.log"filePattern="${LOG_HOME}/${LOG_FILE_NAME}.log-%d{yyyyMMddHH}"><PatternLayout pattern="|%d{yyyy-MM-dd HH:mm:ss.SSS}|%5p|%5t|%4c:%L|%X{PtxId}|%X{clientNodeName}|%X{serverNodeName}|%X{clientSysName}|%X{serverSysName}|%X{txId}|%X{logType}|%m|%n" /><Policies><TimeBasedTriggeringPolicy interval="${POLICY_TIME_BASED_INTERVAL}"/><!--<SizeBasedTriggeringPolicy size="50MB"/>--></Policies><DefaultRolloverStrategy><Delete basePath="${LOG_HOME}/" maxDepth="${DELETE_MAX_DEPTH}"><IfFileName glob="${DELETE_IF_FILE_NAME}" /><!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!--><IfLastModified age="${DELETE_IF_LAST_MODIFIED_AGE}" /></Delete></DefaultRolloverStrategy></RollingRandomAccessFile><!-- alarm plugins --><AlarmLog4j2Appender name="AlarmLog4j2Appender"  enableApollo="true" apNameSpace="cu-upcc-ccc1-provider"><PatternLayout pattern="|%d{yyyy-MM-dd HH:mm:ss.SSS}|%m" /></AlarmLog4j2Appender></Appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><Loggers><Logger name="com.epay.cu1.upcc1.ccc1.provider" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="com.epay.ts.lacs.log" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="com.epay.ts.piss" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="org.springframework" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="com.ctrip.framework" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="org.apache" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="feign.Logger" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><Logger name="com.alibaba.druid" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="${APPENDER_NAME}"/></Logger><logger name="com.broad.assessment.business.dao" level="${LOG_LEVEL_V1}"><AppenderRef ref="${APPENDER_NAME}"/></logger><logger name="org.mybatis" level="${LOG_LEVEL_V1}"><AppenderRef ref="${APPENDER_NAME}"/></logger><logger name="com.unicompayment.basictools" level="${LOG_LEVEL_V1}"><AppenderRef ref="${APPENDER_NAME}"/></logger><!-- alarm plugins --><Logger name="com.epay.cu1.upcc1.ccc1.provider" level="${LOG_LEVEL}" additivity="${LOGGER_ADDITIVITY}"><AppenderRef ref="AlarmLog4j2Appender"/></Logger><Root level="${LOG_LEVEL}"><Appender-Ref ref="Console"/></Root></Loggers></Configuration>

 测试代码:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Log4j2Test {private static final Logger logger = LogManager.getLogger();public Log4j2Test(){logger.info( "Hello World!" );}
}

三、Log4j2异步日志

Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应前面我们说的Appender组件和Logger组件。

 POM文件异步日志依赖添加:

<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.3.4</version>
</dependency>

1、AsyncAppender有锁异步

  异步日志是通过引用别的Appender来实现的,当有日志事件到达时,会开启另外一个线程来处理它们。需要注意的是,如果在Appender的时候出现异常,对应用来说是无法感知的。AsyncAppender应该在它引用的Appender之后配置,默认使用java.util.concurrent.ArrayBlockingQueue实现而不需要其它外部的类库。当使用此Appender的时候,在多线程的环境下需要注意,阻塞队列容易受到锁争用的影响,这可能会对性能产生影响。这时候,我们应该考虑使用无锁的异步记录器(AsyncLogger)

日志配置文件
<Configuration status="fatal" monitorInterval="30"><Properties><Property name="myPattern" value="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Properties><Appenders><Console name="ConsoleAppend" target="SYSTEM_OUT"><PatternLayout pattern="${myPattern}"/><!-- 只接受程序中DEBUG级别的日志进行处理--><ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/></Console><!--在Appenders标签内创建Async异步标签--><Async name="AsyncConsoleAppend"><!--指定当前Appenders标签内的哪个Appender需要设置异步并通过引用--><AppenderRef ref="ConsoleAppend"/></Async></Appenders><Loggers><Root level="ALL"><!--设置异步的Appender--><AppenderRef ref="AsyncConsoleAppend"/></Root></Loggers>
</Configuration>

2、AsyncLogger无锁日志

  AsyncLogger才是log4j2实现异步最重要的功能体现,也是官方推荐的异步方式。它可以使得调用Logger.log返回的更快。你可以有两种选择:全局异步和混合异步。

  全局异步:所有的日志都异步的记录,在配置文件上不用做任何改动,只需要在jvm启动的时候增加一个参数即可实现。

  混合异步:你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加灵活。

  虽然Log4j2提供以一套异常处理机制,可以覆盖大部分的状态,但是还是会有一小部分的特殊情况是无法完全处理的,比如我们如果是记录审计日志(特殊情况之一),那么官方就推荐使用同步日志的方式,而对于其它一些仅仅是记录一个程序日志的地方,使用异步日志将大幅提升性能,减少对应用本身的影响。混合异步的方式需要通过修改配置文件来实现,使用AsyncLogger标记配置。

全局异步:

<!-- 导入所需的依赖坐标 -->
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.4</version>
</dependency><!-- 在resources资源目录下创建log4j2.component.properties文件并编写配置 -->
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

混合异步:

<Configuration status="fatal" monitorInterval="30"><Properties><Property name="myPattern" value="%d{HH:mm:ss.SSS} [%t] %L %-5level %logger{36} - %msg%n"/></Properties><Appenders><Console name="ConsoleAppend" target="SYSTEM_OUT"><PatternLayout pattern="${myPattern}"/><!-- 只接受程序中DEBUG级别的日志进行处理--><ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/></Console></Appenders><Loggers><!--创建一个自定义的异步Logger--><!--name:对com.xw当前及其子包下的全部类的日志记录走此异步方式--><!--includeLocation:表示去除日志上的行号信息--><!--注:配置多个Logger时需要设置additivty来取消继承RootLogger--><AsyncLoggger name="com.xw" level="INFO" includeLocation="false" additivty="false"><AppenderRef ref="ConsoleAppend"/></AsyncLoggger><!--RootLogger--><Root level="ALL"><!--设置异步的Appender--><AppenderRef ref="ConsoleAppend"/></Root></Loggers>
</Configuration>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac电脑版鼠标连点工具 RapidClick for Mac

RapidClick是一款简单实用的自动点击软件。它可以模拟鼠标点击操作&#xff0c;以便快速、连续地点击屏幕上的特定位置。该软件通常用于自动执行重复性的点击任务或加快某些操作的速度。 以下是RapidClick可能提供的一些主要功能和特点&#xff1a; 自动点击功能&#xff1a;R…

C++对string进行大小写转换的三种方法

C对string进行大小写转换的三种方法 方法一&#xff1a;下标 #include <iostream> #include <string> using namespace std;int main() {string s "ABCDEFG";for( int i 0; i < s.size(); i ){s[i] tolower(s[i]);}cout<<s<<endl;re…

LATR:3D Lane Detection from Monocular Images with Transformer

参考代码&#xff1a;LATR 动机与主要工作&#xff1a; 之前的3D车道线检测算法使用诸如IPM投影、3D anchor加NMS后处理等操作处理车道线检测&#xff0c;但这些操作或多或少会存在一些负面效应。IPM投影对深度估计和相机内外参数精度有要求&#xff0c;anchor的方式需要一些如…

SpringCloud学习笔记-Ribbon负载均衡

目录 1.负载均衡策略2.自定义负载均衡策略3.饥饿加载 SpringCloudRibbon的底层采用了一个拦截器&#xff0c;拦截了RestTemplate发出的请求&#xff0c;对地址做了修改。用一幅图来总结一下&#xff1a; 基本流程如下&#xff1a; 拦截我们的RestTemplate请求http://userserv…

增强LLM:使用搜索引擎缓解大模型幻觉问题

论文题目&#xff1a;FRESHLLMS:REFRESHING LARGE LANGUAGE MODELS WITH SEARCH ENGINE AUGMENTATION 论文地址&#xff1a;https://arxiv.org/pdf/2310.03214.pdf 论文由Google、University of Massachusetts Amherst、OpenAI联合发布。 大部分大语言模型只会训练一次&#…

毛玻璃 has 选择器卡片悬停效果

效果展示 页面结构 从上述的效果展示可以看到&#xff0c;页面是由多个卡片组成&#xff0c;并且鼠标悬停在卡片上时&#xff0c;会旋转用户图片并且韩式对应的用户信息框。 CSS3 知识点 :has 属性的运用 实现页面整体结构 <div class"container"><div…

linux | linux扩大磁盘空间 | centos7.9 | 虚拟机

注意&#xff1a;可以完全参考下面这边博客&#xff08;我只是搬运工&#xff09; centos扩大磁盘空间 简单讲讲&#xff0c;为什么有点失落落的&#xff1f; 明明就是一个 很程序化的东西 可是网上一大推 天花乱坠 而且很多人都是半吊子水&#xff0c;甚至半吊子都没有 通过关…

Ubuntu16.04apt更新失败

先设置网络设置 换成nat、桥接&#xff0c;如果发现都不行&#xff0c;那么就继续下面操作 1.如果出现一开始就e&#xff0c;检查源&#xff0c;先换源 2.换完源成功之后&#xff0c;ping网络&#xff0c;如果ping不通就是网络问题 如果ping baidu.com ping不通但是ping 112…

[网鼎杯 2018]Comment git泄露 / 恢复 二次注入 bash_history文件查看

首先我们看到账号密码有提示了 我们bp爆破一下 我首先对数字爆破 因为全字符的话太多了 爆出来了哦 所以账号密码也出来了 zhangwei zhangwei666 没有什么用啊 扫一下吧 有git git泄露 那泄露看看 真有 <?php include "mysql.php"; session_start(); if(…

leetCode 53.最大子数组和 动态规划 + 优化空间复杂度

关于此题我的往期文章&#xff1a; leetCode 53.最大子数和 图解 贪心算法/动态规划优化_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/13349726853. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; >&…

NSA 和 CISA 揭示十大网络安全错误配置

美国国家安全局 (NSA) 和网络安全与基础设施安全局 (CISA) 在5日公布了其红蓝团队在大型组织网络中发现的十大最常见的网络安全错误配置。 通报还详细介绍了威胁行为者使用哪些策略、技术和程序 (TTP) 来成功利用这些错误配置来实现各种目标&#xff0c;包括获取访问权限、横向…

40V汽车级P沟道MOSFET SQ4401EY-T1_GE3 工作原理、特性参数、封装形式—节省PCB空间,更可靠

AEC-Q101车规认证是一种基于失效机制的分立半导体应用测试认证规范。它是为了确保在汽车领域使用的分立半导体器件能够在严苛的环境条件下正常运行和长期可靠性而制定的。AEC-Q101认证包括一系列的失效机制和应力测试&#xff0c;以验证器件在高温、湿度、振动等恶劣条件下的可…

设计模式 - 行为型模式:责任链模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、责任链模式 1.1.1、概述 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、责任链模式 1.1.1、概述 为了避免请求发送者和多个请求处理者耦合在一起&#xff0c;就将所有请求处理者通过前一个对象记住下一个对象的引用的方…

uniapp apple 苹果登录 离线本地打包

官方文档 uni-app官网 文档写的不全&#xff0c;没有写离线打包流程 加lib 签名里带 sign in with apple hbuilder开关 代码 测试代码&#xff0c;获取app里所有的provider uni.getProvider({service: oauth,success: function (res) {console.log(res.provider)uni.showT…

【HTML5】语义化标签记录

前言 防止一个页面中全部都是div&#xff0c;或者ul li&#xff0c;在html5推出了很多语义化标签 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 常用语义化案例 一般我用的多的是header&#xff0c;main&#xff0c;footer 这些标签不难理解&#x…

2023年中国助消化药物行业现状分析:消化不良患者逐年上升,提升需求量[图]

助消化药物主要分为促胃动力药物、消化酶抑制剂、胃酸抑制药物和消食剂4种类型。促胃动力药物的作用机制是通过增强胃肠道平滑肌动力促进胃酸分泌&#xff0c;从而达到助消化的目的&#xff0c;临床常用药物包括多潘立酮、莫沙必利、西沙比利等。 助消化药物分类 资料来源&…

Observability:使用 OpenTelemetry 对 Node.js 应用程序进行自动检测

作者&#xff1a;Bahubali Shetti DevOps 和 SRE 团队正在改变软件开发的流程。 DevOps 工程师专注于高效的软件应用程序和服务交付&#xff0c;而 SRE 团队是确保可靠性、可扩展性和性能的关键。 这些团队必须依赖全栈可观察性解决方案&#xff0c;使他们能够管理和监控系统&a…

Django开发之进阶篇

Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中&#xff0c;模板&#xff08;Template&#xff09;是用于生成动态 HTML&#xff…

自动拟人对话机器人在客户服务方面起了什么作用?

在当今数字时代&#xff0c;企业不断寻求创新的方法来提升客户服务体验。随着科技的不断进步和消费者期望的提升&#xff0c;传统的客户服务方式逐渐无法满足现代消费者的需求。因此&#xff0c;许多企业正在积极探索利用新兴技术来改进客户服务&#xff0c;自动拟人对话机器人…