Log4j + Slf4j 按不同级别输出日志到不同文件 时间: 2018-08-24 17:36 分类: JAVA ####前言 公司的项目是从外包公司买来的,所以项目的很多配置文件都是杂乱无章,比如 Spring 与 SpringMVC 配置重复扫描包的问题,日志的配置文件也是不起作用,结果就是每次一启动项目,控制台总是大量的刷一些无用的 DEBUG 级别的日志,所以找了个时间重新配置了一下。 ####配置 一开始从日志文件来看,并没有什么太大的问题,但无论我怎样修改日志级别,都不生效,于是查看 pom.xml 依赖项,发现有 Log4j 的依赖,还有 logback 的依赖,所以把 logback 的依赖去掉,重新启动项目,log4j 的配置终于生效。 下面来将项目修改为 Log4j + Slf4j 作为项目的日志管理。 Log4j + Slf4j 配置项目的日志需要引入的三个 jar 包: > slf4j-api.jar > log4j.jar > slf4j-log4j12.jar 然后就是`log4j.properties`配置文件了: ``` log4j.rootLogger = ${logLevel} log4j.addivity.org.apache=true ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n ### 输出到日志文件 ### log4j.logger.infolog = info,infolog log4j.appender.infolog.Append = true log4j.appender.infolog = org.apache.log4j.DailyRollingFileAppender log4j.appender.infolog.File = ../logs/vehicle-web/vehicle-web_ log4j.appender.infolog.DatePattern=yyyy-MM-dd'.log' log4j.appender.infolog.layout = org.apache.log4j.PatternLayout log4j.appender.infolog.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n log4j.additivity.infolog=false ### 保存异常信息到单独文件 ### log4j.logger.errorlog = error,errorlog log4j.appender.errorlog.Append = true log4j.appender.errorlog.Threshold = error log4j.appender.errorlog = org.apache.log4j.DailyRollingFileAppender log4j.appender.errorlog.File = ../logs/vehicle-web/vehicle-web-error_ log4j.appender.errorlog.DatePattern=yyyy-MM-dd'.log' log4j.appender.errorlog.layout = org.apache.log4j.PatternLayout log4j.appender.errorlog.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n log4j.additivity.errorlog=false ###关闭不必要的一些DEBUG日志 log4j.logger.org.springframework.data.redis.core.RedisConnectionUtils = INFO log4j.logger.org.apache.http.impl.conn.PoolingHttpClientConnectionManager = INFO ``` 由于项目是外包做的,所以里面存在着很多的`e.printStackTrace();`打印错误信息的地方,这种打印错误的方法相当于`System.out`的打印级别,所以在上面的配置中是不会打印到错误日志文件的,所以将项目中所有抛出异常的地方改为`logger.error(e.getMessage(), e);`形式来打印错误信息,需要注意的是以前总是用`logger.error(e.getMessage)`来打印错误日志,这种做法是非常不好的,因为日志中看不到错误的堆栈信息,无法定位到具体的代码行。 上面的配置倒是挺简单的,但还是有需要注意的地方:如果项目没有配置全局异常捕获类,那么上面的配置在生产环境中就可能有些错误日志不会输出,这是由于`SpringMVC`默认的全局异常日志打印为`DEBUG`导致的,所以必须自己自定义全局异常捕获类,将错误信息以`ERROR`级别打印才会在系统的日志中查看得到。 标签: log4j slf4j