1. 首页
  2. IT资讯

细说 Java 主流日志工具库

“u003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcsUnd92eoboDR” img_width=”640″ img_height=”29″ alt=”细说 Java 主流日志工具库” inline=”0″u003Eu003Cpu003E作者 | 静默虚空 u003Cu002Fpu003Eu003Cpu003E链接 | juejin.imu002Fpostu002F5c8f35bfe51d4545cc650567u003Cu002Fpu003Eu003Cpu003E在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息。在 Java 世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子。u003Cu002Fpu003Eu003Cpu003E我们先来逐一了解一下主流日志工具。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E日志框架u003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Ejava.util.logging (JUL)u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003EJDK1.4 开始,通过 java.util.logging 提供日志功能。u003Cu002Fpu003Eu003Cpu003E它能满足基本的日志需要,但是功能没有 Log4j 强大,而且使用范围也没有 Log4j 广泛。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003ELog4ju003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003ELog4j 是 apache 的一个开源项目,创始人 Ceki Gulcu。u003Cu002Fpu003Eu003Cpu003ELog4j 应该说是 Java 领域资格最老,应用最广的日志工具。从诞生之日到现在一直广受业界欢迎。u003Cu002Fpu003Eu003Cpu003ELog4j 是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX 系统日志等。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003ELog4j 中有三个主要组成部分:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Eloggers – 负责捕获记录信息。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eappenders – 负责发布日志信息,以不同的首选目的地。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Elayouts – 负责格式化不同风格的日志信息。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E官网地址:u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttp:u002Fu002Flogging.apache.orgu002Flog4ju002F2.xu002Fu003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003ELogbacku003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003ELogback 是由 log4j 创始人 Ceki Gulcu 设计的又一个开源日记组件,目标是替代 log4j。u003Cu002Fpu003Eu003Cpu003Elogback 当前分成三个模块:logback-core、logback-classic 和 logback-access。u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Elogback-core – 是其它两个模块的基础模块。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Elogback-classic – 是 log4j 的一个 改良版本。此外 logback-classic 完整实现 SLF4J API 使你可以很方便地更换成其它日记系统如 log4j 或 JDK14 Logging。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Elogback-access – 访问模块与 Servlet 容器集成提供通过 Http 来访问日记的功能。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E官网地址:u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttp:u002Fu002Flogback.qos.chu002Fu003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003ELog4j2u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E官网地址:u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttp:u002Fu002Flogging.apache.orgu002Flog4ju002F2.xu002Fu003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E按照官方的说法,Log4j2 是 Log4j 和 Logback 的替代。u003Cu002Fpu003Eu003Cpu003ELog4j2 架构:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZmv6oR8HkoA1w” img_width=”607″ img_height=”372″ alt=”细说 Java 主流日志工具库” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003ELog4j vs Logback vs Log4j2u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E按照官方的说法,Log4j2 u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E大大u003Cu002Fiu003E优于 Log4j 和 Logback。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E那么,Log4j2 相比于先问世的 Log4j 和 Logback,它具有哪些优势呢?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003ELog4j2 旨在用作审计日志记录框架。Log4j 1.x 和 Logback 都会在重新配置时丢失事件。Log4j 2 不会。在 Logback 中,Appender 中的异常永远不会对应用程序可见。在 Log4j 中,可以将 Appender 配置为允许异常渗透到应用程序。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ELog4j2 在多线程场景中,异步 Loggers 的吞吐量比 Log4j 1.x 和 Logback 高 10 倍,延迟低几个数量级。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ELog4j2 对于独立应用程序是无垃圾的,对于稳定状态日志记录期间的 Web 应用程序来说是低垃圾。这减少了垃圾收集器的压力,并且可以提供更好的响应时间性能。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ELog4j2 使用插件系统,通过添加新的 Appender、Filter、Layout、Lookup 和 Pattern Converter,可以非常轻松地扩展框架,而无需对 Log4j 进行任何更改。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E由于插件系统配置更简单。配置中的条目不需要指定类名。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E支持自定义日志等级。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E支持 lambda 表达式。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E支持消息对象。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ELog4j 和 Logback 的 Layout 返回的是字符串,而 Log4j2 返回的是二进制数组,这使得它能被各种 Appender 使用。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ESyslog Appender 支持 TCP 和 UDP 并且支持 BSD 系统日志。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ELog4j2 利用 Java5 并发特性,尽量小粒度的使用锁,减少锁的开销。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E日志门面u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E何谓日志门面?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E日志门面是对不同日志框架提供的一个 API 封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Ecommon-loggingu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Ecommon-logging 是 apache 的一个开源项目。也称Jakarta Commons Logging,缩写 JCL。u003Cu002Fpu003Eu003Cpu003Ecommon-logging 的功能是提供日志功能的 API 接口,本身并不提供日志的具体实现(当然,common-logging 内部有一个 Simple logger 的简单实现,但是功能很弱,直接忽略),而是在运行时动态的绑定日志实现组件来工作(如 log4j、java.util.loggin)。u003Cu002Fpu003Eu003Cpu003E官网地址:u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttp:u002Fu002Fcommons.apache.orgu002Fproperu002Fcommons-loggingu002Fu003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Eslf4ju003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E全称为 Simple Logging Facade for Java,即 java 简单日志门面。u003Cu002Fpu003Eu003Cpu003E什么,作者又是 Ceki Gulcu!这位大神写了 Log4j、Logback 和 slf4j,专注日志组件开发五百年,一直只能超越自己。u003Cu002Fpu003Eu003Cpu003E类似于 Common-Logging,slf4j 是对不同日志框架提供的一个 API 封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,slf4j 在编译时静态绑定真正的 Log 库。使用 SLF4J 时,如果你需要使用某一种日志实现,那么你必须选择正确的 SLF4J 的 jar 包的集合(各种桥接包)。u003Cu002Fpu003Eu003Cpu003ETips:大家可以u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E关注u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E微信u003Cu002Fiu003E公众号:Java后端,获取更多推送。u003Cu002Fpu003Eu003Cpu003E官网地址:u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttp:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewwwu003Cu002Fiu003E.slf4j.orgu002Fu003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRZmv6onB0arjxZ” img_width=”1080″ img_height=”596″ alt=”细说 Java 主流日志工具库” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Ecommon-logging vs slf4ju003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Eslf4j 库类似于 Apache Common-Logging。但是,他在编译时静态绑定真正的日志库。这点似乎很麻烦,其实也不过是导入桥接 jar 包而已。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003Eslf4j 一大亮点是提供了更方便的日志记录方式:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E不需要使用logger.isDebugEnabled来解决日志因为字符拼接产生的性能问题。slf4j 的方式是使用{}作为字符串替换符,形式如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Elogger.debug(“id: {}, name: {} “, id, name);u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E总结u003Cu002Fh1u003Eu003Cpu003E综上所述,使用 slf4j + Logback 可谓是目前最理想的日志解决方案了。u003Cu002Fpu003Eu003Cpu003E接下来,就是如何在项目中实施了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E实施日志解决方案u003Cu002Fh1u003Eu003Cpu003E使用日志解决方案基本可分为三步:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E引入 jar 包u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E配置u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E使用 APIu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E常见的各种日志解决方案的第 2 步和第 3 步基本一样,实施上的差别主要在第 1 步,也就是使用不同的库。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E引入 jar 包u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E这里首选推荐使用 slf4j + logback 的组合。u003Cu002Fpu003Eu003Cpu003E如果你习惯了 common-logging,可以选择 common-logging+log4j。u003Cu002Fpu003Eu003Cpu003E强烈建议不要直接使用日志实现组件(logback、log4j、java.util.logging),理由前面也说过,就是无法灵活替换日志库。u003Cu002Fpu003Eu003Cpu003E还有一种情况:你的老项目使用了 common-logging,或是直接使用日志实现组件。如果修改老的代码,工作量太大,需要兼容处理。在下文,都将看到各种应对方法。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E注:据我所知,当前仍没有方法可以将 slf4j 桥接到 common-logging。如果我孤陋寡闻了,请不吝赐教。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Eslf4j 直接绑定日志组件u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Eu003Cstrongu003Eslf4j + logbacku003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E添加依赖到 pom.xml 中即可。u003Cu002Fpu003Eu003Cpu003Elogback-classic-1.0.13.jar 会自动将 slf4j-api-1.7.21.jar 和 logback-core-1.0.13.jar 也添加到你的项目中。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003Eslf4j + log4ju003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E添加依赖到 pom.xml 中即可。u003Cu002Fpu003Eu003Cpu003Eslf4j-log4j12-1.7.21.jar 会自动将 slf4j-api-1.7.21.jar 和 log4j-1.2.17.jar 也添加到你的项目中。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>org.slf4j<u002FgroupId>u003Cbru003E<artifactId>slf4j-log4j12<u002FartifactId>u003Cbru003E<version>1.7.21<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Eslf4j + java.util.loggingu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E添加依赖到 pom.xml 中即可。u003Cu002Fpu003Eu003Cpu003Eslf4j-jdk14-1.7.21.jar 会自动将 slf4j-api-1.7.21.jar 也添加到你的项目中。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>org.slf4j<u002FgroupId>u003Cbru003E<artifactId>slf4j-jdk14<u002FartifactId>u003Cbru003E<version>1.7.21<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Eslf4j 兼容非 slf4j 日志组件u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E在介绍解决方案前,先提一个概念——桥接u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E什么是桥接呢u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E假如你正在开发应用程序所调用的组件当中已经使用了 common-logging,这时你需要 jcl-over-slf4j.jar 把日志信息输出重定向到 slf4j-api,slf4j-api 再去调用 slf4j 实际依赖的日志组件。这个过程称为桥接。下图是官方的 slf4j 桥接策略图:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRZmv6p8DXoxlg9″ img_width=”1080″ img_height=”764″ alt=”细说 Java 主流日志工具库” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003E从图中应该可以看出,无论你的老项目中使用的是 common-logging 或是直接使用 log4j、java.util.logging,都可以使用对应的桥接 jar 包来解决兼容问题。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003Eslf4j 兼容 common-loggingu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>org.slf4j<u002FgroupId>u003Cbru003E<artifactId>jcl-over-slf4j<u002FartifactId>u003Cbru003E<version>1.7.12<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Eslf4j 兼容 log4ju003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>org.slf4j<u002FgroupId>u003Cbru003E<artifactId>log4j-over-slf4j<u002FartifactId>u003Cbru003E<version>1.7.12<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Eslf4j 兼容 java.util.loggingu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>org.slf4j<u002FgroupId>u003Cbru003E<artifactId>jul-to-slf4j<u002FartifactId>u003Cbru003E<version>1.7.12<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Espring 集成 slf4ju003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E做 java web 开发,基本离不开 spring 框架。很遗憾,spring 使用的日志解决方案是 common-logging + log4j。(系统的学习spring全家桶,可以在Java知音公众号内回复“Springboot聚合”)u003Cu002Fpu003Eu003Cpu003E所以,你需要一个桥接 jar 包:logback-ext-spring。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>ch.qos.logback<u002FgroupId>u003Cbru003E<artifactId>logback-classic<u002FartifactId>u003Cbru003E<version>1.1.3<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.logback-extensions<u002FgroupId>u003Cbru003E<artifactId>logback-ext-spring<u002FartifactId>u003Cbru003E<version>0.1.2<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.slf4j<u002FgroupId>u003Cbru003E<artifactId>jcl-over-slf4j<u002FartifactId>u003Cbru003E<version>1.7.12<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Ecommon-logging 绑定日志组件u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Eu003Cstrongu003Ecommon-logging + log4ju003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E添加依赖到 pom.xml 中即可。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependency>u003Cbru003E<groupId>commons-logging<u002FgroupId>u003Cbru003E<artifactId>commons-logging<u002FartifactId>u003Cbru003E<version>1.2<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>log4j<u002FgroupId>u003Cbru003E<artifactId>log4j<u002FartifactId>u003Cbru003E<version>1.2.17<u002Fversion>u003Cbru003E<u002Fdependency>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E使用 APIu003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Eslf4j 用法u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E使用 slf4j 的 API 很简单。使用LoggerFactory初始化一个Logger实例,然后调用 Logger 对应的打印等级函数就行了。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eimport org.slf4j.Logger;u003Cbru003Eimport org.slf4j.LoggerFactory;u003Cbru003Eu003Cbru003Epublic class App {u003Cbru003Eprivate static final Logger log = LoggerFactory.getLogger(App.class);u003Cbru003Eu003Cstrong toutiao-origin=”span”u003Epublicu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Estaticu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Evoidu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Emainu003Cu002Fstrongu003E(String[] args) {u003Cbru003EString msg = “print log, current level: {}”;u003Cbru003Elog.trace(msg, “trace”);u003Cbru003Elog.debug(msg, “debug”);u003Cbru003Elog.info(msg, “info”);u003Cbru003Elog.warn(msg, “warn”);u003Cbru003Elog.error(msg, “error”);u003Cbru003E}u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003Ecommon-logging 用法u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Ecommon-logging 用法和 slf4j 几乎一样,但是支持的打印等级多了一个更高级别的:fatal。u003Cu002Fpu003Eu003Cpu003E此外,common-logging 不支持{}替换参数,你只能选择拼接字符串这种方式了。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eimport org.apacheu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Emons.logging.Log;u003Cbru003Eimport org.apacheu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Emons.logging.LogFactory;u003Cbru003Eu003Cbru003Epublic class JclTest {u003Cbru003Eprivate static final Log log = LogFactory.getLog(JclTest.class);u003Cbru003Eu003Cbru003Eu003Cstrong toutiao-origin=”span”u003Epublicu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Estaticu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Evoidu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Emainu003Cu002Fstrongu003E(String[] args) {u003Cbru003EString msg = “print log, current level: “;u003Cbru003Elog.trace(msg + “trace”);u003Cbru003Elog.debug(msg + “debug”);u003Cbru003Elog.info(msg + “info”);u003Cbru003Elog.warn(msg + “warn”);u003Cbru003Elog.error(msg + “error”);u003Cbru003Elog.fatal(msg + “fatal”);u003Cbru003E}u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003Elog4j2 配置u003Cu002Fh1u003Eu003Cpu003Elog4j2 基本配置形式如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<?xml version=”1.0″ encoding=”UTF-8″?>;u003Cbru003E<Configuration>u003Cbru003E<Properties>u003Cbru003E<Property name=”name1″>value<u002Fproperty>u003Cbru003E<Property name=”name2″ value=”value2″u002F>u003Cbru003E<u002FProperties>u003Cbru003E<Filter type=”type” … u002F>u003Cbru003E<Appenders>u003Cbru003E<Appender type=”type” name=”name”>u003Cbru003E<Filter type=”type” … u002F>u003Cbru003E<u002FAppender>u003Cbru003E…u003Cbru003E<u002FAppenders>u003Cbru003E<Loggers>u003Cbru003E<Logger name=”name1″>u003Cbru003E<Filter type=”type” … u002F>u003Cbru003E<u002FLogger>u003Cbru003E…u003Cbru003E<Root level=”level”>u003Cbru003E<AppenderRef ref=”name”u002F>u003Cbru003E<u002FRoot>u003Cbru003E<u002FLoggers>u003Cbru003E<u002FConfiguration>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E配置示例:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<?xml version=”1.0″ encoding=”UTF-8″?>u003Cbru003E<Configuration status=”debug” strict=”true” name=”XMLConfigTest”u003Cbru003Epackages=”org.apache.logging.log4j.test”>u003Cbru003E<Properties>u003Cbru003E<Property name=”filename”>targetu002Ftest.log<u002FProperty>u003Cbru003E<u002FProperties>u003Cbru003E<Filter type=”ThresholdFilter” level=”trace”u002F>u003Cbru003Eu003Cbru003E<Appenders>u003Cbru003E<Appender type=”Console” name=”STDOUT”>u003Cbru003E<Layout type=”PatternLayout” pattern=”%m MDC%X%n”u002F>u003Cbru003E<Filters>u003Cbru003E<Filter type=”MarkerFilter” marker=”FLOW” onMatch=”DENY” onMismatch=”NEUTRAL”u002F>u003Cbru003E<Filter type=”MarkerFilter” marker=”EXCEPTION” onMatch=”DENY” onMismatch=”ACCEPT”u002F>u003Cbru003E<u002FFilters>u003Cbru003E<u002FAppender>u003Cbru003E<Appender type=”Console” name=”FLOW”>u003Cbru003E<Layout type=”PatternLayout” pattern=”%C{1}.%M %m %ex%n”u002F><!– class and line number –>u003Cbru003E<Filters>u003Cbru003E<Filter type=”MarkerFilter” marker=”FLOW” onMatch=”ACCEPT” onMismatch=”NEUTRAL”u002F>u003Cbru003E<Filter type=”MarkerFilter” marker=”EXCEPTION” onMatch=”ACCEPT” onMismatch=”DENY”u002F>u003Cbru003E<u002FFilters>u003Cbru003E<u002FAppender>u003Cbru003E<Appender type=”File” name=”File” fileName=”${filename}”>u003Cbru003E<Layout type=”PatternLayout”>u003Cbru003E<Pattern>%d %p %C{1.} [%t] %m%n<u002FPattern>u003Cbru003E<u002FLayout>u003Cbru003E<u002FAppender>u003Cbru003E<u002FAppenders>u003Cbru003Eu003Cbru003E<Loggers>u003Cbru003E<Logger name=”org.apache.logging.log4j.test1″ level=”debug” au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity=”false”>u003Cbru003E<Filter type=”ThreadContextMapFilter”>u003Cbru003E<KeyValuePair key=”test” value=”123″u002F>u003Cbru003E<u002FFilter>u003Cbru003E<AppenderRef ref=”STDOUT”u002F>u003Cbru003E<u002FLogger>u003Cbru003Eu003Cbru003E<Logger name=”org.apache.logging.log4j.test2″ level=”debug” au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity=”false”>u003Cbru003E<AppenderRef ref=”File”u002F>u003Cbru003E<u002FLogger>u003Cbru003Eu003Cbru003E<Root level=”trace”>u003Cbru003E<AppenderRef ref=”STDOUT”u002F>u003Cbru003E<u002FRoot>u003Cbru003E<u002FLoggers>u003Cbru003Eu003Cbru003E<u002FConfiguration>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003Elogback 配置u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E<configuration>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<configuration>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E是 logback 配置文件的根元素。u003Cu002Fpu003Eu003Cpu003E要点:它有 u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<appender>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E、u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<logger>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E、u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<root>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E三个子元素。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRZmv6pP7HMfdc9″ img_width=”297″ img_height=”143″ alt=”细说 Java 主流日志工具库” inline=”0″u003Eu003Cpu003Eu003Cstrongu003E<appender>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:将记录日志的任务委托给名为 appender 的组件。u003Cu002Fpu003Eu003Cpu003E要点:可以配置零个或多个;它有 u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<file>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E、u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<filter>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E、u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<layout>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E、u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<encoder>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E四个子元素。u003Cu002Fpu003Eu003Cpu003E属性:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Ename:设置 appender 名称。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eclass:设置具体的实例化类。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E<file>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:设置日志文件路径。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E<filter>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:设置过滤器。u003Cu002Fpu003Eu003Cpu003E要点:可以配置零个或多个。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E<layout>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:设置 appender。u003Cu002Fpu003Eu003Cpu003E要点:可以配置零个或一个。u003Cu002Fpu003Eu003Cpu003E属性:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Eclass:设置具体的实例化类。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E<encoder>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:设置编码。u003Cu002Fpu003Eu003Cpu003E要点:可以配置零个或多个。u003Cu002Fpu003Eu003Cpu003E属性:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Eclass:设置具体的实例化类。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZmv6pjCAIkpRR” img_width=”392″ img_height=”254″ alt=”细说 Java 主流日志工具库” inline=”0″u003Eu003Cpu003Eu003Cstrongu003E<logger>u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E作用:设置 logger。u003Cu002Fpu003Eu003Cpu003E要点:可以配置零个或多个。u003Cu002Fpu003Eu003Cpu003E属性:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Enameu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Elevel:设置日志级别。不区分大小写。可选值:TRACE、DEBUG、INFO、WARN、ERROR、ALL、OFF。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eau003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity:可选值:true 或 false。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cp class=”pgc-end-source”u003E<appender-ref>u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E作用:appender 引用。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E要点:可以配置零个或多个。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E<root>u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E作用:设置根 logger。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E要点:只能配置一个;除了 level,不支持任何属性。level 属性和 u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<logger>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E中的相同;有一个子元素u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<appender-ref>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E,与u003Ccodeu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E<logger>u003Cu002Fstrongu003Eu003Cu002Fcodeu003E中的相同。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E完整的 logback.xml 参考示例u003Cu002Fh2u003Eu003Cp class=”pgc-end-source”u003E在下面的配置文件中,我为自己的项目代码(根目录:org.zp.notes.spring)设置了五种等级:u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003Eu003Cemu003ETRACE、DEBUG、INFO、WARN、ERROR,优先级依次从低到高。u003Cu002Femu003Eu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E因为u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E关注u003Cu002Fiu003E spring 框架本身的一些信息,我增加了专门打印 spring WARN 及以上等级的日志。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<?xml version=”1.0″ encoding=”UTF-8″ ?>u003Cbru003Eu003Cbru003E<!– logback中一共有5种有效级别,分别是TRACE、DEBUG、INFO、WARN、ERROR,优先级依次从低到高 –>u003Cbru003E<configuration scan=”true” scanPeriod=”60 seconds” debug=”false”>u003Cbru003Eu003Cbru003E<property name=”DIR_NAME” value=”spring-helloworld”u002F>u003Cbru003Eu003Cbru003E<!– 将记录日志打印到控制台 –>u003Cbru003E<appender name=”STDOUT” class=”ch.qos.logback.core.ConsoleAppender”>u003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<!– RollingFileAppender begin –>u003Cbru003E<appender name=”ALL” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Fall.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.log<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>30MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<appender name=”ERROR” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Ferror.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.log<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>10MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<filter class=”ch.qos.logback.classic.filter.LevelFilter”>u003Cbru003E<level>ERROR<u002Flevel>u003Cbru003E<onMatch>ACCEPT<u002FonMatch>u003Cbru003E<onMismatch>DENY<u002FonMismatch>u003Cbru003E<u002Ffilter>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<appender name=”WARN” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Fwarn.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.log<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>10MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<filter class=”ch.qos.logback.classic.filter.LevelFilter”>u003Cbru003E<level>WARN<u002Flevel>u003Cbru003E<onMatch>ACCEPT<u002FonMatch>u003Cbru003E<onMismatch>DENY<u002FonMismatch>u003Cbru003E<u002Ffilter>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<appender name=”INFO” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Finfo.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.log<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>10MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<filter class=”ch.qos.logback.classic.filter.LevelFilter”>u003Cbru003E<level>INFO<u002Flevel>u003Cbru003E<onMatch>ACCEPT<u002FonMatch>u003Cbru003E<onMismatch>DENY<u002FonMismatch>u003Cbru003E<u002Ffilter>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<appender name=”DEBUG” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Fdebug.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.log<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>10MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<filter class=”ch.qos.logback.classic.filter.LevelFilter”>u003Cbru003E<level>DEBUG<u002Flevel>u003Cbru003E<onMatch>ACCEPT<u002FonMatch>u003Cbru003E<onMismatch>DENY<u002FonMismatch>u003Cbru003E<u002Ffilter>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<appender name=”TRACE” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Ftrace.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.log<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>10MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<filter class=”ch.qos.logback.classic.filter.LevelFilter”>u003Cbru003E<level>TRACE<u002Flevel>u003Cbru003E<onMatch>ACCEPT<u002FonMatch>u003Cbru003E<onMismatch>DENY<u002FonMismatch>u003Cbru003E<u002Ffilter>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<appender name=”SPRING” class=”ch.qos.logback.core.rolling.RollingFileAppender”>u003Cbru003E<!– 根据时间来制定滚动策略 –>u003Cbru003E<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>u003Cbru003E<fileNamePattern>${user.dir}u002Flogsu002F${DIR_NAME}u002Fspringframework.%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E}.logu003Cbru003E<u002FfileNamePattern>u003Cbru003E<maxHistory>30<u002FmaxHistory>u003Cbru003E<u002FrollingPolicy>u003Cbru003Eu003Cbru003E<!– 根据文件大小来制定滚动策略 –>u003Cbru003E<triggeringPolicy class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>u003Cbru003E<maxFileSize>10MB<u002FmaxFileSize>u003Cbru003E<u002FtriggeringPolicy>u003Cbru003Eu003Cbru003E<encoder>u003Cbru003E<pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M – %m%n<u002Fpattern>u003Cbru003E<u002Fencoder>u003Cbru003E<u002Fappender>u003Cbru003E<!– RollingFileAppender end –>u003Cbru003Eu003Cbru003E<!– logger begin –>u003Cbru003E<!– 本项目的日志记录,分级打印 –>u003Cbru003E<logger name=”org.zp.notes.spring” level=”TRACE” au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity=”false”>u003Cbru003E<appender-ref ref=”STDOUT”u002F>u003Cbru003E<appender-ref ref=”ERROR”u002F>u003Cbru003E<appender-ref ref=”WARN”u002F>u003Cbru003E<appender-ref ref=”INFO”u002F>u003Cbru003E<appender-ref ref=”DEBUG”u002F>u003Cbru003E<appender-ref ref=”TRACE”u002F>u003Cbru003E<u002Flogger>u003Cbru003Eu003Cbru003E<!– SPRING框架日志 –>u003Cbru003E<logger name=”org.springframework” level=”WARN” au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity=”false”>u003Cbru003E<appender-ref ref=”SPRING”u002F>u003Cbru003E<u002Flogger>u003Cbru003Eu003Cbru003E<root level=”TRACE”>u003Cbru003E<appender-ref ref=”ALL”u002F>u003Cbru003E<u002Froot>u003Cbru003E<!– logger end –>u003Cbru003Eu003Cbru003E<u002Fconfiguration>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cp class=”pgc-end-source”u003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003Elog4j 配置u003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E完整的 log4j.xml 参考示例u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cp class=”pgc-end-source”u003Elog4j 的配置文件一般有 xml 格式或 properties 格式。这里为了和 logback.xml 做个对比,就不介绍 properties 了,其实也没太大差别。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<?xml version=”1.0″ encoding=”UTF-8″?>u003Cbru003E<!DOCTYPE log4j:configuration SYSTEM “log4j.dtd”>u003Cbru003Eu003Cbru003E<log4j:configuration xmlns:log4j=’http:u002Fu002Fjakarta.apache.orgu002Flog4ju002F’>u003Cbru003Eu003Cbru003E<appender name=”STDOUT” class=”org.apache.log4j.ConsoleAppender”>u003Cbru003E<layout class=”org.apache.log4j.PatternLayout”>u003Cbru003E<param name=”ConversionPattern”u003Cbru003Evalue=”%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E HH:mm:ss,SSS\} [%-5p] [%t] %c{36\}.%M – %m%n”u002F>u003Cbru003E<u002Flayout>u003Cbru003Eu003Cbru003E<!–过滤器设置输出的级别–>u003Cbru003E<filter class=”org.apache.log4j.varia.LevelRangeFilter”>u003Cbru003E<param name=”levelMin” value=”debug”u002F>u003Cbru003E<param name=”levelMax” value=”fatal”u002F>u003Cbru003E<param name=”AcceptOnMatch” value=”true”u002F>u003Cbru003E<u002Ffilter>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003Eu003Cbru003E<appender name=”ALL” class=”org.apache.log4j.DailyRollingFileAppender”>u003Cbru003E<param name=”File” value=”${user.dir}u002Flogsu002Fspring-commonu002Fjclu002Fall”u002F>u003Cbru003E<param name=”Append” value=”true”u002F>u003Cbru003E<!– 每天重新生成日志文件 –>u003Cbru003E<param name=”DatePattern” value=”‘-‘yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E’.log'”u002F>u003Cbru003E<!– 每小时重新生成日志文件 –>u003Cbru003E<!–<param name=”DatePattern” value=”‘-‘yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E-HH’.log'”u002F>–>u003Cbru003E<layout class=”org.apache.log4j.PatternLayout”>u003Cbru003E<param name=”ConversionPattern”u003Cbru003Evalue=”%d{yyyy-MM-u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003E HH:mm:ss,SSS\} [%-5p] [%t] %c{36\}.%M – %m%n”u002F>u003Cbru003E<u002Flayout>u003Cbru003E<u002Fappender>u003Cbru003Eu003Cbru003E<!– 指定logger的设置,au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity指示是否遵循缺省的继承机制–>u003Cbru003E<logger name=”org.zp.notes.spring” au003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eitivity=”false”>u003Cbru003E<level value=”error”u002F>u003Cbru003E<appender-ref ref=”STDOUT”u002F>u003Cbru003E<appender-ref ref=”ALL”u002F>u003Cbru003E<u002Flogger>u003Cbru003Eu003Cbru003E<!– 根logger的设置–>u003Cbru003E<root>u003Cbru003E<level value=”warn”u002F>u003Cbru003E<appender-ref ref=”STDOUT”u002F>u003Cbru003E<u002Froot>u003Cbru003E<u002Flog4j:configuration>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cp class=”pgc-end-source”u003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E参考u003Cu002Fh1u003Eu003Cp class=”pgc-end-source”u003E[1] http:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewwwu003Cu002Fiu003E.slf4j.orgu002Fmanual.htmlu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E[2] http:u002Fu002Flogback.qos.chu002Fu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E[3] http:u002Fu002Flogging.apache.orgu002Flog4ju002F1.2u002Fu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E[4] http:u002Fu002Fcommons.apache.orgu002Fproperu002Fcommons-loggingu002Fu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E[5] http:u002Fu002Fblog.csdn.netu002Fyycdaiziu002Farticleu002Fdetailsu002F8276265u003Cu002Fpu003Eu003Cpreu003Eu003Cpreu003Eu003Cdivu003E u003Cp class=”pgc-end-source”u003E-END-u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E如果看到这里,说明你喜欢这篇文章,请转发、点赞。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E微信u003Cu002Fiu003E搜索「web_resource」,u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E关注u003Cu002Fiu003E后回复「进群」或者扫描下方二维码即可进入无广告交流群。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E↓扫描二维码进群↓u003Cu002Fpu003Eu003Cdivu003Eu003Cu002Fdivu003Eu003Cdivu003Eu003Cp class=”pgc-end-source”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cdivu003Eu003Cu002Fdivu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cu002Fpreu003E”

原文始发于:细说 Java 主流日志工具库

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/17798.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code