• SpringBoot 使用 Log4j2 结合 Mongodb记录日志


    一、安装Mongodb

    首先,安装Mongodb,我这里使用的是Linux7,windows版本自行百度。

    二、添加依赖

    我这里使用的是SpringBoot2.x.x版本,如果发现jar包冲突,不出意外就是别的jar包引入了logback,只需排除logback依赖即可。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <!--必须排除掉默认的logback-->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- mongodb driver -->
     <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
     <dependency>
         <groupId>org.mongodb</groupId>
         <artifactId>mongo-java-driver</artifactId>
         <version>3.10.1</version>
     </dependency>
    
     <!-- log4j2 -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-log4j2</artifactId>
     </dependency>
    
     <!-- 必需,否则报错 Springboot 1.5.x 使用 2.7版本-->
     <!--log4j-core-->
     <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-core</artifactId>
         <version>2.9.1</version>
     </dependency>
     <!-- 必需,否则报错 Springboot 1.5.x 使用 2.7版本-->
     <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-nosql -->
     <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-nosql</artifactId>
         <version>2.9.0</version>
     </dependency> 
    

    三、配置Log4j

    这里使用了多环境配置,在dev中,只在控制台打印日志,test、prod环境只将日志记录在mongodb中。
    在这里插入图片描述
    下面给出Log4j2三个环境的配置xml

    log4j2-dev.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
        主标签,有两个log4j2的关键属性:
        status:设置log4j2的自身log级别。日志级别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,
        其中 off 表示关闭日志输出,fatal 表示严重错误。
        monitorInterval:Log4j2能够自动检测配置文件变化,并使用新的配置,这个单位是秒。
    -->
    <!--设置log4j2的自身log级别为warn -->
    <Configuration status="warn">
    
        <!--自定义属性-->
        <properties>
            <!--输出日志的格式:
                %level{参数1}{参数2}{参数3} ##输出日志的级别
                %d{yyyy-MM-dd HH:mm:ss, SSS}:日志生产时间
                %t:打印日志方法所在线程名
                %p:日志输出格式
                %F|%file                  ##输出文件名
                %c{参数} 或 %logger{参数}  ##输出日志名称
                %C{参数} 或 %class{参数    ##输出类型
                %m 或 %msg 或 %message ##输出日志信息
                %n:换行符
                %C:Java类名
                %l  ##输出错误的完整位置
                %L:日志输出所在行数
                %M 或 %method ##输出方法名
                hostName:本地机器名
                hostAddress:本地ip地址
                highlight{pattern}{style} ##高亮显示
            -->
            <property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %C{36}.%M(%F:%L) %msg%xEx%n</property>
        </properties>
    
        <Appenders>
            <Console name="ConsoleLog" target="SYSTEM_OUT">
                <!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
                <!--输出日志的格式,引用自定义模板 pattern -->
                <PatternLayout charset="UTF-8" pattern="${pattern}"/>
            </Console>
        </Appenders>
    
        <!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 -->
        <Loggers>
            <!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置-->
            <logger name="org.springframework" level="warn"/>
    
            <!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
                比如,这里level="fatal",则Appenders中只出现fatal信息。
                温馨提示:prodlevel建议设置为warn
            -->
            <Root level="info">
                <!-- 输出器,可选上面定义的任何项组合,或全选-->
                <appender-ref ref="ConsoleLog"/>
            </Root>
        </Loggers>
    
    </Configuration>
    

    log4j2-test.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
        主标签,有两个log4j2的关键属性:
        status:设置log4j2的自身log级别。日志级别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,
        其中 off 表示关闭日志输出,fatal 表示严重错误。
        monitorInterval:Log4j2能够自动检测配置文件变化,并使用新的配置,这个单位是秒。
    -->
    <!--设置log4j2的自身log级别为warn -->
    <Configuration status="warn">
    
        <Appenders>
            <!-- 配置mongdb appender -->
            <NoSql name="MongoAppender">
                <!--参数分别是:数据库名,集合名,服务器ip,端口。还可以指定其他参数或升级版本,详情请看:http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender-->
                <MongoDb databaseName="test" collectionName="log" server="192.168.0.146" port="27017"/>
            </NoSql>
        </Appenders>
    
        <!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 -->
        <Loggers>
            <!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置-->
            <logger name="org.springframework" level="warn"/>
    
            <!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
                比如,这里level="fatal",则Appenders中只出现fatal信息。
                温馨提示:prodlevel建议设置为warn
            -->
            <Root level="info">
                <!-- 输出器,可选上面定义的任何项组合,或全选-->
                <appender-ref ref="MongoAppender" />
            </Root>
        </Loggers>
    
    </Configuration>
    

    log4j2-prod.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
        主标签,有两个log4j2的关键属性:
        status:设置log4j2的自身log级别。日志级别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,
        其中 off 表示关闭日志输出,fatal 表示严重错误。
        monitorInterval:Log4j2能够自动检测配置文件变化,并使用新的配置,这个单位是秒。
    -->
    <!--设置log4j2的自身log级别为warn -->
    <Configuration status="warn">
    
        <Appenders>
            <!-- 配置mongdb appender -->
            <NoSql name="MongoAppender">
                <!--参数分别是:数据库名,集合名,服务器ip,端口。还可以指定其他参数或升级版本,详情请看:http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender-->
                <MongoDb databaseName="prod" collectionName="log" server="192.168.0.146" port="27017"/>
            </NoSql>
        </Appenders>
    
        <!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 -->
        <Loggers>
            <!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置-->
            <logger name="org.springframework" level="warn"/>
    
            <!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
                比如,这里level="fatal",则Appenders中只出现fatal信息。
                温馨提示:prodlevel建议设置为warn
            -->
            <Root level="info">
                <!-- 输出器,可选上面定义的任何项组合,或全选-->
                <appender-ref ref="MongoAppender" />
            </Root>
        </Loggers>
    
    </Configuration>
    

    然后是SpringBoot的配置文件,每个环境指定对应的Log4j的配置即可。

    application-dev.yml

    # spring boot会自动加载mongodb,这里需要配置mongodb
    spring:        
        data:
          mongodb:
            uri: mongodb://192.168.0.146/dev
            port: 27017
    logging:
      config: classpath:config/log4j2-dev.xml
    

    application-test.yml

    # spring boot会自动加载mongodb,这里需要配置mongodb
    spring:        
        data:
          mongodb:
            uri: mongodb://192.168.0.146/test
            port: 27017
    logging:
      config: classpath:config/log4j2-test.xml
    

    application-prod.yml

    # spring boot会自动加载mongodb,这里需要配置mongodb
    spring:        
        data:
          mongodb:
            uri: mongodb://192.168.0.146/prod
            port: 27017
    logging:
      config: classpath:config/log4j2-prod.xml
    

    四、测试

    现在application.yml中配置profiles为dev

    spring:
      profiles:
        active: dev
    

    可以发现日志都正常打印。
    在这里插入图片描述
    然后将profiles改为为test

    spring:
      profiles:
        active: test
    

    可以看到控制台已经不打印日志
    在这里插入图片描述
    我们使用Studio 3T连接mongodb看看
    在这里插入图片描述
    在这里插入图片描述

    我们可以看到,多了一个test库,正是我们配置的test库,log集合也有了,prod环境和test环境大同小异,就不多说了。
    这里日志成功记录到了mongodb中,但是我们总不可能每次都去mongodb中查看日志,我这里有一个简单的查日志的项目,有兴趣可以看看。


    作者:不敲代码的攻城狮
    出处:https://www.cnblogs.com/leigq/
    任何傻瓜都能写出计算机可以理解的代码。好的程序员能写出人能读懂的代码。

     
  • 相关阅读:
    pwnable.kr之input
    pwnable.kr之bof
    pwnable.kr之fd
    运维及服务器组成详解
    查看锁信息(开启InnoDB监控)
    【原创】记一次MySQL大表高并发写入引发CPU飙升的排障过程
    【原创】获取MySQL crash 时的core file
    【原创】MySQL Replay线上流量压测工具
    python面向对象
    TCP三次握手与四次挥手
  • 原文地址:https://www.cnblogs.com/leigq/p/13406553.html
Copyright © 2020-2023  润新知