log4j2基本使用手册

一、下载、导入、配置

log4j2是Apache公司开发的插件,用于控制、输出log信息等。log4j2是log4j 1.x 的升级版,2015年5月,Apache宣布log4j1.x 停止更新。
下载地址:http://logging.apache.org/log4j/2.x/download.html
下载下来的文件:apache-log4j-2.13.3-bin.zip
1、将解压出来的log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar引用到项目中。
2、在项目的src类目录下新建一个配置文件:右键src -> New -> Other -> General -> File,文件名一定要是:log4j2.xml 否则会找不到相关配置路径,到时候打印日志就只能使用内置的配置形式了。
3、配置好后,在函数中声明
Logger logger = LogManager.getLogger(LogManage.class.getName());
即可调用:
logger.debug(“输出的内容”);

二、配置文件详解

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 对配置状态进行关闭,不把打印的细节在控制台中输出 -->
<!-- 该配置状态分为8个级别:从高到低:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL -->
<Configuration status="OFF">
 
  <Appenders>
    <!-- 在控制台打印日志 -->
    <Console name="Console" target="SYSTEM_OUT">
    	<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
    </Console>

    <!-- 日志输出分为6个级别:从高到低:FATAL、ERROR、WARN、INFO、DEBUG、TRACE -->
    
    <!-- Debug调试级别 -->
    <!-- 这里根据你的个人习惯来写就好了,不细分的话写一个File就好了 -->
    <!-- 输出日志文件,位置自动保存在项目根目录下的logs文件夹中 -->
    <File name="MyDebugFile" fileName="logs/debug.log">
	    <!-- 我这么写是为了把不同级别的日志筛选开来,便于查看 -->
	    <!-- Filter过滤器,以此设置日志级别,进行不同程度的日志区分,如果不这样细分,可把Filter去掉 -->
	    <!-- 比如这样设置:<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>  -->
    	<Filters>
    		<!-- 第一步 onMatch="DENY":匹配到info及更高级别就DENY过滤掉,其他的NEUTRAL保留 -->
    		<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/> 
		    <!-- 第二步 onMatch="ACCEPT":匹配到debug及更高级别就ACCEPT保留,其他的DENY过滤掉 -->
		    <!-- 经过两步过滤,把debug以上的和以下的级别全部过滤,最终剩下debug级别 -->
    		<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> 
    	</Filters>
    	<!-- 对打印语句的格式进行设置。格式注释见下文 -->
    	<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>     
    </File>
    
    <!-- Info信息级别 -->
    <File name="MyInfoFile" fileName="logs/info.log">
    	<Filters> 
    		<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> 
    		<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 
    	</Filters>
      	<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>     
    </File>

    <!-- Warn警告级别 -->
    <File name="MyWarnFile" fileName="logs/warn.log">
	    <Filters> 
		    <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> 
		    <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> 
	    </Filters>
	    <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>     
    </File>

    <!-- Error错误级别 -->
    <File name="MyErrorFile" fileName="logs/error.log">
	    <Filters> 
		    <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/> 
		    <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> 
	    </Filters>
	    <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>     
    </File>

    <!-- Fatal严重错误级别 -->
    <File name="MyFatalFile" fileName="logs/fatal.log">
	    <ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/> 
	    <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>     
    </File>
    
    
    <!-- 这个文件会打印出所有信息。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>

    <!-- 此项可配置按日期或按日志大小进行滚动存档。 -->
    <RollingFile name="taoge" fileName="logs/taoge.log" filePattern="logs/taoge.%d{yyyy-MM-dd}.log" append="true">
    	<!-- 输出格式 -->  
        <PatternLayout pattern="[%l] [%t] [%-4r] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] \: %m%n"/>
        <!-- 设置策略 -->
        <Policies>
        	<!-- 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
				interval:integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟
				modulate:boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。
					比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:0012:0016:00	-->
			<!--1天更新一次,此处查阅网上和官方示例中,都是以小时出现,我测试是以天为单位。(官方文档中说明按item类型是否是小时,但没找到在哪里设置item类型)另有其他各类型策略,请参阅官方文档 --> 
			<!-- TimeBasedTriggeringPolicy需要和filePattern配套使用,由于filePattern配置的时间最小粒度是dd天,所以表示每一天新建一个文件保存日志。SizeBasedTriggeringPolicy表示当文件大小大于指定size时,生成新的文件保存日志。 --> 
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />  
        </Policies>
        
        <!-- 此项可配置定期删除,最多备份30天以内的日志,此处为策略限制,Delete中可以按自己需要用正则表达式编写 -->
        <!-- DefaultRolloverStrategy字段中加入max=30”经测试是配合SizeBasedTriggeringPolicy限制%i的存在数量,并没有发现是网上流传的是最多保存多少个文件的限制,也或许是我写的有问题  -->
        <DefaultRolloverStrategy>  
        	<Delete basePath="x:/xxxx" maxDepth="1">  
	            <IfFileName glob="logs_*.log" />  
	            <IfLastModified age="30d" />  
            </Delete>  
        </DefaultRolloverStrategy>
    </RollingFile>
    
  </Appenders>
  
  <!-- 定义Loggers,只有定义了Loggers并引入刚才的appender配置,配置才会生效 --> 
  <Loggers>
    <Root level="trace">
      <!-- Only events at DIAG level or more specific are sent to the console. -->
      <AppenderRef ref="Console"/>
      <AppenderRef ref="MyDebugFile"/>
      <AppenderRef ref="MyInfoFile"/>
      <AppenderRef ref="MyWarnFile"/>
      <AppenderRef ref="MyErrorFile"/>
      <AppenderRef ref="MyFatalFile"/>
    </Root>
  </Loggers>
</Configuration>

日志输出格式设置:%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"
格式一览表:
%d: 输出日志发生时间,可进行格式{yyy-MM-dd HH:mm:ss.SSS}设置,也可不用
%-6level: 输出的级别信息右对齐,总长度为6字符;正数为左对齐,看个人习惯
%t: 输出产生该日志事件的线程名
%F: 输出日志信息所属的类的类名
%l: 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%msg: 输出日志信息
%n: 换行
%c: 输出日志信息所属的类的全名
%c: 输出自应用启动到输出该日志信息所耗费的毫秒数

三、配置节点说明

1、 Configuration:每一个 LoggerContext 都有一个有效的 Configuration, Configuration 包含所有的Appender 、Filter、LoggerConfig ,StrSubstitutor引用和对Layout的格式设置。有两个属性:
       status用来指定log4j本身的打印日志的级别.
       monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
2、 子节点Appender:Log4j2 还允许将记录请求输出到多个目标中,而这种输出目标被称为Appender。目前Appender的类型有控制台、文件、socket、Apache Flume、JMS、远程UNIX 系统日志守护进程以及各种数据库API,用户可以根据需要选择将日志输出到不同的目标上,同时在一个Logger的配置中,允许开启多个Appender。
常见的有三种子节点:Console、RollingFile、File.
    Console节点用来定义输出到控制台的Appender.
        name:指定Appender的名字.
        target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
        PatternLayout:输出格式,不设置默认为:%m%n.
    File节点用来定义输出到指定位置的文件的Appender.
        name:指定Appender的名字.
        fileName:指定输出日志的目的文件带全路径的文件名.
        PatternLayout:输出格式,不设置默认为:%m%n.
    RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.
        name:指定Appender的名字.
        fileName:指定输出日志的目的文件带全路径的文件名.
        PatternLayout:输出格式,不设置默认为:%m%n.
        filePattern:指定新建日志文件的名称格式.
        Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
        TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
     SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
     DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
3、 子节点Logger : Logger继承自 AbstractLogger,当配置被修改后,它将与不同的 LoggerConfig 相关联,这导致其行为也被改变。
常见的有两种:Root和Logger.
       Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
         level:日志输出级别.
         AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
       Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
         level:日志输出级别
         name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
         AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
4、 LoggerConfig:LoggerConfig 对象在 Logger 被声明时创建,它包含了一组用于处理事件的Appender引用,以及一组用于过滤传递给Appender事件的Filter,相当于是Appender的集合。
5、 Filter :Log4j2 提供了Filter 来过滤消息事件,它可被应用于事件传递给LoggerConfig之前,及传递给LoggerConfig之后,即LoggerConfig的前后置拦截器。
Filter包含了三种行为:Accept,Deny或Neutral,其中Accept,Deny分别代表着接受和拒绝,即过滤器接受或拒绝某种日志过滤表达式等,经过这两种行为处理后将不再经过其他过滤器。
Neutral代表着中立,意味着事件应由其他Filter来处理。如果未配置任何Filter,那么事件将直接被处理。
6、 Layout:Log4j2除了可以输出到不同的目标Appender之外,还支持在目标中定义自定义的日志格式,Layout 负责对日志事件进行格式化,通过配置PatternLayout来实现。
7、 StrSubstitutor和StrLookup:这两个组件用来对Log4j2中的各项配置进行动态变量赋值。
8、 日志级别:LoggerConfig会被分配一个日志级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
      All:最低等级的,用于打开所有日志记录.
      Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
      Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
      Info:消息在粗粒度级别上突出强调应用程序的运行过程.
      Warn:输出警告及warn以下级别的日志.
      Error:输出错误信息日志.
      Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
      OFF:最高等级的,用于关闭所有日志记录.
      程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。

四、log4j2在Tomcat项目中的使用

log4j2的jar包:
log4j-core-2.3.jar
log4j-api-2.3.jar
log4j-1.2-api-2.3.jar
都放到 tomact 目录下的lib文件夹下,将log4j2.xml也放到tomcat目录下lib文件夹下,然后删除或重命名tomact目录下conf文件夹下的logging.properties文件。重新启动Tomcat,则可以正常输出log。
否则,如果只在Java项目中引用并import相应的jar包,在本地调试可以正常输出log,但部署到Tomcat服务器上去运行的时候就会没有log输出。

————————————————————————————

参考链接

https://blog.csdn.net/weixin_44174530/article/details/103889260
https://blog.csdn.net/z69183787/article/details/53584648
https://blog.csdn.net/liangyue1994/article/details/98853231
https://blog.csdn.net/tutian2000/article/details/81903924

谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值