请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?

[复制链接]
查看: 15|回复: 0

5440

主题

4872

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14646
发表于 2020-1-14 09:56 | 显示全部楼层 |阅读模式
作者:蜗牛大家
根源:cnblogs.com/wuqinglong/p/9516529.html
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.slf4jslf4j-api1.7.25org.apache.logging.log4jlog4j-slf4j-impl2.11.0org.apache.logging.log4jlog4j-core2.11.0org.apache.logging.log4jlog4j-api2.11.03.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设备文件的大白

设备文件结构:


我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


6.对于Appender的大白

简单说Appender就是一个管道,界说了日志内容的去处(保存位置)。
设备一个大要多个Filter,Filter的过滤机制和Servlet的Filter有些不同,下文会举行说明。

  • 设备Layout来控制日志信息的输出格式。
  • 设备Policies以控制日志何时(When)举行转动。
  • 设备Strategy以控制日志怎样(How)举行转动。
7.对于Logger的大白

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

设备文件格式
//...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举行输出。括号中是挪用的方式。
简单示例:


我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


此外属性可以拜见官方文档:
http://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%,不明觉厉,就用后者吧。
简单示例:
我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


常用属性:

  • fileName:来指定文件位置,文件或目录不存在则会自动建立。
  • immediateFlush:能否每次写入都要立即革新到硬盘中。默许true,假如利用默许值大要会影响性能。
此外属性可以拜见官方文档:
http://logging.apache.org/log4j/2.x/manual/appenders.html#RandomAccessFileAppender
10-2.RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)

这一对之间的区分与上一对之间的区分是一样的。
上一对的实现类不能举行日志转动,所谓日志转动就是当到达设定的条件后,日志文件举行切分。
比如:工程师想让系统中的日志按日举行切分,而且按月归档。
这时候这一对的感化就表现出来了。
简单示例:
我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


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.lopapp.3.lop->app.2.lop...app.10.lop->app.9.lopapp.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.简单示例

测试代码:
publicclassLogMain{privatestaticLoggerlogger=LoggerFactory.getLogger(LogMain.class);publicstaticvoidmain(String[]args)throwsException{logger.trace("traceMsg.");logger.debug("debugMsg.");logger.info("infoMsg.");logger.warn("warnMsg.");logger.error("errorMsg.");}}设备文件:


我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


输出结果:
17:51:53.546[main]INFOme.master.snail.log.LogMain-infoMsg.17:51:53.548[main]WARNme.master.snail.log.LogMain-warnMsg.17:51:53.548[main]ERRORme.master.snail.log.LogMain-errorMsg.假如当前时候不是 8点~8点半 之间,那末没有日志会输出。
这里的info Msg.、warn Msg.和error Msg.为什么会输出呢?
是由于LevelRangeFilter对它们举行了ACCEPT,而剩下的trace Msg.和debug Msg.则会经过下一个过滤器,然后依次类推。
12.PatternLayout

这是常用的日志格式化类,此外日志格式化类很少用。
关于此外日志类,可以翻开PatternLayout类,找到其父类AbstractStringLayout, 看父类的实现类有哪些。
简单示例:
授人以鱼不如授人以渔。关于pattern的格式点击
http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
具体的此外属性可以看源码也可以参考官方文档。
13.Policy & Strategy

上文也说了,Policy是用来控制日志文件何时(When)举行转动的;Strategy是用来控制日志文件怎样(How)举行转动的。
假如设备的是RollingFile或RollingRandomAccessFile,则必须设备一个Policy。
假如想按月归档,按日切分日志,然后
13-1.Policy常用的实现类:


  • SizeBasedTriggeringPolicy
  • CronTriggeringPolicy
  • TimeBasedTriggeringPolicy
13-1-1.SizeBasedTriggeringPolicy

按照日志文件的巨细举行转动。
单元有:KB,MB,GB
13-1-2.CronTriggeringPolicy

利用Cron表达式举行日志转动,很灵活。
13-1-3.TimeBasedTriggeringPolicy

这个转动计谋依靠于filePattern中设备的最具体的时候单元,按照最具体的时候单元举行转动。
这类方式比力简便。CronTriggeringPolicy计谋更强大。
简单示例:


我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


13-2.Strategy常用的实现类


  • DefaultRolloverStrategy
  • DirectWriteRolloverStrategy
这两个Strategy都是控制怎样举行日志转动的,至于他们的区分我照旧不太大白,大佬表白一下吧。
平常大部分用DefaultRolloverStrategy便可以了。
14.Logger

Logger部分就比力简单了,分为两个Logger:

  • Root(必须设备)
  • Logger
简单示例:
我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


留意:Logger中也可以加过滤器的哟~
14-1.比力严重的题目: 日志反复打印

假如Root中的日志包含了Logger中的日志信息,而且AppenderRef是一样的设备,则日志会打印两次。
留意:有两个条件

  • Root中的日志包含了Logger中的日志信息
  • 且AppenderRef是一样的设备
这时候我们需要利用一个Logger的属性来打点,那就是additivity,其默许值为true,需要设备为false。
我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


15.Lookups

这个组件类似于JSTL的EL表达式,大要类似于Spring的SpEL表达式。
具体的语法很简单,这里就不粘贴复制了,检察官方文档:
http://logging.apache.org/log4j/2.x/manual/lookups.html
信任你用半个小时就学会了。
16.示例

为了大家快速开辟(方便怠惰的同学),写一些示例。
16-1.输出到控制台



我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


16-2.输出到单个文件

16-3.按月归档日志,按日举行切分,限制单文件巨细为 500MB, 一天最多天生20个文件,也就是(20 * 500)MB巨细的日志



我的关键词 你用了这么久的Log4j2日志框架,真的对它有自己的理解吗?  qq签名


16-4.限制Spring框架日志的输出级别

学会以上这些大白和方式,信任便可以熟练利用了,加油!

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 qq友乐园-q友乐园情侣头像-qq头像-男生头像-女生头像-网名-扣扣个性签名 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表