一、各种日志系统介绍:
Commons Logging
Commons Logging 也就是JCL,提供的是一个日志接口(Interface),自身提供一个简单的日志文件系统,但一般和其他日志系统组合使用。如:Commons-Logging + Log4j组合使用。
它会通过动态查找机制,在程序运行时自动找出真正使用的日志库。
Slf4j
Slf4j 即Simple Logging Facade for Java,和Commons-Logging类似,也是对不同日志框架提供的一个门面封装,可以在部署的时候可以通过桥接包接入其他日志方案来组合使用。
它支持多个参数并通过"{ }"占位符来进行替换。
Log4j
Log4j 即Log for Java ,经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。
Log4j 系统的三大板块:日志写入器Logger、日志输出终端Appender、日志布局模式Layout。其中Appender常用的有ConsoleAppender(输出到控制台)、FileAppender(输出文件)和RollingFileAppender(输出滚动文件)三种。
在classpath下编写配置文件log4j.properties,配置相关日志属性和格式。
Log4j2
Log4j2 是在Log4j 1.x版本基础上的一个升级版本。性能得到提升的同时,还能够自动装载配置文件,支持参数变量的占位符功能,可以专门指定事件进行过滤,并且支持插件式架构。
Logback
Logback是由log4j创始人涉及的又一个开源的日志组件,logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现Slf4j API,使我们可以很方便地更换成其它日志系统,如:log4j或JDK。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
二、Spring MVC + Slf4j + Log4j2 配置步骤:
Maven配置
首先,应在Maven中加载所需依赖包,并通过桥接器将Slf4j和Log4j2组合起来使用。
第一步:配置Spring需要的依赖:(选用“4.0.9.RELEASE”版本)
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-core/<artifactid>
<version>${springframework}/<version>
<exclusions>
<exclusion>
<groupid>commons-logging/<groupid>
<artifactid>commons-logging/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-beans/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context-support/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-expression/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-tx/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-web/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-webmvc/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-jdbc/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-jms/<artifactid>
<version>${springframework}/<version>
/<dependency>
注意 : Spring自身的日志系统是基于Commons-Logging接口的,而我们所采用的是Slf4j接口 + Log4j2组合模式,为了避免冲突,故需在配置依赖中将
Spring中的Commons-Logging取消依赖,如下操作:
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-core/<artifactid>
<version>${springframework}/<version>
<exclusions>
<exclusion>
<groupid>commons-logging/<groupid>
<artifactid>commons-logging/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
第二步:配置 Slf4j 需要的依赖:(选用“1.7.25”版本)
<dependency>
<groupid>org.slf4j/<groupid>
<artifactid>slf4j-api/<artifactid>
<version>${slf4j}/<version>
/<dependency>
<dependency>
<groupid>org.slf4j/<groupid>
<artifactid>jcl-over-slf4j/<artifactid>
<version>${slf4j}/<version>
<scope>runtime/<scope>
/<dependency>
slf4j-api : Slf4j的核心包,只有日志的接口,并没有实现。
jcl-over-slf4j : 桥接器,将JCL的日志输出重定向到Slf4j中。
第三步:配置 log4j2 需要的依赖:(选用“2.8.2”版本)
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-core/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-web/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-api/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-slf4j-impl/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
log4j-slf4j-impl : 将log4j2 和 slf4j进行绑定。
编写Log4j2 日志配置文件
- 配置文件格式及读取优先级:
- Log4j2 配置文件后缀要求为".xml"、".json"或者".jsn"。
- 系统选择配置文件的优先级为(从先到后):
- (1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
- (2).classpath下的名为log4j2-test.xml的文件.
- (3).classpath下名为log4j2.json 或者log4j2.jsn的文件.
- (4).classpath下名为log4j2.xml的文件.
- (5).如果classpath下没有相关配置文件,则使用默认日志系统.
- 详细配置文件解析:
- 要点介绍 :
- 日志的级别: ALL< Trace < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
- Properties 模块 : 配置一些全局的属性值。
- Appenders 模块 :日志输出相关配置。
- Loggers 模块 : 只有定义了Logger并根据Appender的name属性引入其中,Appender才会生效。
<configuration>
<properties>
<property>/root/bubble/logs/<property>
<property>/root/bubble/logs/<property>
/<properties>
<appenders>
<console>
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
/<patternlayout>/<thresholdfilter>/<console>
<rollingfile> filePattern="${LOG_HOME}/$${date:yyyy-MM}/search-%d{yyyy-MM-dd}-%i.log">
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
<policies>
<timebasedtriggeringpolicy> modulate="true" />
<sizebasedtriggeringpolicy>
/<timebasedtriggeringpolicy>/<policies>
<defaultrolloverstrategy>
/<patternlayout>/<thresholdfilter>/<rollingfile>
<rollingfile> fileName="${ERROR_LOG_FILE_NAME}/search-error.log"
filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/search-error-%d{yyyy-MM-dd}.log">
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
<policies>
<timebasedtriggeringpolicy> modulate="true" />
/<timebasedtriggeringpolicy>/<policies>
<defaultrolloverstrategy>
/<patternlayout>/<thresholdfilter>/<rollingfile>
/<appenders>
<loggers>
<logger>
<root>
<appender-ref>
<appender-ref>
<appender-ref>
/<root>
/<loggers>
/<configuration>
测试
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
....
logger.info("fastjson parse error, the json msg is {}", tempStr);
閱讀更多 吳趙筆記 的文章