log4j

Posted caizl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");
   }

 参考

https://www.yiibai.com/log4j/log4j_configuration.html#article-start

以上是关于log4j的主要内容,如果未能解决你的问题,请参考以下文章

log4j怎样控制只输出自己写的代码的日志,不输出框架中的日志

Log4j反序列化远程代码执行漏洞(CVE-2019-17571)

由log4j远程执行漏洞说起

混合 log4j 1.x 和 log4j 2

Java 标准日志工具 Log4j 的使用(附源代码)

log4jspringboot项目启动 ,使用的druid数据源,log4j报错 log4j:WARN Please initialize the log4j system properly.(代码片