1. 首页 > 经典游戏 >

log4j2使用 log4j2使用占位符

最近由于项目的需要,我们把 log4j 1.x 的版本全部迁移成 log4j 2.x 的版本,那随之而来的 slf4j 整合 log4j 的配置( 使用 Slf4j 集成 Log4j2 构建项目日志系统的完美解决方案 )以及 log4j2 配置文件的详解,就需要我们来好好聊一聊了。本文就专门来讲解下 log4j2.xml 配置文件的各项标签的意义。

log4j2使用 log4j2使用占位符log4j2使用 log4j2使用占位符


log4j2使用 log4j2使用占位符


log4j 2.x 版本不再支持像 1.x 中的 .properties 后缀的文件配置方式, 2.x 版本配置文件后缀名只能为 .xml , .json 或者 .jsn 。系统选择配置文件的优先级(从先到后)如下:

我们一般默认使用 log4j2.xml 进行命名。如果本地要测试,可以把 log4j2-test.xml 放到 classpath ,而正式环境使用 log4j2.xml ,则在打包部署的时候不要打包 log4j2-test.xml 即可。

log4j2是log4j 1.x 的升级版,参考了logback的一些的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

之前看文档摘抄了一些概念,这里懒得翻译了,使用log4j的都应该清楚,这里只是mark下。

log4j2的特点就是异步日志,其性能的提升主要也是从异步日志中受益,我们来看看如何使用log4j2的异步日志。

Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应前面我们说的Appender组件和Logger组件。注意这是两种不同的实现方式,在设计和源码上都是不同的体现。

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

AsyncAppender有一些配置项,如下:

除此之外还有一些其他的细节,如果感兴趣可以参考文档,这里就不一一列举了。

AsyncLogger才是log4j2 的重头戏,也是的异步方式。它可以使得调用Logger.log返回的更快。你可以有两种选择:全局异步和混合异步。

全局异步

配置文件不用动:

在系统初始化的时候,增加全局参数配置:

你可以在你次获取Logger之前设置,也可以加载JVM启动参数里,类似

混合异步

混合异步只需要修改配置文件即可:

在上面示例的配置中,root logger就是同步的,但是com.foo.Bar的logger就是异步的。

在使用异步日志的时候需要注意一些事项,如下:

4、如果不是确实需要,不要打印location信息,比如HTML的location,或者pattern模式里的%C or $class, %F or %file, %l or %location, %L or %line, %M or %mod, 等,因为Log4j需要在打印日志的时候栈的快照才能获取这些信息,这对于性能来说是个极大的损耗。

关于性能测试,大家可以直奔,哪里有很详细的数据,这里给个图:

虽然我测下来,在immediateFlush设置为false的情况下,同步异步不了多少,但可能是我的测试条件不符合的,从设计和原理上来说,异步日志,无疑是个的选择。

总的来说,看了一遍log4j的文档,对日志系统有了个比较全面的了解,以前只是copy配置来改改,没关注过很多细节,这次算是扫盲了一次。文章也只是做了个介绍,在实际使用中,还是要细细研究下配置。

另外,个人觉得异步模式无非就是在原来同步写盘的前提下,增加消息队列作为缓存,或者交个另一个线程去做,这理论上除了带来一些额外的,较小的cpu和内存的开销,应该会在高流量的时候带来不小的性能提升,对比下来,log4j2无疑是当下最值得使用的日志组件来,且可以使用其异步模式。

当然了,也不能说异步就一定好,如果日志的流量不是特别大,磁盘性能又跟得上,没有必要一定使用异步日志。

本文介绍Log4j2进阶使用,

基本使用请参考 Log4j2基本使用入门 。

本文基于上面的基本使用入门,

主要介绍按照日志大小和时间备份日志,

并且限制备份日志的个数,

以及删除过期的备份日志。

由于日志信息是不断追加到日志文件的,

经过一段时间会导致日志文件很大,

所以需要及时分割过大的日志文件,

以及限制日志文件占用的硬盘空间,

及时清理掉不用的过期的日志文件。

RollingFileAppender能实现上面提出的需求,

它需要配置TriggeringPolicy和RolloverStrategy,

TriggeringPolicy触发策略决定何时执行备份,

RolloverStrategy翻转策略决定如何执行备份。

如果没有配置RolloverStrategy翻转策略,

RollingFileAppender将使用DefaultRolloverStrategy,

而且DefaultRolloverStrategy支持自定义删除文件作。

LOG_HOME用于指定当前日志存放的目录,

LOG_BACKUP用于指定备份日志存放的目录,

FILE_NAME用于指定日志文件的名称。

在需要的地方使用${LOG_HOME}引用即可。

本章通过配置log4j2.xml,

实现如下目标:

最多保存3个日志备份文件,

每个日志文件大小不超过1MB。

这里增加了一个类型为RollingFile的Appender,

name为RollingSizeFile,

FileName为${LOG_HOME}/${FILE_NAME}.log,

指定了当前正在打印的日志文件名称,

和文件存放的相对路径;

filePattern为${LOG_HOME}/${LOG_BACKUP}/${FILE_NAME}-%i.log,

指定了备份后的日志文件名称和存放路径,

其中%i表示备份文件名按照正整数开始递增。

SizeBasedTriggeringPolicy策略指定了文件大小:

当日志文件达到1MB时生成备份文件,

大小以字节为单位指定,

后缀为KB、MB或GB,例如1GB。

如果不填,默认值为10MB。

AppenderRef指定打印日志到新增的name为RollingSizeFile的Appender。

运行测试程序,

打印一段时间的日志,

在项目下会生成如下目录和文件:

可以看到logs目录下有test.log文件和backup目录,

backup目录下有test-1.log等7个备份文件,

而且每个文件的大小都是1MB。

上面由于没有配置RolloverStrategy滚动策略,

RollingFileAppender使用DefaultRolloverStrategy,

DefaultRolloverStrategy默认最多保存7个备份文件。

RollingFile中增加DefaultRolloverStrategy默认滚动策略,

并且指定最多保存3个备份文件:

修改后效果如下:

本章通过配置log4j2.xml,

实现如下目标:

每1分钟备份一次日志文件,

删除3分钟前备份的日志文件。

这里的配置和第4步中略有不同,

name为RollingTimeFile,

主要是filePattern、TimeBasedTriggeringPolicy配置不一样,

filePattern为${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}.log,

其中$${date:yyyy-MM}指定了备份文件存放的目录为当前年月,

比如目录2019-09,而不是backup了,

${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}.log指定了备份后的日志文件名称,

到分钟的一个时间戳。

TimeBasedTriggeringPolicy策略指定了生成备份文件的策略。

这个配置要和filePattern结合使用,

上面filePattern中的命名规则是${FILE_NAME}-%d{yyyy-MM-ddHH-mm}.log,

最小的时间粒度是mm,即分钟,

而TimeBasedTriggeringPolicy设置的interval是1,

结合起来就是每1分钟生成一个新文件。

同理,如果要每1小时生成一个新文件,

则改成%d{yyyy-MM-ddHH},最小粒度为小时,

如果再把interval该为12,

那就是每12小时生成一个新文件。

AppenderRef指定打印日志到新增的name为RollingTimeFile的Appender。

运行测试程序,

打印一段时间的日志,

在项目下会生成如下目录和文件:

可以看到logs目录下有test.log文件和2019-09备份目录,

2019-09目录下有test-2019-09-27-17-20.log等14个备份文件,

而且每个文件的大小都不一样,与该时间段内打印的日志多少有关。

随着时间推移会生成2019-10之类的目录,

而且目录下的备份文件也会越来越多。

RollingFile中增加DefaultRolloverStrategy策略,

删除3分钟前备份的日志文件:

Delete表示删除满足条件的文件,

basePath指定了需要处理的日志目录,

因为备份的日志在basePath下的年月目录($${date:yyyy-MM}),

所以maxDepth设置为2,代表扫描的目录深度,

maxDepth="1"表示当前目录。

指定文件名称:

匹配二级目录下的扩展名为.log的文件。

指定文件过期时间:

age的单位:D、H、M、S,分别表示天、小时、分钟、秒。

匹配修改时间为3分钟前的文件。

修改后效果如下:

查看目录时的当前时间是2019-09-29 15:44,

可以看到只保存了3分钟内生成的3个日志,

随着时间的推移,

生成新日志test-2019-09-29-15-44.log,

删除旧日志test-2019-09-29-15-41.log,

该目录下始终只有当前时间3分钟内的备份日志。

可以把按大小和时间备份结合起来使用,

实现更复杂的日志文件备份需求。

本章通过配置log4j2.xml,

实现如下目标:

每1分钟备份一次日志文件,

每个日志文件大小不超过1MB,

如果在1分钟内日志文件超过1MB,

则生成以当前时间+序号的备份日志,

但是每分钟内最多保存3个备份日志,

并且删除5分钟前备份的日志文件。

大部分配置和上面说过的一致,

就是简单的组合起来即可,

需要注意的是filePattern:

备份文件名${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}-%i.log结合了时间和序号。

运行测试程序,

打印一段时间的日志,

在项目下会生成如下目录和文件:

看到2019-09目录下只有5分钟内的备份日志,

每分钟的备份日志最多有3个文件,

根据日志具体打印的情况,

少的时候可能1分钟只有1或者2个文件,

多的时候最多也只有3个文件,

在这1分钟内后生成的日志会覆盖掉前面的。

下面给出完整的配置文件,

供大家开发时参考使用:

slf4j+log4j2基础教程(拿来即用教程)

log4j2 RollingRandomAccessFile配置

log4j2 入门教程

日志打印是了解Web项目运行的最直接方式,所以在项目开发中是需要首先搭建好的环境。

1、Log4j2特点

1)核心特点

相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高;并发的特性,减少了锁的发生。

2)性能测试

2、日志打印之外观模式

每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,增加应用程序代码和日志框架的耦合性。

《阿里巴巴Ja开发手册》,其中有一条规范做了『强制』要求:

SLF4J日志API

Ja简易日志门面(Simple Logging Facade for Ja,缩写SLF4J),是一套包装Logging 框架的界面程式,使用外观模式实现。

1、项目结构

2、不同环境的日志配置

使用最直接的方式,不同环境加载不同的日志配置。

1)开发环境配置

2)生产环境配置

3、Log4j2的配置文件

1、简单的测试程序

2、测试效果图

四、源代码地址

在同步日志模式下, Logback的性能是最糟糕的,log4j2的性能无论在同步日志模式还是异步日志模式下都是的。本章主要介绍Spring Boot如何集成并配置使用Log4j2

引入Log4j2依赖包,其它依赖和Logback一样,使用SLF4J统一输出

然后需要在resource下面添加log4j2.xml配置文件,当然了如果你不添加,springboo会提示你没有对应文件,并使用默认的配置文件,这个时候级别可以在application.properties中配置

和logback配置类似,主要是含有loggers、appenders,其中loggers由logger,root组成。appenders由console(控制台),File、RollingFile(输出文件)组成,作用和配置和logback不多

(1)Console

用来定义输出到控制台的Appender,主要设置输出格式和ll级别

ThresholdFilter: 定义打印级别,onMiatch值设置是否拒绝其它

(2)File

用来定义输出到指定位置的文件的Appender

(3)RollingFile

用来定义超过指定条件自动删除旧的,创建新的Appender

参数说明:

Root用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

参数说明:

变量配置,类似常量定义

默认情况下springboot是不将日志输出到日志文件中,这里对日志框架的支持有两种配置方式(和logback一样):

(1)application.properties 或 application.yml (系统层面)

(2)logback-spring.xml (自定义文件方式)

默认名log4j2-spring.xml,可以省下在application.yml中配置,如果自定义了文件名,需要在application.yml中配置

此种方式可以处理比较复杂的情况,比如区分 和 error 日志、每天产生一个日志文件。

通过在DefaultRolloverStrategy 标签下添加Delete标签实现,保留7天的日志

IfLastModified .age要和filePattern的时间一致, 否则貌似无效.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息