log4j 怎么实现日志文件滚动更新_用了这么久的Log4j2日志框架,你真的理解吗?...

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Anyone else have no right to judge you, they may have heard things, but they feel less than what you experienced.

谁都无权评判你,他们也许听过你的事情,但他 们感受不到你所经历的一切 。

每日掏心话

人生的舞台上,生活可以成就一些人,但是,生活也可以打败一些人,关键是看你如何去对待它。

来自:蜗牛大师 | 责编:乐乐

链接:cnblogs.com/wuqinglong/p/9516529.html

f6d2b0f70cc675ea6ca0eaaa76c2d7da.png

程序员小乐(ID:study_tech)第 755 次推文 图片来自 Pexels

往日回顾:今日头条技术架构分析,看这篇就对了!

正文

1.日志框架

日志接口(slf4j)

slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)

日志实现(log4j、logback、log4j2)

  • log4j是apache实现的一个开源日志组件

  • logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现

  • log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

2.为什么需要日志接口,直接使用具体的实现不就行了吗?

接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是slf4j的包而不是具体某个日志框架中的包),即直接和接口交互,不直接使用实现,所以可以任意的更换实现而不用更改代码中的日志相关代码。

比如:slf4j定义了一套日志接口,项目中使用的日志框架是logback,开发中调用的所有接口都是slf4j的,不直接使用logback,调用是 自己的工程调用slf4j的接口,slf4j的接口去调用logback的实现,可以看到整个过程应用程序并没有直接使用logback,当项目需要更换更加优秀的日志框架时(如log4j2)只需要引入Log4j2的jar和Log4j2对应的配置文件即可,完全不用更改Java代码中的日志相关的代码logger.info(“xxx”),也不用修改日志相关的类的导入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)

使用日志接口便于更换为其他日志框架

log4j、logback、log4j2都是一种日志具体实现框架,所以既可以单独使用也可以结合slf4j一起搭配使用。

本文使用Log4j2作为slf4j的具体实现,引入的包如下:

org.slf4j
slf4j-api1.7.25org.apache.logging.log4j
log4j-slf4j-impl2.11.0org.apache.logging.log4j
log4j-core2.11.0org.apache.logging.log4j
log4j-api2.11.0

3.log4j2日志级别

从大到小依次是: off, fatal, error, warn, info, debug, trace, all

由于我们使用的是slf4j接口包,该接口包中只提供了未标有删除线的日志级别的输出。

4.log4j2配置文件的优先级

  • Log4j will inspect the log4j.configurationFile system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.

  • If no system property is set the properties ConfigurationFactory will look for log4j2-test.properties in the classpath.

  • If no such file is found the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.

  • If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.

  • If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.

  • If a test file cannot be located the properties ConfigurationFactory will look for log4j2.properties on the classpath.

  • If a properties file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.

  • If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.

  • If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.

  • If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.

5.对于log4j2配置文件的理解

配置文件结构:

  • Appdenders部分

  • Appender

  • Filter

  • Layout

  • Policies

  • Strategy

  • Appender

  • Loggers部分

  • Logger

  • RootLogger

6.对于Appender的理解

简单说Appender就是一个管道,定义了日志内容的去向(保存位置)。

配置一个或者多个Filter,Filter的过滤机制和Servlet的Filter有些差别,下文会进行说明。

  • 配置Layout来控制日志信息的输出格式。

  • 配置Policies以控制日志何时(When)进行滚动。

  • 配置Strategy以控制日志如何(How)进行滚动。

7.对于Logger的理解

简单说Logger就是一个路由器,指定类、包中的日志信息流向哪个管道,以及控制他们的流量(日志级别)

8.log4j2配置文件框架

配置文件格式

<?xml version="1.0" encoding="UTF-8"?>
// ...

9.Appender标签的实现类

其实这些标签都是类名或者类名去掉后缀。

Appender的常用的实现类有:

  • ConsoleAppender(Console)

  • FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)

  • RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)

打开这些实现类的源码,你一定会恍然大明白,括号中的是实现类在log4j2.xml配置文件中的标签名。

10.ConsoleAppender(Console)

该实现类会把日志输出到控制台中。

它有两种输出方式:

  • SYSTEM_OUT(System.out)

  • SYSTEM_ERR(System.err)

如果不配置,默认使用SYSTEM_OUT进行输出。括号中是调用的方法。

简单示例:

其它属性可以参见官方文档:

logging.apache.org/log4j/2.x/manual/appenders.html#ConsoleAppender

10-1.FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)

相同点:写入日志信息到文件

不同点:使用的I/O实现类不同,前者使用FileOutputStream,后者使用RandomAccessFile。

官方文档说是在bufferedIO=true(默认是true)的情况下后者比前者性能提升20% ~ 200%,不明觉厉,就用后者吧。

简单示例:

常用属性:

  • fileName:来指定文件位置,文件或目录不存在则会自动创建。

  • immediateFlush:是否每次写入都要立刻刷新到硬盘中。默认true,如果使用默认值可能会影响性能。

其它属性可以参见官方文档:

logging.apache.org/log4j/2.x/manual/appenders.html#RandomAccessFileAppender

10-2.RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)

这一对之间的区别与上一对之间的区别是一样的。

上一对的实现类不能进行日志滚动,所谓日志滚动就是当达到设定的条件后,日志文件进行切分。

比如:工程师想让系统中的日志按日进行切分,并且按月归档。

这时候这一对的作用就体现出来了。

简单示例:

<?xml version="1.0" encoding="UTF-8"?> filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log" >

1.filePattern:指定了日志滚动之后的文件命名格式,至于其中的{date:hh-mm}表达式下文介绍。

2.DefaultRolloverStrategy:指定了如何(How)进行翻滚,并且指定了最大翻滚次数(影响%i参数值),超过次数之后会按照相应的规则删除旧日志。

3.Policies: 这里就是规定了何时进行滚动(When),可以有多个Policy。

  • CronTriggeringPolicy设置了每 5s 进行一次翻滚

  • SizeBasedTriggeringPolicy设置了的话,如果当前文件超过了10MB,但是文件的名字还没有进行翻滚(建立新文件),那么就会用%i的方式进行翻滚。

10-3.翻滚示例

app.log

第一次翻滚:app.log app.1.log // app.log -> app.1.log
第二次翻滚:app.log app.1.log app.2.lop // app.log -> app.2.log
第三次翻滚:app.log app.1.log app.2.lop app.3.lop // app.log -> app.3.log
第四次翻滚:app.log app.1.log app.2.lop app.3.lop app.4.lop // app.log -> app.4.log

一直到设定的翻滚次数10之后,会把旧的日志内容覆盖。

app.2.lop -> app.1.lop
app.3.lop -> app.2.lop
...
app.10.lop -> app.9.lop
app.log -> app.10.lop

一直这样循环下去,直到创建新文件。

11.Filters

Filters决定日志事件能否被输出。过滤条件有三个值:ACCEPT(接受),DENY(拒绝),NEUTRAL(中立)。

11-1.常用的Filter实现类有

  • LevelRangeFilter

  • TimeFilter

  • ThresholdFilter

11-2.上文中提到log4j2中的Filter与Servlet中的有差别。那么有什么差别呢?

简单说就是log4j2中的过滤器ACCEPT和DENY之后,后续的过滤器就不会执行了,只有在NEUTRAL的时候才会执行后续的过滤器。

11-3.简单示例

测试代码:

public class LogMain {
private static Logger logger = LoggerFactory.getLogger(LogMain.class);
public static void main(String[] args) throws Exception {
logger.trace("trace Msg.");
logger.debug("debug Msg.");
logger.info("info Msg.");
logger.warn("warn Msg.");
logger.error("error Msg.");
}
}

配置文件:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值