摘抄自:https://www.cnblogs.com/qlqwjy/p/9275415.html
1.log4j依赖的jar包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-rc1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0-rc1</version>
</dependency>
2.log4j.appender.console.layout.ConversionPattern的设置参数,可以改变日志输出结构
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},SSS为毫秒数(也可以写为SS,只不过SSS如果不足三位会补0),输出类似:2011-10-18 22:10:28,021
%r: 输出自应用启动到输出该日志耗费的毫秒数
%t: 输出产生日志的线程名称
%l: 输出日志事件的位置,相当于%c.%M(%F:L)的组合,包括类全名、方法、文件名以及在代码中行数。例如:cn.xm.test.PlainTest.main(PlanTest.java:12)
%c: 输出日志信息所属的类目,通常就是所在类的全名。可写为%c{num},表示取完整类名的层数,从后向前取,比如%c{2}取 "cn.qlq.exam"类为"qlq.exam"。
%M: 输出产生日志信息的方法名
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
3.在logger的方法中,{}就是占位符
logger.error("error:多个占位符,{},{},{},{}", 1, 2, 3, 4);
4.但是Exception要输出必须放在error的所有参数之外,例如
public static void openFile(String filePath) {
File file = new File(filePath);
try {
InputStream in = new FileInputStream(file);
} catch (FileNotFoundException e) {
log.error("error:can found file [{}]", filePath, 3, e);
}
}
结果
2018-08-18 11:11:18 [cn.xm.exam.test.Slf4jTest]-[ERROR] error:can found file [xxxxxx]
java.io.FileNotFoundException: xxxxxx (系统找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at cn.xm.exam.test.Slf4jTest.openFile(Slf4jTest.java:22)
at cn.xm.exam.test.Slf4jTest.main(Slf4jTest.java:16)
否则将无法输出Exception的内容
打印异常不建议使用e.getMessage()因为不一定有Message
5.关于properties的配置
log4j.rootLogger=info,B
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
log4j.appender.B=org.apache.log4j.RollingFileAppender
log4j.appender.B.File=E:\\test.log
log4j.appender.B.MaxFileSize=10MB
log4j.appender.B.MaxBackupIndex=5
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
log4j.appender.B.File 指定输出的日志的文件名称以及路径
log4j.appender.B.MaxFileSize 指定每个文件的最大大小
log4j.appender.B.MaxBackupIndex 指定文件达到文件大小之后最多重命名的文件数量
log4j.appender.B.layout 指定采用的样式
log4j.appender.B.layout.ConversionPattern 指定样式的格式(值一般固定)
log4j.appender.C.Threshold=error
THreshold可以用来指定输出日志的级别,使文件输出的所有日志都是该级别的
log4j.rootLogger=info,console,file
log4j.logger.cn.a=debug
log4j.logger.cn.b=info,console
log4j.logger.cn.c=error,file
这里就是为不同包指定输出的级别以及方式,cn.a包是debug级别,采用console和file输出
子包的设置会覆盖父包的设置