log4j 2整理
# Log4j 2最佳实践 #
Log4j的1.x版本已经被广泛使用于很多应用程序中。然而,它这些年的发展已经放缓。它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架做了很多必要的改进。
```
1、首先移除log4j相关的jar包
<dependency>
...
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
2、添加slf4j和log4j 2的jar包
<!-- log4j2 依赖的jar包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
<scope>runtime</scope>
</dependency>
<!-- 与slf4j整合所需 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
<scope>runtime</scope>
</dependency>
<!-- web网站需要 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.1</version>
<scope>runtime</scope>
</dependency>
<!-- 异步使用的依赖 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
<scope>runtime</scope>
</dependency>
3、添加配置文件:log4j2.xml
# Log4j 2最佳实践 #
Log4j的1.x版本已经被广泛使用于很多应用程序中。然而,它这些年的发展已经放缓。它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架做了很多必要的改进。
```
1、首先移除log4j相关的jar包
<dependency>
...
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
2、添加slf4j和log4j 2的jar包
<!-- log4j2 依赖的jar包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
<scope>runtime</scope>
</dependency>
<!-- 与slf4j整合所需 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
<scope>runtime</scope>
</dependency>
<!-- web网站需要 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.1</version>
<scope>runtime</scope>
</dependency>
<!-- 异步使用的依赖 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
<scope>runtime</scope>
</dependency>
3、添加配置文件:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
首先看Configuration元素,log4j2框架自己也有一系列日志,比如框架初始化日志或者初始化失败日志什么的。
status表示应该记录哪个等级的log4j2自身的日志,一般情况下WARN就行,如果出现了了WARN等级的日志,就要及时排查排查了。
log4j2支持自动热更新配置文件,直接改log4j2的配置文件,它就能自动重新加载,monitorInterval表示应该多久检测一次更新,单位:秒,默认5秒。
-->
<Configuration status="WARN" monitorInterval="5">
<!-- 将一些常用值提取出来,然后在文件的其他部分通过${}的形式引用,这些值可以随便定义 -->
<Properties>
<!-- 定义日志文件根目录 -->
<Property name="logDir" value="d:/logs" />
<!-- 定义日志的通用格式 -->
<Property name="genericPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<!-- 定义日志分卷文件通用文件名形式 -->
<Property name="genericFilePattern" value="%d{yyyy-MM-dd}-%i" />
</Properties>
<!--
Appenders元素,官方文档表示有还有一种异步appender,写文件等使用同步即可,在做数据库插入等耗时操作时用,而且在多线程情况下有可能出现问题,不讨论那个。
官方文档有很多种类型的appender,但是平常工作中常用的也就是console类型和file类型的。
console类型appender没得选,只有这一种,结构很简单,不用多说。
file类型appender有多种类型,建议使用RollingRandomAccessFile类型,因为这种类型的fileAppender有缓存功能,效率比RollingFile高(网上很多教程都是几年前的了,用的还是RollingFile),所以只讨论这种类型。
fileName表示日志文件名
filePattern表示日志文件分卷的分卷文件的文件名(日志文件分卷就是某些情况,比如每天生成一个文件,或者单个日志文件超过100MB时自动分成多个日志文件)
fileName如果已.zip结尾表示启用压缩功能,那些分卷好的日志文件会被压缩,某些情况会很有用。如果不想启用压缩功能,就不要已.zip或者其他压缩文件后缀结尾。PatternLayout表示日志格式,不必多说。
Policies是触发日志文件分卷的条件。TimeBasedTriggeringPolicy表示按照时间来分卷
interval表示时间间隔,时间单位是从filePattern推导的,是filePattern中最小的时间的单位
比如上述示例中的filePattern为%d{yyyy-MM-dd},这个日期时间格式必须符合java日期时间规范,其中最小日期单位为dd,也就是天,推导出来也就是1天分一个日志文件出来,如果filePattern的配置为%d{yyyy-MM-dd HH:mm},最小单位是mm,也就是分钟,那就是1分钟分一个日志文件出来,如果interval为3,那就是3天一个日志文件和3分钟一个日志文件,推导规则就是如此。
SizeBasedTriggeringPolicy表示日志文件大小超过多大时对其进行分卷,size表示日志大小,单位推荐写MB,数值为大于0的整数,100 MB中间有个空格,推荐写上。DefaultRolloverStrategy表示分卷策略,只需要记住这个必须要配就行了,不必深究,max表示最多可以有多少个分卷文件,默认为7个,超出7个的日志分卷文件将被删除,也就是说可能导致重要日志丢失,所以该参数配大点,100000应该够了,compressionLevel表示压缩等级,值为0-9,只在filePattern以.zip结尾,也就是说压缩格式为zip时起作用,这也是为什么前面说建议压缩格式为zip。0表示不压缩,只打包为zip格式,9表示最高压缩比(个人测试1MB日志文件某些情况下能压缩到4KB左右)。如果不想启用压缩功能,前面说过,日志filePattern不以.zip结尾就行了,这时compressionLevel是不起作用的。 -->
<!-- appender们的定义,可以控制台、文件、发邮件、存数据库等等。常规情况下只用控制台和文件即可 -->
<!-- appender们的定义 -->
<Appenders>
<!-- 定义一个console类型定定义,如果需要,可以以这个为原型粘贴复制修改再定义适合自己的 -->
<Console name="app_console" target="SYSTEM_OUT">
<PatternLayout pattern="${patternLayout}" />
</Console>
<!-- debug及以上级别的日志都打印在一个文本中 -->
<RollingRandomAccessFile name="app_debug" fileName="${logDir}/app-debug.log"
filePattern="${logDir}/app-debug_${genericFilePattern}.log" append="true">
<Filters>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${patternLayout}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<DefaultRolloverStrategy max="1000000" compressionLevel="5" />
</RollingRandomAccessFile>
<!-- 只打印info -->
<RollingRandomAccessFile name="app_info_only" fileName="${logDir}/app-info.log"
filePattern="${logDir}/app-info_${genericFilePattern}.log" append="true">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${patternLayout}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy max="1000000" compressionLevel="5" />
</RollingRandomAccessFile>
</Appenders>
<!-- 定义logger们 -->
<Loggers>
<!-- 定义根logger,根logger是必须的,这里我把根logger定义为异步的,也可为定义为普通的同步的,但是注意在同步根logger和异步根logger中只能存在一个,不能两个都配置 -->
<asyncRoot level="debug">
<AppenderRef ref="app_console" />
</asyncRoot>
<!-- 普通的根logger,注意,跟上面的异步跟root同时只能存在一个 -->
<!-- <Root level="trace"> <AppenderRef ref="consoleAppender" /> </Root> -->
<!-- 定义一个普通的logger,这里我定义为异步的 -->
<!-- 定义一个普通的logger,这里我定义为异步的
additivity:表示是否将自己所管目录下的消息复制一份发送给父类(即rootLoggers)默认true
name:loggers监控的包名,比如com.sun.jdbc
lever:级别,只有大于等于该级别的才能被监听到
-->
<asyncLogger name="logtest" level="debug" additivity="false">
<AppenderRef ref="app_console" />
<AppenderRef ref="app_debug" />
<AppenderRef ref="app_info_only" />
</asyncLogger>
</Loggers>
</Configuration>
```
```
log4j 2整理的更多相关文章
- Ribbon 和 Eureka 积分
Ribbon 这是 Netflix 云服务的中间层宣布开放源代码项目,它的主要功能是提供客户机端软件的负载均衡算法,将 Netflix 中间层服务一起. Eureka 是 RESTfu ...
- 【重新整理】log4j 2的使用
一 概述 1.1 日志框架 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log ...
- log4j.properties 配置的学习整理
参考资料: log4j.properties:用来做什么的(日志) Log4j:由2部分组成 :loggers(记录器) ----日志的类别 appender(输出源) ...
- log4j个人使用整理
Log4j介绍: 略过. 配置: Eclipse项目中添加log4j.jar到lib下. 在bin目录下新建log4j.properties,编辑好log4j配置文件. 样例分析: log4j.roo ...
- log4j和commons- logging(好文整理转载)
一 :为什么同时使用commons-logging和Log4j?为什么不仅使用其中之一? Commons-loggin的目的是为 “所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱( ...
- log4j整理
<meta http-equiv="refresh" content="1"/> # log4j日志组件 #- SLF4J,一个**通用日志接口** ...
- 国外程序员整理的Java资源大全分享
Java 几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员 Andreas Kull 在其 Github 上整理了非常优秀的 Java 开发资源,推荐给大家. 译文由 Imp ...
- 基于java平台的常用资源整理
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
- log4j使用快速入门【转】
1.引言 在应用程序中添加日志记录总的来说基于三个目的: .监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作 .跟踪代码运行时轨迹,作为日后审计的依据 .担当集成开发环境中的调 ...
随机推荐
- Topshelf + Quartz2.5 创建基于windows服务
1.创建一个定时调度Quartz类 using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; u ...
- javascript js自执行函数
javascript 自执行函数 一.自执行函数几种写法: 写法一: ( function(){ //代码 } )(); 写法二: ( function(){ //代码 }()); 二.作用: 隔离 ...
- 《Thinking in Java》 10~
chapter 10 内部类(P191) 创建内部类 链接到外部类 内部类能访问器外围对象的所有成员,而不需要任何特殊条件. 使用.this与.new package cn.test; public ...
- OOP2(虚函数/抽象基类/访问控制与继承)
通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...
- python—Celery异步分布式
python—Celery异步分布式 Celery 是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...
- WebApplicationContext wac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());这句话的意思
在jsp中出现 提取的代码: <% WebApplicationContext wac = WebApplicationContextUtils .getWebApplication ...
- php tp5常用小知识
1. tp5 获取当前访问的模块名,控制器名,方法名 $request= \think\Request::instance(); $module = $request->module(); // ...
- (WIN7)delphi7运行关闭出现cannot creat file"C:\program file\borland\delphi7\bin\initcc32.exe拒绝访问
1. 程序右键,以管理权限运行.2. 将Delphi7目录只读取消.WIN7以上的操作系统正常运行程序不是以管理员方式运行的
- Python之freshman04
一.迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的 ...
- 【转】idea project中导入其他文件夹下的模块,可能出现java.io.FileNotFoundException: XXX.xml
在一个project 中导入一个java 模块, 我要执行该模块的main函数 ,在main函数中有一个 FileReader(“generatorConfig.xml”) 而generatorCon ...