07.03 干货!Spring MVC + Slf4j + Log4j2 日志文件系统配置

干货!Spring MVC + Slf4j + Log4j2 日志文件系统配置

一、各种日志系统介绍:

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 日志配置文件

  1. 配置文件格式及读取优先级:
  2. Log4j2 配置文件后缀要求为".xml"、".json"或者".jsn"。
  3. 系统选择配置文件的优先级为(从先到后):
  4. (1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
  5. (2).classpath下的名为log4j2-test.xml的文件.
  6. (3).classpath下名为log4j2.json 或者log4j2.jsn的文件.
  7. (4).classpath下名为log4j2.xml的文件.
  8. (5).如果classpath下没有相关配置文件,则使用默认日志系统.
  9. 详细配置文件解析:
  10. 要点介绍 :
  11. 日志的级别: ALL< Trace < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
  12. Properties 模块 : 配置一些全局的属性值。
  13. Appenders 模块 :日志输出相关配置。
  14. 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);


分享到:


相關文章: