Java日志--log4j2/log4j--使用/教程/实例

本文对比介绍了Log4j与Log4j2的日志框架,涵盖配置文件类型、核心JAR包、文件渲染及调用方式的区别。详细解析了Log4j2的配置方法,包括配置文件结构、日志级别、Appender与Layout设置,并提供了Web项目及Spring环境中使用Log4j的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址:Java日志--log4j2/log4j--使用/教程/实例_IT利刃出鞘的博客-CSDN博客

简介

本文用示例介绍log4j2与log4j的用法。同时也会介绍相关知识:它们的区别等。

log4j2和log4j的区别

1、配置文件类型

    log4j:是通过一个.properties的文件作为主配置文件的,而现在的
    log4j2:则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做。

2、核心JAR包

log4j:log4j-1.2.17.jar
log4j2:log4j-api-2.13.0.jar 和 log4j-core-2.13.0.jar

maven管理中,log4j和log4j2的包路径是不同的,Apache为了区分,包路径都更新了,大家甚至可以在一个项目中使用2个版本的日志!

3、文件渲染

log4j:在web.xml中进行配置
log4j2:比较简单,以maven工程为例,我们只需要把log4j2.xml放到工程resource目录下就行了。

4、调用

log4j:private final Logger LOGGER = Logger.getLogger(Test.class.getName());
log4j2:private static Logger logger = LogManager.getLogger(Test.class.getName());

log4j2

配置文件

详细配置:Log4j2 中文文档 - Configuration | Docs4dev

log4j2依然包含三个组件,分别是 Logger(记录器)、Appender(输出目的地)、Layout(日志布局)。

log4j2有默认的配置,如果要替换配置,只需要在classpath根目录下放置log4j2.xml。

log4j 2.0与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。在默认情况下,系统选择configuration文件的优先级(classpath下):log4j-test.json/log4j-test.jsn > log4j2-test.xml > log4j.json/log4j.jsn > log4j2.xml

log4j2.xml最简配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
    </Appenders>
 
    <Loggers>
        <Root level="trace">
            <Appender-ref ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

配置详解

<?xml version="1.0" encoding="UTF-8"?>
<!--status:设置log4j2自身内部的信息输出,可不设置,设置成trace时,会打印log4j2内部各种详细输出-->
<!--        高->低:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL -->
<!--monitorInterval:设置间隔秒数,最小为5s(不用写单位)。Log4j2能自动检测配置文件是否修改,若修改则重新配置,此项-->
<Configuration status="error">
    <!--先定义所有的appender -->
    <Appenders>
        <!-- 输出到控制台的配置 -->
        <!-- target:SYSTEM_OUT 或 SYSTEM_ERR,默认是SYSTEM_OUT -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 输出日志的格式 -->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>

        <!--此文件会打印出所有信息 -->
        <!--append:TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件,默认值是true -->
        <File name="log" fileName="D:/logs/log4j2.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!--ThresholdFilter:过滤器,可输出某个级别以及以上的类别  -->
        <!--                onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 -->  
        <File name="ERROR" fileName="D:/logs/error.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>


        <!--打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入文件并进行压缩,作为存档 -->
        <RollingFile name="RollingFile" fileName="D:/logs/web.log"
                     filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="2MB"/>
        </RollingFile>
    </Appenders>

    <!--然后定义logger,只有定义了logger并引入刚才的的appender配置,appender才会生效 -->
    <!--   若logger标签定义了level,则会覆盖root标签的level,否则使用root标签的level。见下边的 “指定特定类的输出” -->
    <Loggers>
        <Root level="trace">
            <Appender-ref ref="RollingFile"/>
            <Appender-ref ref="Console"/>
            <Appender-ref ref="ERROR" />
            <Appender-ref ref="log"/>
        </Root>
    </Loggers>
</Configuration>

 缺省配置(若没有提供自己的配置文件,log4j2会用此配置)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

指定特定类的输出

示例1:com.foo.Bar类下输出TRACE及以上到控制台外,其他只输出ERROR以上的日志。

配置:

<Console name="Console" target="SYSTEM_OUT">
    <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>

<Loggers>
  <Logger name="com.foo.Bar" level="TRACE"/>
  <Root level="ERROR">
    <AppenderRef ref="Console">
  </Root>
</Loggers>

因为com.foo.Bar没有自己的Appender,所以会使用ROOT的Appender。如果自己也配置了在控制台打印,就要注意可加性。如过com.foo.Bar如下配置,会打印两次。

<Logger name="com.foo.Bar" level="trace">
  <AppenderRef ref="Console"/>
</Logger>

示例2:com.foo.Bar的trace及以上只打印到文件,不打印到控制台

如果不想使用Root的Appender,可以加上additivity="false"参数。

(注意:additivity默认为true。下边配置文件中,如果不加additivity="false",则com.foo.Bar的trace及以上既打印到文件,又打印到控制台)。

<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <RollingFile name="RollingFile" fileName="${sys:user.home}/logs/trace.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
           ...
    </RollingFile>
  </Appenders>
  <Loggers>
    <Logger name="com.foo.Bar" level="trace" additivity="false">
      <AppenderRef ref="RollingFile"/>
    </Logger>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

打印格式化日志信息

符号

含义

示例

%c或%class

列出logger名字空间全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间

假设当前logger名字空间是”a.b.c”

%c       a.b.c

%c{2}     b.c

%C

列出调用logger的类的全名(包含包路径)

假设当前类是”org.apache.xyz.SomeClass”

%C      org.apache.xyz.SomeClass

%C{1}    SomeClass

%d

输出日志时间点的日期或时间,默认格式为ISO8601,也可在其后指定格式,

比如:%d{yyyMMMddHH:mm:ss,SSS},

输出:2005/10/12 22:23:30,117

比如:%d{DATE}

输出:12 Oct 2005 22:23:30,117

{}内还可以选:ABSOLUTE,ISO8601等

%F

显示调用logger的类文件名

Myclass.java

%l

输出日志事件的发生位置,包括类目名、发生的线程,行数。

举例:Testlog4.main(TestLog4.java:10)

%L

显示调用logger的代码行

举例:10

%m或%msg

显示代码中指定的消息

%M

显示调用logger的方法名

%n

输出一个当下平台的换行符

%p

输出该条日志的优先级,即DEBUG,INFO...

%r

输出自应用启动到输出该日志已经经过的毫秒数

%t

输出产生该日志事件的线程名

%x

按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志

假设某程序Myapp调用com.foo.Bar

%c %x-%m%n

输出结果:

Myapp-Call com.foo.Bar

com.foo.Bar-Log in Bar

Myapp-Return to Myapp

%X

按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一个服务器,方便服务器区分是哪个客户端访问留下的日志。

%X{5}  记录代号为5的客户端的日志

%%

显示一个百分号

ThresholdFilter

上边是文章的部分内容,为便于维护,全文已转移到此网址:Java日志-log4j2/log4j-使用/教程/实例 - 自学精灵

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值