纷乱日志框架,你选谁?

#why has these blogs

最近在弄项目重构的事情,其中各种项目之间因为时间以及技术选型的问题的日志使用的框架以及版本不一样,各个打印的信息日志也不规范,之前是使用过最多的是log4j系列的日志框架,但log4j2的新特性以及带来的好处并不是很清楚,其实对日志框架中的架构以及实现的机制特别好奇,于是想写关于日志的一些的博客,沉淀下自己,学习架构以及源码提升自己的内力,再者分享给大家,一块学习交流,俗话说,独乐乐不如众乐乐,欢迎大家拍砖。(附图是几个项目中日志框架的情况)

log4j 1.x版本logbacklog4j2版本

#前言

日志框架林林总总,包括 log4j 、logback、log4j 2以及jdk中提供的JUL等等,面对这么多的选择,结合使用的场景,选择一种作为记录日志的工具,这还是一件值得考虑的事情。这就如同作为一位男嘉宾站到非诚勿扰(当然现在改名叫 缘来非诚勿扰) 的舞台上面对场上的24位女嘉宾的时候,得去选择一位你心仪的女嘉宾,如果事先不了解,那就一般只能按照颜值以及之前的表现来选择;但有所了解的话,那选择的维度就会不一样。

选择适合的日志框架亦是如此,这将介绍以及比较各种日志框架的优劣势,给大家提供些借鉴,有不妥之处,请留言指正,欢迎交流学习,共同探讨。(注:博客将介绍各种框架的配置示例,log4j2的配置及使用会是重点,后期也将对logback以及log4j2的架构和源码进行学习探讨)

#JUL

Java提供了自己的日志框架,类似于Log4J,但是API并不完善,对开发者不是很友好,而且对于日志的级别分类也不是很清晰,所以不推荐使用这种方式输出日志。

####创建方式:

static Logger getLogger(String name) 为指定子系统查找或创建一个 logger

static Logger getLogger(String name, String resourceBundleName) 为指定子系统查找或创建一个 logger ####日志级别:

  • SEVERE(最高值)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST(最低值)

#log4j 1.x

Log4j是Apache的一个开放源代码项目,通过使用Log4j,可以控制日志信息输送的目的地是控制台、文件、数据库等;也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。

####日志级别:

7种不同的log级别,按照等级从低到高依次为:TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF;

如果配置为OFF级别,表示关闭log。
####配置方式: Log4j支持两种格式的配置文件:properties和xml,主要包含的组件:Logger、appender、Layout ####配置示例: <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE"> <!--增加控制台appender--> <param value="System.err" name="Target" /> <layout class="org.apache.log4j.PatternLayout"> <!--日志格式--> <param value="[framework] %d -%-4r [%t] %-5p %c %x - logid-%X{logid} - %m%n" name="ConversionPattern" /> </layout> </appender> <appender name="statAsyncAppender" class="org.apache.log4j.AsyncAppender"> <appender-ref ref="statAppender"/> </appender> <logger name="statAccesslog" additivity="false"> <!--appender关联至logger对象--> <level value="debug" /> <appender-ref ref="statAccessAppender" /> </logger> <logger name="org.springframework" additivity="true"> <!--指定包的日志级别--> <level value="error" /> </logger> <root> <level value="info" /> <appender-ref ref="CONSOLE" /> </root> </log4j:configuration>

#logback

一个“可靠、通用、快速而又灵活的Java日志框架”,logback当前分成三个模块:logback-core,logback- classic和logback-access。

logback-core是其它两个模块的基础模块,logback-classic是log4j的一个改良版本,此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。ogback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。(后续学习高级特性以及源码将详细介绍三个模块) ####特点&优势 详细介绍可参见官网:http://logback.qos.ch/reasonsToSwitch.html

  1. 速度:比log4j要快大约10倍且消耗更少的内存;
  2. 迁移成本低:logback-classic模块直接实现了SLF4J的接口,迁移到logback几乎零开销;
  3. 支持groovy配置格式:同时支持xml以及groovy格式的配置文件,groovy风格更加直观,简洁;
  4. 热部署:logback-classic检测到配置文件的更新,自动重新加载配置文件;
  5. 及时恢复:优雅的从I/O异常中恢复,无需重新启动应用程序恢复logger;
  6. 历史日志:根据上限值或者周期自动删除历史日志文件;
  7. 压缩日志:支持自动压缩日志文件。
  8. 条件判断支持:支持条件判断(if-then-else),可避免不同的环境配置文件的重复;
  9. 强大过滤支持:拥有更多filter,执行相应过滤操作;
  10. 系统集成:logback-access和Jetty、Tomcat集成提供了功能强大的HTTP-access日志;

####加载配置 resources目录下建立logback.xml文件,加载配置文件顺序是:logback先查找logback.groovy文件;若未找到,则查找logback-test.xml文件;若未找到,则查找logback.xml文件;若仍未找到,则使用默认配置(打印到控制台) ####配置示例 <configuration>
<Properties> <!---设置property属性--> <Property name="LOG_FILE">app.log</Property> </Properties> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--定义控制台appender--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--增加 filter--> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <charset>UTF-8</charset> <pattern>%d [%thread] %-5level %logger{68} %line - logId[%X{client}] - %msg%n</pattern> </encoder> </appender> <appender name="testAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>/opt/data/app.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--历史日志处理策略--> <!-- rollover daily --> <fileNamePattern> <fileNamePattern>/history/%d{yyyy-MM,aux}/${LOG_FILE}_%d</fileNamePattern> </fileNamePattern> <maxHistory>60</maxHistory> <cleanHistoryOnStart>false</cleanHistoryOnStart> </rollingPolicy> <encoder> <charset>UTF-8</charset> <pattern>%d [%thread] %-5level %logger{68} %line - logId[%X{client}] - %msg%n</pattern> </encoder> </appender> <logger name="cn.test"> <level value="INFO"/> <appender-ref ref="testAppender"/> </logger> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration> 其它详细配置可以参见官网:http://logback.qos.ch/manual/

#log4j2

Apache软件基金会最近发布了Log4j 2.0通用版本,相比之前Log4j的1.x版本有了很大的性能提升。本版本的灵感来自于诸如Log4j 1.x和java.util.logging之类的已有日志解决方案,它是经过了数年的努力从头开始编写完成的。

Log4j 2.0引入了新的插件系统、对properties的支持、对基于 JSON配置的支持和配置的自动化重载。它支持很多已有的日志框架,包括SLF4J、Commons Logging、Apache Flum、Log4j 1.x,并提供了新的程序员API。

在Asynchronous Logging这块确实有较大的性能提升,关于性能这块官网专门有个章节介绍,可以参考官网的数据统计:http://logging.apache.org/log4j/2.x/performance.html log4j2-性能(摘自官网)

####加载配置

与logback相似,log4j可以支持多种格式的配置文件,包括,log4j2也有自身加载配置的一套机制,总结下来:log4j2先找log4j.configurationFile指定路径的配置文件,若尚未配置,则找classpath下以log4j-test为前缀的配置文件,若没发现,再找classpath下找以log4j2为前缀的配置文件,还没有的话,则会使用DefaultConfiguration,将error级别日志输出至控制台,具体加载顺序如下:

  1. 读取系统属性log4j.configurationFile配置指定路径的配置文件;
  2. 若没有,则找 classpath下log4j2-test.properties;
  3. 若没有,则找 classpath下 log4j2-test.yaml or log4j2-test.yml;
  4. 若没有,则找 classpath下 log4j2-test.json or log4j2-test.jsn;
  5. 若没有,则找 classpath下 log4j2-test.xml;
  6. 若没有,则找 classpath下 log4j2.properties;
  7. 若没有,则找 classpath下 log4j2.yaml or log4j2.yml;
  8. 若没有,则找 classpath下 log4j2.json or log4j2.jsn;
  9. 若没有,则找 classpath下 log4j2.xml;
  10. 若没有,则启用默认配置,将error级别日志输出至控制台;

官方解释如下: log4j自动加载配置

####配置示例 <Configuration status="WARN" monitorInterval="30"> <!--配置自动加载更新,周期30s,最小周期为5s--> <Properties> <Property name="testProperty">test.log</Property> <!--设置配置本身property属性--> </Properties> <Appenders> <RollingFile name="Console" fileName="stdout.log" filePattern="stdout.log.%d{yyyy-MM-dd}"> <PatternLayout pattern="${testProperty} %d{yyyy-MM-dd HH:mm:ss.SSS} test_log %-5level %C{36} %logger{36} %line - logid-%X{logid} - %msg%n"/> <!--引用testProperty变量--> <Policies> <!--日志文件处理策略--> <TimeBasedTriggeringPolicy /> <!--时间策略--> </Policies> <DefaultRolloverStrategy> <Delete basePath="/"> <IfFileName glob="stdout.log.*"></IfFileName> <IfLastModified age="2d"></IfLastModified> <!--保留两天--> </Delete> </DefaultRolloverStrategy> </RollingFile> <Loggers> <Logger name="com.foo.Bar" additivity="false"> <!--是否向上叠加日志--> <AppenderRef ref="Console"/> </Logger> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> 问题记录

  • 加载非classpath下的log4j2.xml

问题:在某些场景下,会将log4j2的配置文件打包至根目录下,这时项目启动会无法加载到log4j2的配置文件而导致日志无法打印; log4j_outer_config

解决方案:配置环境变量log4j.configurationFile,项目启动的时候,让log4j去指定的目录加载相应的配置文件;上面提到的问题,加上如下参数即可:-Dlog4j.configurationFile=../log4j2.xml;

#后记

程序员是一群善于自嘲,踏实奋进的群体,在别人眼中是"猿人",却改变着世界以及生活,总是低调谦虚好学,我很高兴是群体中一员并对技术怀揣着无限热情,今天正好是公元2016年10月24日,1024 Engineer's Day,祝各位节日快乐,升职加薪早日找到白富美,踏上人生巅峰~~~(昨日与女友吵架,心情不美丽,博客未完待续......)

转载于:https://my.oschina.net/LovingIT/blog/774707

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值