log4j笔记
log4j
log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。
log4j安装
使用maven安装,在pom.xml的dependencies节点直接添加以下依赖,即可使用
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
log4j配置
可以在类目录下建立一个资源文件夹,如src/main/resources目录下,新建log4j.properties配置文件,如
log4j.rootLogger=DEBUG,FILE #file log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.DatePattern='.'yyyy-MM-dd log4j.appender.FILE.File=./src/logs/out.log log4j.appender.FILE.Append=true log4j.appender.FILE.Threshold=DEBUG log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ] %p:%m%n
1. log4j.rootLogger=DEBUG,FILE
首先,级别优先级是ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
这里根的日志级别设置DEBUG级别,用来控制下面所有appender节点的日志级别。这里设置了DEBUG,则表示大于等于DEBUG级别的日志记录才会发送到下面的appender节点处理。
而第二个参数FILE则是appender节点的名称,另外DEBUG后面可以放多个名称的,如果log4j.rootLogger=DEBUG,FILE,FILE1,FILE2。
2. log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
这里表示FILE是使用org.apache.log4j.DailyRollingFileAppender,而DailyRollingFileAppender是代表日志文件滚动,后一天会把前一天的log文件改名。
另外还有org.apache.log4j.FileAppender全部写在一个文件中,useorg.apache.log4j.RollingFileAppender表示日志文件滚动,条件是maxFileSize文件大小,默认是大于10m就分开下一个文件写日志,
3. log4j.appender.FILE.DatePattern='.'yyyy-MM-dd,表示一天滚动一次。下面是列表
DatePattern | 描述 |
---|---|
'.' yyyy-MM | 滚动在每个月的结束和下一个月初 |
'.' yyyy-MM-dd | 这是默认值,每天午夜滚动 |
'.' yyyy-MM-dd-a | 滚动每一天的午夜和中午 |
'.' yyyy-MM-dd-HH | 滚动在每一个小时 |
'.' yyyy-MM-dd-HH-mm | 滚动在每一个分钟 |
'.' yyyy-ww | 滚动每个星期取决于区域设置时的第一天 |
4. log4j.appender.FILE.File=./src/logs/out.log
这里参数表示日志文件存放路径
5.log4j.appender.FILE.Append=true
表示是否添加到日志文件末尾,如果为false且存在日志文件,就不写入,坑。
6.log4j.appender.FILE.Threshold=DEBUG
表示可以写入的日志级别,根节点的级别优先
7. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
表示使用模式格式写日志,另外还有HTMLLayout,XMLLayout,DateLayout等格式。
8.log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ] %p:%m%n
日志写入的实际内容,里面的占位符含义如下
转换字符 | 表示的意思 |
---|---|
c | 用于输出的记录事件的类别。例如,对于类别名称"a.b.c" 模式 %c{2} 会输出 "b.c" |
C | 用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass". |
d | 用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}. |
F | 用于输出被发出日志记录请求,其中的文件名 |
l | 用于将产生的日志事件调用者输出位置信息 |
L | 用于输出从被发出日志记录请求的行号 |
m | 用于输出使用日志事件相关联的应用程序提供的消息 |
M | 用于输出发出日志请求所在的方法名称 |
n | 输出平台相关的行分隔符或文字 |
p | 用于输出的记录事件的优先级 |
r | 用于输出毫秒从布局的结构经过直到创建日志记录事件的数目 |
t | 用于输出生成的日志记录事件的线程的名称 |
x | 用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文) |
X | 在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息 |
% | 文字百分号 %%将打印%标志 |
slf4j
slf4j是门面模式的典型应用,所以slf4j的作用是提供标准统一的API,而不是具体实现,好处就是更换日志框架不需要修改代码,只需要改maven的引用包。阿里巴巴开发规约里面也强制规定了,
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架(SLF4J、JCL--Jakarta Commons Logging)中的API。
slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。所以我们如果使用log4j的话,只需要在pom.xml下面添加
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.8.0-alpha2</version> </dependency>
使用方式
private final static org.slf4j.Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { loggers.debug("debug"); }