栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Log4j2-study

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Log4j2-study

目录标题
    • 一、配置文件
    • (一)动态刷新配置——monitorInterval
    • (二)Configuration的status属性
    • (三)日志级别——通过属性level指定
    • (四)Logger与Root标签
    • (五)Log4j2.xml 对大小写不敏感
    • (六)Logger 的additivity属性
    • (七)appender-ref的ref属性
    • 二、appender
    • (一)Console
    • (二)RollingRandomAccessFile
    • (三)RollingFile
    • 三、Patterns
    • 四、Java 使用Log4j2
    • (一)导入pom依赖
    • (二)配置Log4j2.xml
    • (三)使用日志
    • (四)加载指定路径下的配置文件
    • 五、比较完整的log4j2.xml配置
    • 六、参考

一、配置文件

常用配置选项




	
	
	
	
	

(一)动态刷新配置——monitorInterval

monitorInterval:从文件配置时,Log4j 能够自动检测对配置文件的更改并重新配置自身。如果在配置元素上指定了 monitorInterval 属性并将其设置为非零值,则在下次评估和/或记录日志事件时将检查该文件,并且自上次检查以来已经过去了 monitorInterval。下面的示例显示了如何配置该属性,以便仅在经过至少 30 秒后才检查配置文件的更改。最小间隔为 5 秒。





(二)Configuration的status属性

Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。
status 属性的有效值为“trace”、“debug”、“info”、“warn”、“error”和“fatal”。以下配置将状态属性设置为调试。



(三)日志级别——通过属性level指定

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。对于Loggers中level的定义同样适用。
例子:


   

	public static void main(String[] args) {
		Logger logger = LogManager.getLogger("mylog");
		logger.trace("trace level");
		logger.debug("debug level");
		logger.info("info level");
		logger.warn("warn level");
		logger.error("error level");
		logger.fatal("fatal level");
	}
(四)Logger与Root标签

可以简单的将Root认为默认的日志输出控制,并且这个默认的输出是不会被覆盖的。也就是当你输出日志的时候只要日志级别比Root指定的低那么一定会输出。


    
        
    
    
        
    

例子:

  1. 只配置Root

    
        
    

public class Log4j2Test {
    private static final Logger logger = LogManager.getLogger();
    @Test
    public void test(){
        logger.trace("trace level");
        logger.debug("debug level");
        logger.info("info level");
        logger.warn("warn level");
        logger.error("error level");
        logger.fatal("fatal level");
    }
}

输出:

  1. 增加一个Logger 配置名字为myLog
    注意:name的值随意,一般为类路径。name的值可以重复,但是重复的name只有一个会生效。

    
        
    
    
        
    

public class Log4j2Test {
    private static final Logger logger = LogManager.getLogger("myLog");
    @Test
    public void test(){
        logger.trace("trace level");
        logger.debug("debug level");
        logger.info("info level");
        logger.warn("warn level");
        logger.error("error level");
        logger.fatal("fatal level");
    }
}

输出:你会发现每条日志都重复输出了。这是因为Root和Logger叠加在一起了,并且还是以日志级别高的为准。那么我们可以避免叠加吗?当然可以,Logger 的additivity属性就可以做到。

(五)Log4j2.xml 对大小写不敏感

注意:Log4j2对大小写不敏感,AppenderRef == appender-ref。configuration ==Configuration

(六)Logger 的additivity属性

Logger 的additivity属性默认为true也就是可以叠加的。如果我们不想要日志叠加输出,那么可以将值设置为false。


    
        
        
    
    
        
    

(七)appender-ref的ref属性

    
    	
        
        
        
    
    
        
    

注意:ref的值为appenders标签里面定义的appender(扩展、插件)的name的值。

二、appender (一)Console
参数名类型描述
filterFilter指定一个过滤器来决定是否将日志事件传递给 Appender 处理。可以指定为一个 CompositeFilter 来使用多个过滤器。
layoutLayout指定格式化 LogEvent 的 Layout。如果没有指定 Layout,则默认使用 %m%n 格式。
followboolean在配置好之后,是否可以通过 System.setOut 或 System.setErr 来重新指定输出位置为 System.out 或 System.err。不能在 Windows 下用于 Jansi ,也不能和 direct 属性一起使用。
directboolean绕开 java.lang.System.out/.err 直接写入 java.io.FileDescriptor。当输出重定向到文件或其他目标时可以节约 10 倍的性能消耗。不能在 Windows 下用于 Jansi,也性不能和 follow 属性一起使用。在多线程应用中,输出不会遵循 java.lang.System.setOut()/.setErr() ,而是可能会和其他输出纠缠在一起输出到 java.lang.System.out/.err。该属性是 2.6.2 版本新增的,目前仅在 Linux 和 Windows 下的 Oracle JVM 环境中测试过。
nameString必选的 Appender 的名称,表示区别于其他 Appender 的唯一标识。
ignoreExceptionsboolean默认为 true,表示当输出事件时出现的异常将会被内部记录而忽略。 当设置为 false 时,则会将异常传播给调用者。当将该 Appender 包装成 FailoverAppender 时,必须设置为 false。
targetString SYSTEM_OUT 或 SYSTEM_ERR。默认为 SYSTEM_OUT。

	
	  
	

(二)RollingRandomAccessFile

RollingRandomAccessFile 有一下属性

参数名类型描述
appendboolean当为 true(默认)时,日志记录将会添加到文件末尾。设置为 false 时,日志记录写入文件之前会清空文件。
bufferedIOboolean当为 true(默认)时,日志记录将会写入一个缓冲区,当缓冲区满或设置了 immediateFlush ,日志记录才会写入磁盘中。 该属性不能使用文件锁。缓冲 I/O 能够显著提高性能,即使启用了immediateFlush 。
bufferSizeint当 bufferedIO 为 true 时,该属性用来设置缓冲区的大小,默认为 8192 字节。
createOnDemandbooleanAppender 是按需(on-demand)创建文件的。仅当日志事件通过所有过滤器并到达 Appender 时,该 Appender 才会创建文件。默认为 false。
filterFilter指定一个过滤器来决定是否将日志事件传递给 Appender 处理。可以指定为一个 CompositeFilter 来使用多个过滤器。
fileNameString设置写入日志记录的文件名。如果该文件或其父目录不存在,则会自动创建。
filePatternString归档日志文件的文件名模式(pattern)。该模式依赖于所用的 RolloverPolicy 。DefaultRolloverPolicy 可以接受兼容 SimpleDateFormat 的日期/时间或表示一个整数的计数器的 %i 。该模式也支持运行时插入值(interpolation),故任何 Lookup(比如 DateLookup)都可以包含该模式。
immediateFlushboolean当为 true(默认)时,每次写入都会跟随一次 flush 。这将保证数据写入磁盘,但会影响性能。仅当使用异步 Logger 的 Appender 时设置每次写入都进行 flush 才有用。异步的 Logger 和 Appender 会在一批次的日志事件末尾自动 flush ,即使该属性设置为 false ,这种方式也可以保证数据写入磁盘,但是更有效率。
layoutLayout指定格式化 LogEvent 的 Layout 。如果没有指定 Layout ,则默认使用 %m%n 格式。
nameString必选的 Appender 的名称,表示区别于其他 Appender 的唯一标识。
policyTriggeringPolicy设置确定是否创建文件的规则(policy)。
strategyRolloverStrategy设置确定归档文件的文件名和位置的策略(strategy)。
ignoreExceptionsboolean默认为 true ,表示当输出事件时出现的异常将会被内部记录而忽略。 当设置为 false 时,则会将异常传播给调用者。当将该 Appender 包装成 FailoverAppender 时,必须设置为 false 。
filePermissionsString设置每当创建文件时所用的 POSIX 格式的文件属性权限。底层文件系统应该支持 POSIX 格式的文件属性视图。比如: rw------- 或 rw-rw-rw- 等。
fileOwnerString指定每次创建文件的属主。由于权限原因,可能不允许更改文件属主,这时会抛出 IOException 。仅当有效的目标用户 ID 和文件的用户 ID 相同,或目标用户 ID 具有修改文件属主的权限(如果 _POSIX_CHOWN_RESTRICTED 在日志文件路径下有效)时才会处理。底层文件系统应该支持 owner 文件属性视图。
fileGroupString指定每次创建文件的属组。底层文件系统应该支持 POSIX 格式的文件属性视图。

    
    
        
        
        
            
            
            
        
         
        
        	
            
                
                
            
        
    

注意:

  1. TimebasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimebasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。
  2. filePattern定义的是每天生成一个日志文件,但是如果一天内的日志文件体积已经超过50M,就从新生成,两个条件满足一个即可。
  3. filePattern 日志文件与 fileName 日志文件
    • fileName 指定当前日志文件的位置和文件名称
    • filePattern 指定当发生Rolling时,文件的转移和重命名规则
(三)RollingFile

RollingFile 与RollingRandomAccessFile功能类似。


    
    
    
    
        
            
            
        
    

三、Patterns
######### 常见参数 #########
//
%c{参数} 或 %logger{参数}  ##输出日志名称
%C{参数} 或 %class{参数    ##输出类型
%d{参数}{时区te{参数}{时区} ##输出时间
%F|%file                  ##输出文件名
highlight{pattern}{style} ##高亮显示
%l  ##输出错误的完整位置
%L  ##输出错误行号
%m 或 %msg 或 %message ##输出错误信息
%M 或 %method ##输出方法名
%n            ##输出换行符
%level{参数1}{参数2}{参数3} ##输出日志的级别
%t 或 %thread              ##创建logging事件的线程名
*/

######### 特殊符号 ############
#有些特殊符号不能直接打印,需要使用实体名称或者编号
//
& —— & 或者 &
< —— <  或者 <
> —— >  或者 >
“ —— " 或者 "
‘ —— ' 或者 '
*/

######## pattern对齐修饰 ##########

// 对齐修饰,可以指定信息的输出格式,如是否左对齐,是否留空格等。
## 编写格式为在任何pattern和%之间加入一个小数,可以是正数,也可以是负数。
## 整数表示右对齐,负数表示左对齐;
## 整数位表示输出信息的最小n个字符,如果输出信息不够n个字符,将用空格补齐;
## 小数位表示输出信息的最大字符数,如果超过n个字符,则只保留最后n个字符的信息
## (注意:保留的是后20个字符,而不是前20个字符)
*/

#示例如下
//

%20 —— 右对齐,不足20个字符则在信息前面用空格补足,超过20个字符则保留原信息
%-20 —— 左对齐,不足20个字符则在信息后面用空格补足,超过20个字符则保留原信息
%.30 —— 如果信息超过30个字符,则只保留最后30个字符
%20.30 —— 右对齐,不足20个字符则在信息前面用空格补足,超过30个字符则只保留最后30个字符
%-20.30 —— 左对齐,不足20个字符则在信息后面用空格补足,超过30个字符则只保留最后30个字符

参考:PatternLayout输出格式详解

四、Java 使用Log4j2 (一)导入pom依赖

        
        
            org.slf4j
            slf4j-api
            ${slf4j.version}
        
        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            ${log4j2.version}
        
        
        
            org.apache.logging.log4j
            log4j-core
            ${log4j2.version}
        
        
        
            org.apache.logging.log4j
            log4j-api
            ${log4j2.version}
        
        
            org.projectlombok
            lombok
            1.18.20
        
        
            junit
            junit
            4.13.2
            
        
    
(二)配置Log4j2.xml




    
        
        
        
        
    
    
        
            
        

        
        
            
            
            
            
                
                
            
            
            
                
                
                    
                    
                
            
        
    
    
        
            
            
            
        
        
            
        
    


(三)使用日志
package com.lihua;

import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.junit.Test;


public class Log4j2Test {
    private static final Logger logger = LogManager.getLogger("myLog");
    @Test
    public void test(){
        for (int i = 0; i <2 ; i++) {
            logger.trace("trace level");
            logger.debug("debug level");
            logger.info("info level");
            logger.warn("warn level");
            logger.error("error level");
            logger.fatal("fatal level");

        }
    }
}

当然你也可以结合lombok 插件的@Slf4j注解使用

package com.lihua;

import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.junit.Test;


@Slf4j
public class Log4j2Test {
    @Test
    public void test1(){
        log.trace("trace level");
        log.debug("debug level");
        log.info("info level");
        log.warn("warn level");
        log.error("error level");
    }
}
(四)加载指定路径下的配置文件

注意:log4j2.xml文件如果在resources的根目录下是会主动加载log4j2.xml配置文件的,当log4j2.xml所在目录发生变化后,可能会出错。

五、比较完整的log4j2.xml配置





    
    
        
        /app_data/logs/my_app
        
        [%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5p][%T][%c.%M:%L] %msg%xEx%n
        
        1MB
    

    
    
        
        
            
            
            
            
        

        
        
        
            
            
            
            
                
                
                
                
            
            
            
            
                

                
                
                    

                    
                    
                    
                        
                        
                        
                            
                            
                                
                                
                                
                                
                            
                        
                    
                
            
        

        
            
            
            
                
                
            
            
                
                    
                        
                        
                            
                            
                            
                        
                    
                
            
        

        
            
            
            
                
                
            
            
                
                    
                        
                            
                            
                            
                        
                    
                
            
        

        
            
            
            
                
                
            
            
                
                    
                            
                            
                            
                            
                        
                    
                
            
        

        
        
            
            
                
                
            
            
                
                    
                        
                            
                            
                            
                        
                    
                
            
        
    

    
    
        
        
            
            
            
            
            
        

        
        
        
        
            
        

        
        
        

        
        
        
        
        
        
        
        
        
        
        
        
        
    

六、参考

log4j2总结(这篇文章写得很详细,有log4j2.xml的详细配置)
官方文档
Log4j2配置文件详解

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/671593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号