• Log4j2


    Log4j2

    目前市面上最主流的日志门面就是SLF4J,虽然Log4j2也是日志门面,因为它的日志实现功能非常强 大,性能优越。所以大家一般还是将Log4j2看作是日志的实现,Slf4j + Log4j2应该是未来的大势所趋。

    案例演示

    添加pom.xml

     <dependency>
        <groupId>org.apache.logging.log4jgroupId>
        <artifactId>log4j-apiartifactId>
        <version>2.11.1version>
    dependency>
     <dependency>
        <groupId>org.apache.logging.log4jgroupId>
        <artifactId>log4j-coreartifactId>
        <version>2.11.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    添加测试类

    public class Log4j2Service {
    
        // 定义日志记录器对象
        public static final Logger LOGGER = LogManager.getLogger(Log4j2Service.class);
    
        @Test
        public void testQuick() throws Exception {
            LOGGER.fatal("fatal");
            LOGGER.error("error");
            LOGGER.warn("warn");
            LOGGER.info("info");
            LOGGER.debug("debug");
            LOGGER.trace("trace");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用slf4j作为日志门面

    添加pom.xml

             <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-apiartifactId>
            <version>1.7.25version>
        dependency>
             <dependency>
            <groupId>org.apache.logging.log4jgroupId>
            <artifactId>log4j-slf4j-implartifactId>
            <version>2.10.0version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    添加测试类

    public class Slf4jToLog4j2Service {
    
        // 定义日志记录器对象
        public final static Logger LOGGER = LoggerFactory.getLogger(Slf4jToLog4j2Service.class);
    
        @Test
        public void testQuick() throws Exception {
            LOGGER.error("error");
            LOGGER.warn("warn");
            LOGGER.info("info");
            LOGGER.debug("debug");
            LOGGER.trace("trace");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Log4j2配置

    
    
    
    <Configuration status="debug" monitorInterval="5">
    
        
        <properties>
            <property name="LOG_HOME">/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j2-test/logproperty>
        properties>
    
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/>
                Console>
            <File name=" file" fileName="${LOG_HOME}/myfile.log">
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %m%n"/>
            File>
            
            <RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log">
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %m%n"/>
            RandomAccessFile>
    
            <RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"
                         filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %msg%n"/>
                <Policies>
                    
                    <OnStartupTriggeringPolicy/>
                    
                    <SizeBasedTriggeringPolicy size="10 MB"/>
                    
                    <TimeBasedTriggeringPolicy/>
                Policies>
                
                <DefaultRolloverStrategy max="30"/>
            RollingFile>
        Appenders>
        <Loggers>
            <Root level="trace">
                <AppenderRef ref="Console"/>
                <AppenderRef ref="file"/>
                <AppenderRef ref="accessFile"/>
                <AppenderRef ref="rollingFile"/>
            Root>
        Loggers>
    Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    patternLayout的具体用法和参数可以参考官网地址:https://logging.apache.org/log4j/2.x/manual/layouts.html

    Log4j2异步日志

    log4j2最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益。

    Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应Appender组件和Logger组件。

    异步日志需要添加依赖

     
    <dependency>
        <groupId>com.lmaxgroupId>
        <artifactId>disruptorartifactId>
        <version>3.3.4version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    Appender方式
    
    
    <Configuration status="debug">
    
        <properties>
            <property name="LOG_HOME">/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j2-test/logproperty>
        properties>
    
        <Appenders>
            <File name="file" fileName="${LOG_HOME}/myfile.log">
                <PatternLayout>
                    <Pattern>%d %p %c{1.} [%t] %m%nPattern>
                PatternLayout>
            File>
            <Async name="Async">
                <AppenderRef ref="file"/>
            Async>
        Appenders>
        <Loggers>
            <Root level="error">
                <AppenderRef ref="Async"/>
            Root>
        Loggers>
    Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    AsyncLogger方式
    全局异步

    所有的日志都异步的记录,在配置文件上不用做任何改动,只需要添加一个log4j2.component.properties 配置

    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    
    • 1
    混合异步

    可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加 灵活。

    
    
    <Configuration status="debug">
    
        <properties>
            <property name="LOG_HOME">/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j2-test/logproperty>
        properties>
    
        <Appenders>
            <File name="file" fileName="${LOG_HOME}/myfile.log">
                <PatternLayout>
                    <Pattern>%d %p %c{1.} [%t] %m%nPattern>
                PatternLayout>
            File>
            <Async name="Async">
                <AppenderRef ref="file"/>
            Async>
        Appenders>
    
    
        <Loggers>
              
            <AsyncLogger name="com.machoul" level="trace" includeLocation="false" additivity="false">
                <AppenderRef ref="file"/>
            AsyncLogger>
            <Root level="info" includeLocation="true">
                <AppenderRef ref="file"/>
            Root>
        Loggers>
    Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    如上配置,com.machoul是异步的,root日志是同步的

    使用异步日志需要注意的问题:

    1. 如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。性能会和 AsyncAppender一致,降至最低。

    2. 设置includeLocation=false ,打印位置信息会急剧降低异步日志的性能,比同步日志还要 慢。

    Lookup的使用

    可以使用系统,环境,或者其他的参数来配置log4j2

    详情可以参考官网https://logging.apache.org/log4j/2.x/manual/lookups.html

    如果要实现自定义的lookup,那么需要继承AbstractLookup接口来自定义内容。

  • 相关阅读:
    哈希冲突和一致性哈希
    kubeneters 1.20 二进制方式高可用部署
    状态机-----
    2023-10-07 LeetCode每日一题(股票价格跨度)
    重组蛋白/细胞因子的实验操作
    2022春夏系列 KOREANO ESSENTIAL重塑时装生命力
    C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.8 软件比硬件更困难
    IP地址定位的特点
    Redis系列——Java客户端(Jedis,SpringDataRedis)day2-1
    hash整数映射模板(acwing840)
  • 原文地址:https://blog.csdn.net/qq_34932086/article/details/127671074