日志门面和日志框架(日志实现框架log4j2)
一、log4j2简介
Apache Log4j 2是对Log4j的升级,是最优秀的java日志框架。
二、log4j2特征
性能提升:Log4j2包含基于LMAX Disruptor库的下一代异步记录器。在多线程场景中,异步记录器的吞吐量比log4j和logback高18倍,延迟低。
自动重新加载配置:与logback一样,log4j2可以在修改时自动重新加载其配置。与logback不同,它会在重新配置时不会丢失日志事件。
高级过滤:与logback一样,log4j2支持基于log事件中的上下文数据,标记,正则表达式和其他组件进行过滤。此外,过滤器还可以与记录器关联。与logback不同,logback可以在任何这些情况下使用通用的Filter类。
插件架构:log4j2使用插件模式配置组件。因此,无需编写代码来创建和配置Appender,layout,pattern Converter等。在配置了的情况下,log4j2自动识别插件并使用它们。
无垃圾机制:在稳定日志记录期间,log4j2在独立应用程序中是无垃圾的,在web应用程序中是低垃圾。这减少了垃圾收集器的压力,并且可以提供更好的响应性能。
总之:SLF4j+Log4j2的组合,是市场上最强大的日志功能实现方式。
三、slf4j集成log4j2
1. slf4j集成log4j2步骤共4步
- 导入slf4j日志门面
- 导入log4j2的适配器
- 导入log4j2日志门面
- 导入log4j2日志实现
<!--slf4j日志门面 -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version>
</dependency>
<!--log4j2适配器 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.1</version>
</dependency>
<!--log4j2日志实现 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version>
</dependency>
2. 集成原理
slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现。
四、log4j2配置文件
log4j2是参考logback创作出来的,所以配置文件也是使用xml。log4j2同样是默认加载类路径(resources)下的log4j2.xml文件中的配置。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration><!--配置appender --><Appenders><Console name="consoleAppender" target="SYSTEM_ERR"></Console></Appenders><!--配置logger --><Loggers><!--配置rootlogger --><Root level="info"><AppenderRef ref="consoleAppender"></AppenderRef></Root></Loggers>
</configuration>
五、日志文件输出
<?xml version="1.0" encoding="UTF-8" ?>
<configuration><!--全局配置 --><properties><property name="logDir">F:\\project\\springboot_log</property><property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property></properties><!--配置appender --><Appenders><!--控制台输出 --><Console name="consoleAppender" target="SYSTEM_ERR"></Console><!--配置文件输出 --><File name="fileAppender" fileName="${logDir}\\log4j2.log"><!--配置文件输出格式 --><PatternLayout pattern="${pattern}"></PatternLayout></File></Appenders><!--配置logger --><Loggers><!--配置rootlogger --><Root level="info"><AppenderRef ref="consoleAppender"></AppenderRef><AppenderRef ref="fileAppender"></AppenderRef></Root></Loggers>
</configuration>
六、日志文件的拆分和压缩
<?xml version="1.0" encoding="UTF-8" ?>
<configuration><!--全局配置 --><properties><property name="logDir">F:\\project\\springboot_log</property><property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property></properties><!--配置appender --><Appenders><!--按照指定规则来拆分日志文件fileName:日志文件名字filePattern:日志文件拆分后文件的明明规则$${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹rolllog-%d{yyyy-MM-dd-HH-mm}-%i.log:为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复--><RollingFile name="rollingFile" fileName="${logDir}\\rolllog.log"filePattern="${logDir}/$${date:yyyy-MM-dd}/rolllog-%d{yyyy-MM-dd-HH-mm}-%i.log"><!-- 日志消息格式--><PatternLayout pattern="${pattern}"></PatternLayout><Policies><!--在系统启动时,触发拆分规则,产生一个日志文件--><OnStartupTriggeringPolicy></OnStartupTriggeringPolicy><!--按照文件的大小进行拆分 --><SizeBasedTriggeringPolicy size="1KB"></SizeBasedTriggeringPolicy><!--按照时间节点进行拆分,拆分规则就是 filePattern--><TimeBasedTriggeringPolicy></TimeBasedTriggeringPolicy></Policies><!--在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则 --><DefaultRolloverStrategy max="30"></DefaultRolloverStrategy></RollingFile></Appenders><!--配置logger --><Loggers><!--配置rootlogger --><Root level="info"><AppenderRef ref="rollingFile"></AppenderRef></Root></Loggers>
</configuration>
七、异步日志
log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应前面的Appender组件和Logger组件。
1. AsyncAppender方式
AsyncAppender方式是通过引用别的Appender来实现,当有日志事件到达时,会开启另外一个线程来处理它们。需要注意的是,如果在Appender的时候出现异常,对应用来说是无法感知的。
AysncAppender应该在它引用的Appender之后配置,默认使用java.util.concurrent.ArrayBlockingQueue实现而不需要其它外部的类库。当使用此Appender的时候,在多线程的环境下需要注意,阻塞队列容易受到锁争用的影响,这可能会对性能产生影响。这时候,我们应该考虑使用无锁的异步记录器(AsyncLogger).
2. AsyncLogger方式(最推荐混合异步)
AsyncLogger才是log4j2实现异步最重要的功能体现,也是官方推荐的异步方式。
它可以使得调用Logger.log返回的更快。可以有两种选择:全局异步和混合异步。
全局异步:所有的日志都异步的记录,在配置文件上不用做任何改动,只需要在jvm启动的时候增加一个参数即可实现。
混合异步:可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加灵活。虽然Log4j2提供一套异常处理机制,可以覆盖大部分状态,但是还是有一小部分的特殊情况是无法完全处理的,比如我们如果是记录审计日志(特殊情况之一),那么官方就推荐使用同步日志的方式,二对于其他的一些仅仅是记录一个程序日志的地方,使用异步日志将大幅提升性能,减少应用本身的影响。
混合异步的方式需要通过修改配置文件来实现,使用AsyncLogger标记配置
八、AsyncAppender方式异步日志
1. 实现步骤
1. 添加异步日志的依赖
<!--异步日志依赖 -->
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.3</version>
</dependency>
2. 在Appender标签中,对于异步进行配置,使用Async标签
<?xml version="1.0" encoding="UTF-8" ?>
<configuration><!--配置appender --><Appenders><!--控制台输出 --><Console name="consoleAppender" target="SYSTEM_OUT"></Console><!-- 配置异步--><Async name="myAsync"><!-- 将控制台输出异步的操作--><AppenderRef ref="consoleAppender"></AppenderRef></Async></Appenders><!--配置logger --><Loggers><!--配置rootlogger --><Root level="info"><AppenderRef ref="myAsync"></AppenderRef></Root></Loggers>
</configuration>
3. rootlogger引用Async,如上图
九、AsyncLogger-全局异步日志
全局异步:所有的日志都是异步的日志记录,在配置文件上不用做任何的改动。只需要在类路径resources下添加一个properties属性文件,做异步配置即可。
文件要求是:文件名必须为log4j2.component.properties
文件内容为键值对:Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
十、AsyncLogger-混合异步日志(推荐使用)
混合异步:可以在应用中同时使用同步日志和异步日志,这使得日志的配置和输出会更加的灵活。
需求:假设我们有自定义的logger -- com.atredhorse,让自定义的Logger是异步的。让rootLogger是同步的,也即其他包下是同步的。
<!--配置logger --><Loggers><!--自定义logger,让自定义的logger为异步logger--><!-- includeLocation="false" 表示取出日志记录中的行号信息,这个行号信息非常的影响日志记录的效率,生产中都不加这个行号additivity="false":表示不继承rootlogger--><AsyncLogger name="com.atredhorse" level="debug"includeLocation="false" additivity="false"><AppenderRef ref="consoleAppender"></AppenderRef></AsyncLogger><!--配置rootlogger --><Root level="info"><AppenderRef ref="consoleAppender"></AppenderRef></Root></Loggers>
总之:如果使用异步日志,AsyncAppender、AsyncLogger不要同时出现,没有这个需求,效果也不会叠加。如果同时出现,那么效率会以AsyncAppender为主。
AsyncLogger的全局异步和混合异步也不要同时出现,没有这个需求,效果也不会叠加。
日志门面和日志框架(日志实现框架log4j2)相关推荐
- Java日志门面- JCL和 常用日志门面SLFJ详解
使用日志门面的原因 目前经常用的日志框架技术有:JUL.Log4j.log4j2.logback用来记录日志信息 ,之前我们讲过,我们学习不同的日志框架.他们的API是不同的,这样难以进行有效的记忆, ...
- Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...
- Java各类日志门面(slf4j,commons-logging)和日志框架(log4j,logback)联系和区别
日志门面 1.Apache通用日志接口(commons-logging.jar) Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logg ...
- Java日志体系日志门面(Slf4j)日志实现(Log4j、Log4j2)详解
1.背景 近日发生两次因日志使用不当导致的线上问题: 1.应用明明配置了info日志级别,却打印大量的debug日志,导致磁盘IO较高,很快就报磁盘空间不足告警 2.应用服务启动后报StackOver ...
- 日志门面和日志框架(SpringBoot日志实现)
一.Springboot日志实现简介 SpringBoot是现今市场上最火爆用来简化spring开发的框架,springboot日志也是开发常用的日志系统.SpringBoot默认就是使用SLF4J作 ...
- 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)
文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...
- Java日志框架日志门面介绍
文章目录 一.日志 二.常见日志框架 历史 各大框架介绍 JUL Log4j(1999-2015) Logback(2006-?) Log4j2 Logback与Log4j2对比 三.日志门面 什么是 ...
- 日志--门面及实现框架 自用解析
日志 概述 日志文件是用于记录系统操作时间的文件集合.可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 调试日志 开发中使用日志能够更加灵活和方便的去重现开发中 ...
- 日志框架(3) : 日志门面、JCL介绍、SLF4J介绍
文章目录 日志门面 日志门面概述 门面模式(外观模式) 日志门面 常见的日志框架及日志门面 JCL简介 SLF4J SLF4J简介 SLF4J桥接技术 SLF4J特点 SLF4J集成日志实现(jul, ...
- 常用日志门面和日志实现
一.什么是日志门面和日志实现 日志是什么?日志:说明系统实时运行状态的信息. 比如:System.out.println()语句就是一种最低级的日志. 什么是日志门面和日志实现? 日志门面:是日志实现 ...
最新文章
- tcpdump移植和使用
- 微服务架构中配置中心的选择
- oracle存储过程、声明变量、for循环|转|
- 2021揭东一中今年高考成绩查询入口,2021年揭阳高考状元是谁分数多少分,历年揭阳高考状元名单...
- PHP中常见的几种运行代码的方式
- 自动化测试===unittest配套的HTMLTestRunner.py生成html报告源码
- MySQL高级 - 存储引擎 - 特性
- 覆盖索引最左前缀原则索引下推
- Struts2国际化
- tf.train.get_checkpoint_state
- oracle 删除数据_Oracle海量数据表标准删除方案--分步分阶段大表删除
- 火山安卓定义全局变量【博客教学】
- 欧美古风格html网站模板
- VIX 指数构造详细证明过程
- AR图书,看着很美其实有点坑
- 轻量级git服务gogs平台
- Python函数必须先定义、后调用(函数调用函数例外)
- 思科防火墙应用NAT
- 宏基服务器 安装系统,手把手教你acer宏碁笔记本电脑如何重装系统
- angularjs常见错误_AngularJS开发人员应避免的7大错误
热门文章
- 翻译必考知识点总结+瑞思拜翻译知识点(3,4和5)
- Python中读取txt文件的三种可行办法
- 学计算机网络的是理工男吗,最适合理工科男生的高薪专业
- 贵州医科大学本科毕业论文答辩PPT模板
- Collaborative Filtering--【U2U2I】
- Microsoft Office Pro Plus 2019(Project+Visio)X64/32 Multilingual
- IntelliJ IDEA 设置自动换行 + 热键
- Eulerian Video Magnification 原理与实现
- python制作烟花特效_用python做一个烟花show
- 初级会计 | 100%必考的初级10大高分公式!安排