Log4J 学习
入门:
最初使用 sout,简单有效,但:
- 不知道是哪个类,哪个线程输出的
- 不知道什么时候输出的,因此不知前后输出,间隔多长时间
- 无法选择性的关闭调试级别的信息:输出过多时,对程序效果形成干扰、没有级别区分,查看日志很痛苦等
因此使用日志框架,这里引入 Log4J(网上教程多为老项目 —— Log4J 1,先用着):
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
例程:
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LogTest {
public static void main(String[] args) {
Logger logger = Logger.getLogger(LogTest.class);
BasicConfigurator.configure();
logger.setLevel(Level.DEBUG);
logger.trace("跟踪信息");
logger.debug("调试信息");
logger.info("输出信息");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.warn("警告信息");
logger.error("错误信息");
logger.fatal("致命信息");
}
}
下面是新项目 Log4J 2 的例程:
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
public class LogTest {
public static void main(String[] args) {
Logger logger = LogManager.getLogger(LogTest.class);
// Configurator.setRootLevel(Level.DEBUG);
Configurator.setLevel(logger.getName(), Level.DEBUG);
logger.trace("跟踪信息");
logger.debug("调试信息");
logger.info("输出信息");
logger.warn("警告信息");
logger.error("错误信息");
logger.fatal("致命信息");
}
}
日志配置文件
1.log4j.properties
例子 ——:
在 classpath 下,创建 log4j.properties 文件:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log4j.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Java 代码:
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class LogTest {
public static void main(String[] args) {
Logger logger = Logger.getLogger(LogTest.class);
PropertyConfigurator.configure("D:\\repository\\quartz\\src" +
"\\main\\resources\\log4j.properties");
logger.trace("跟踪信息");
logger.debug("调试信息");
logger.info("输出信息");
logger.warn("警告信息");
logger.error("错误信息");
logger.fatal("致命信息");
}
}
配置文件解释:
- 设置日志等级为 debug;日志输出到两个地方,分别叫 stdout、R
- stdout 输出到控制台:org.apache.log4j.ConsoleAppender;下面是控制台的格式
- R 滚动写入到文件(在未超过文件指定大小之前,每次接着上次写入):一个文件 100k,最多 5 个文件。下面同样是输出的格式
输出格式类是 org.apache.log4j.PatternLayout,输出格式解释:
- %c:日志所属类的全名
- %f :日志所属类的类名
- %d:输出时间(日期或时间点),默认格式为 ISO8601,也可以指定格式,如 %d{yyyy-MM-dd HH:mm:ss},输出如 2019-06-15 04:39:00
- %l :日志事件发生的位置(第几行 line)
- %m:输出指定的 message,如 trace("message")、debug("message")
- %n:回车换行符
- %p:输出一个字符串(包含优先级,即日志级别,其他为空格)。可以指定总长度,长度为正数,则右对齐;长度为非正数或者不指定,则左对齐。多余的空格补齐
- %r:从应用启动,到输出该日志,所耗费的毫秒数
- %t:输出该日志的线程名(或者 %M)
所以:
- %5p [%t] (%F:%L) - %m%n 意思是:长度为 5 的日志级别 [线程名] (类名:行号) - 信息,然后再回车
- %p %t %c - %m%n:长度不限的日志级别 线程名 类全名 - 信息,然后回车
2.log4j.xml
也可以只把 log4j.properties 文件,换成 log4j.xml 文件来配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/>
</layout>
</appender>
<!-- 设置三方库的 logger -->
<logger name="com.opensymphony">
<level value="ERROR"/>
</logger>
<logger name="org.apache">
<level value="ERROR"/>
</logger>
<logger name="org.hibernate">
<level value="ERROR"/>
</logger>
<!-- rootLogger,除了上面指定的,对其他的都适用 -->
<root>
<!-- priority 和 level 一样,二者都可用 -->
<priority value="ERROR"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>