Java日志体系详细总结

1,035 阅读5分钟
原文链接: mp.weixin.qq.com

JAVA常用的日志打印组件

1、概述

眼下java应用日志收集都是採用日志框架(slf4j、apache commons logging)+日志系统(log4j、log4j2、LogBack、JUL等)的方式。而针对在分布式环境须要实时分析统计的日志,一般採用apache flume、facebook scribe等分布式日志收集系统。

日志框架:提供日志调用的接口,实际的日志输出托付给日志系统实现。
  • JCL(Jakarta Commons Logging):比較流行的日志框架,非常多框架都依赖JCL,比如Spring等。

  • SLF4j:提供新的API,初衷是配合Logback使用,但同一时候兼容Log4j。

Apache Commons Loging (JCL)

Commons Loging 本身只提供日志接口,具体实现在运行时动态寻找对应组件?比如:log4j、jdk14looger 等。但这种动态绑定的方式当系统特别宠大的时候会出现绑定失败的问题。现在比较流行的slf4j 基于静态绑定的方式解决了这个问题?

slf4j

sl4j 本身也只提供日志接口,与commons loging 不同的是其采用在classPath 加入以下jar包来表示具体采用哪种实现 :

  • slfj-log4j12.jar (表示指定 log4j)

  • slf4j-jdk14.jar(表示指定jdk Looging)

  • slf4j-jcl.jar(表示指定jcl)

  • log4j-slf4j-impl(表示指定log4j2)

  • logback-classic(表示指定logback)

日志系统:负责输出日志
  • Log4j:经典的一种日志解决方式。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们能够通过配置文件轻松的实现日志系统的管理和多样化配置。

  • Log4j2:Log4j的2.0版本号。对Log4j进行了优化。比方支持參数API、支持异步appender、插件式架构等

  • Logback:Log4j的替代产品。须要配合日志框架SLF4j使用

  • JUL(java.util.logging):JDK提供的日志系统。较混乱,不经常使用

日志框架 介绍
jul(java.util.logging) jdk1.4加入,为了对抗log4j,效率灵活性较差使用较少
log4j 最广泛应用的日志框架,成为事实上的标准
logback 基于slf4j-api接口实现,性能高于log4j
log4j2 重写了log4j,性能高于log4j,logback
眼下我们的应用大部分都是使用了SLF4j作为门面,然后搭配log4j或者log4j2日志系统。

其他日志框架统一转换为slf4j

日志体系各种包总结

日志框架
log4j 只有log4j
log4j2 log4j-api(日志接口),log4j-core(log4j-api的实现)
logback logback-core(logback核心包),logback-classic(slf4j-api的实现)
commons-logging commons-logging (jcl),log4j-jcl(commons-logging到log4j的桥梁),jcl-over-slf4j(commons-logging到slf4j的桥梁)
- slf4j
  • slf4j转向某个实际日志框架:

  • slf4j-jdk14:slf4j到jdk-logging的桥梁

  • slf4j-log4j12:slf4j到log4j1的桥梁

  • log4j-slf4j-impl:slf4j到log4j2的桥梁

  • logback-classic:slf4j到logback的桥梁

  • slf4j-jcl:slf4j到commons-logging的桥梁

  • 某个实际日志框架转向slf4j:

  • jul-to-slf4j:jdk-logging到slf4j的桥梁

  • log4j-over-slf4j:log4j1到slf4j的桥梁

  • jcl-over-slf4j:commons-logging到slf4j的桥梁

jcl与日志框架的集成

slf4j与日志框架的继承

log4j2.xml配置示例

<?xml version="1.0" encoding="UTF-8" ?><Configuration status="error">
    <!-- 定义输出源 -->
    <Appenders>
        <Console name="Console" target="SYSTEM_ERR">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
        </Console>
        <!--  测试环境使用-->
        <File name="file" fileName="logs/all.log" append="false">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
        </File>
        <RollingFile name="rollingFile" fileName="logs/all-2.log"
                     filePattern="logs/?{date:yyyy-MM-dd}/all-%d{yyyy-MM-dd-HH}-%i.zip">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="2 KB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>


        <RollingFile name="errorRollingFile" fileName="logs/error2.log"
                     filePattern="logs/?{date:yyyy-MM-dd}-error/error-%d{yyyy-MM-dd-HH}-%i.zip">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
            <ThresholdFilter level="error" />
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="2 KB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>

    <!--  具体的日志配置 name =-->
    <Loggers>
        <!-- <Logger name="org.springframework" level="error">
             <AppenderRef ref="Console"/>
         </Logger>-->
        <Logger name="com.tuliing" level="info">
            <AppenderRef ref="rollingFile"/>
            <AppenderRef ref="errorRollingFile"/>
        </Logger>
        <AsyncRoot level="debug">
            <AppenderRef ref="Console"/>
            <!-- <AppenderRef ref="file"/>
             <AppenderRef ref="rollingFile"/>-->
        </AsyncRoot>

    </Loggers></Configuration>

推荐阅读

【资源分享】Docker核心技术视频教程

【资源分享】Spring Cloud微服务实战视频课程

docker安装和常用命令&操作

Java视频资料大全

【资源分享】Netty视频教程

Springmvc源码解析总结

Spring IOC体系图和AOP知识脑图

全套教程丨尚硅谷韩顺平Go语言,免费下载!

myBatis 体系结构源码解读

本公众号会不定期给大家发福利,包括学习资源等,敬请期待吧!

推送内容如果现在工作用不上,可以先转发朋友圈或收藏,用的时候方便找。

另外欢迎公众号回复 微信 ,添加微信好友,互相学习交流。