近期进行log升级,简单配置了下几种常用日志,分别是log4j、log4j2、logback。简单整理,不全不深,仅备后用。
需求:将应用日志以控制台或文件的形式输出。
一、log4j
(1)引入jar包
下载并引入log4j的jar包,log4j-1.*.jar,笔者用的是 log4j-1.2.17.jar。
(2)log的主要节点
log配置文件主要包含三个节点:Logger、Appender、Layout。
Logger:配置打印日志的级别,输出日志的程序范围,以及关联的Appender。
Appender:配置日志的输出形式,输出策略等。
Layout:配置每条日志的内容格式。
(3)配置log4j.properties文件,示例:
#配置根节点
log4j.rootLogger=INFO,Log4jConsole,Log4jFile
#log不向上层传递
log4j.additivity.org.appache=false
#设置变量,保存路径 ${catalina.home}/logs
logDir=D:/tomcat/logs
#控制台输出
log4j.appender.Log4jConsole=org.apache.log4j.ConsoleAppender
log4j.appender.Log4jConsole.Threshold=INFO
log4j.appender.Log4jConsole.ImmediateFlush=true
log4j.appender.Log4jConsole.Target=System.out
#输出格式
log4j.appender.Log4jConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.Log4jConsole.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n
#文件输出
log4j.appender.Log4jFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Log4jFile.Threshold=INFO
log4j.appender.Log4jFile.ImmediateFlush=true
log4j.appender.Log4jFile.Append=true
log4j.appender.Log4jFile.File=${logDir}/log4j.log
log4j.appender.Log4jFile.DatePattern='.'yyyy-MM-dd
#输出格式
log4j.appender.Log4jFile.layout=org.apache.log4j.PatternLayout
log4j.appender.Log4jFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n
说明:
1.Logger节点配置,“log4j.rootLogger=INFO,Log4jConsole,Log4jFile”。
rootLogger为根节点,必须配置项。日志输出范围为整个project。
若需配置logger子节点,支持以包名或类名控制日志范围。如:log4j.logger.com.demo=*,“com.demo”为程序包名,表示配置该包名范围内的日志。
2.INFO为日志级别,表示输出INFO级别及以上的日志。
常用日志级别:DEBUG < INFO < WARN < ERROR。
3.log4j.additivity属性,表示根据程序的层级结构,下层日志是否向上层传递。
4.Appender节点,示例中的Log4jConsole,Log4jFile均为Appender名称。常用的Appender类型有:
org.apache.log4j.ConsoleAppender,控制台形式输出日志。
org.apache.log4j.DailyRollingFileAppender,按时间策略,文件形式输出日志。
org.apache.log4j.RollingFileAppender,按文件大小策略,文件形式输出日志。
其中:log4j.appender. * .File,设置当前日志文件名称。
log4j.appender.*.DatePattern,设置时间维度,支持按天、按小时等精度生成日志。
5.若以文件形式输出日志,可设置文件保存的相对路径,如tomcat的“${catalina.home}”。
6.Layout设置每条日志内容的输出格式,Layout支持多种类型格式,笔者此次使用的是“org.apache.log4j.PatternLayout”。
设置格式:
[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n
代码调用:
logger.info("it is a log for log4j!");
运行效果:
[INFO][2017-08-26 10:22:23][com.demo.log.Log4jTest:writeLog:41]it is a log for log4j!
格式化符号 | 意义 | 备注 |
---|---|---|
%p | 日志级别 | 如:INFO、WARN |
%d | 时间 | 可设置格式,%d{yyyy_MM_dd HH:mm:ss} |
%t | 线程名 | |
%c | 类名 | 如:%-20c,表示,左对齐,最大长度20 |
%M | 方法名 | |
%L | 行号 | |
%m | 日志内容 | 代码输出的内容 |
%n | 换行 |
(4)代码引用
此处为了说明,代码使用log4j自身的类写log。具体运用建议使用slf4j形式,具体后面讲解。
import org.apache.log4j.Logger;
......
private static Logger logger = Logger.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j!");
log4j、log4j2、logback的配置项相似,只是语法不同,后面仅简述不同的地方,不重复说明。
二、log4j2
(1)引入jar包
下载并引入log4j的jar包,log4j-api-2.*.jar,log4j-core-2.*.jar。笔者用的是 log4j-api-2.8.2.jar,log4j-core-2.8.2.jar。
(2)配置log4j2.xml文件,示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="60">
<Properties>
<!-- 日志输出路径变量 ${sys:catalina.home}/logs -->
<Property name="logDir" value="D:/tomcat/logs" />
<Appenders>
<!-- 控制台输出 -->
<Console name="Log4j2Console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
</Console>
<!-- 文件输出 -->
<RollingFile name="Log4j2File" fileName="${logDir}/log4j2.log"
filePattern="${logDir}/log4j2.log.%d{yyyy-MM-dd}">
<PatternLayout
pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<appender-ref ref="Log4j2Console" />
<appender-ref ref="Log4j2File"/>
</Root>
</Loggers>
</Configuration>
说明:
1.Configuration标签中的monitorInterval属性,表示自动扫描的间隔秒数。log4j2定时扫描配置文件,当配置文件发生变化,将重新加载生效。
2.status属性,表示查看log4j2内部日志的日志级别,应用可查看log4j2内部的加载日志。
3.若设置tomcat的相对路径保存日志文件,使用 ${sys:catalina.home},和log4j有区别。
4.RollingFile 文件形式输出日志,支持通过时间、文件大小两种策略生成文件。
5.RollingFile节点的filename属性,可设置当前文件名包含时间戳。如:
fileName="${log.dir}/log4j2.log.${date:yyyy-MM-dd}"
6.本实例中仅配置了root根日志节点,若需配置子节点,在中添加子节点即可。
<Logger level="INFO" name="com.demo.log" additivity="false">
<appender-ref ref="Log4j2Console" />
</Logger>
7.log4j2支持配置异步写log,以提升日志打印效率。配置如下:
<Appenders>
<RollingRandomAccessFile name="Log4j2File"
fileName="${logDir}/log4j2.log" filePattern="${log.dir}/log4j2.log.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern>[%p] %d{MM-dd HH:mm:ss,SSS}-(%c:%M:%L) %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
......
</Appenders>
<Loggers>
<AsyncLogger name="com.demo.log"
level="INFO" additivity="false">
<AppenderRef ref="Log4j2File" />
</AsyncLogger>
......
</Loggers>
(3)代码引用
此处为了说明,代码使用log4j2自身的类写log。具体运用建议使用slf4j形式,具体后面讲解。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
......
private static Logger logger = LogManager.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j2!");
三、logback
(1)引入jar包
下载并引入jar包,笔者用的是:slf4j-api-1.7.7.jar,logback-core-1.1.2.jar,logback-classic-1.1.2.jar。
(2)配置logback.xml文件,配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration scan="true" scanPeriod="60 seconds" debug="true">
<!-- 60s 自动扫描配置 -->
<!-- 文件路径变量 ${catalina.home}/logs -->
<Property name="logDir" value="D:/tomcat/logs" />
<!-- 控制台输出 -->
<Appender name="LogbackConsole" class="ch.qos.logback.core.ConsoleAppender">
<Encoder>
<Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
</Pattern>
</Encoder>
</Appender>
<!-- 文件输出 -->
<Appender name="LogbackFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logDir}/logback.log</File>
<Append>true</Append>
<RollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logDir}/logback.log.%d{yyyy-MM-dd}.%i
</FileNamePattern>
</RollingPolicy>
<TriggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</TriggeringPolicy>
<Encoder>
<Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
</Pattern>
</Encoder>
</Appender>
<Root level="INFO">
<Appender-ref ref="LogbackConsole" />
<Appender-ref ref="LogbackFile" />
</Root>
</Configuration>
说明:
1.logback可设置历史日志文件自动压缩,设置fileNamePattern属性添加“.gz”后缀即可。
<fileNamePattern>${log.dir}/logback.log.%i.%d{yyyy-MM-dd}.gz</fileNamePattern>
logback、log4j2的配置文件较相似,读懂了上面log4j2的配置文件,再看logback的配置就很轻松,不做过多说明。
(3)代码引用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
private final static Logger logger = LoggerFactory
.getLogger(LogbackTest.class);
......
logger.info("it is a log for logback!");
四、slf4j
slf4j,Simple Logging Facade for Java,Java简单日志门面。它不实现日志打印,只是通过门面模式提供log的api。
此处假装有图的样子
(1)引入jar包,以slf4j+log4j为例:
1. slf4j-api.jar,提供api给应用,如LoggerFactory工厂类。
2. slf4j-log4j.jar,桥接包,关联slf4j及log4j。
3. log4j-*jar,log4j的jar包,实现log打印。
(2)代码采用slf4j形式,同logback的代码示例:
private final static Logger logger = LoggerFactory
.getLogger(LogbackTest.class);
......
logger.info("it is a log for {}!",type);
......
(3)slf4j的好处:1、统一使用slf4j形式写log,不用修改源码,便于日志升级。2、log参数使用占位符{},不使用字符串拼接,语句清晰,性能更好。
写log是一种艺术,良好的log有利于定位问题。
ps:本文仅简单记录三种log的基本配置,许多点并未涉及到。