当前位置: 首页 > 工具软件 > Robo4J > 使用案例 >

MongoDB + Log4j 2:搭建日志服务

韦正业
2023-12-01

    最近有个需求:日志统一管理。在服务器上,使用MongoDB保存日志信息,项目中,使用Log4j 2控制日志输出。这样可以在自己电脑使用MongoDB可视化工具,查看日志信息,便于监视程序运行情况。

    只提供三种日志级别对象:error、info、debug。项目日志信息保存至设定的数据库中,按照不同日志级别分别保存至不同的集合中,便于查找日志信息。

    以下是实际开发内容:

    环境信息:CentOS_6.5、JDK_1.8、MongoDB_3.6.4

    pom.xml:

<dependencies>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-nosql</artifactId>
        <version>2.5</version>
    </dependency>
</dependencies>

备注:上面所列出的是必须的依赖信息。实际会引入log4j-api、log4j-core、log4j-nosql、mongo-java-driver这四个文件。

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<Configuration status="off" monitorInterval="30">
    <!-- 
        配置日志信息在mongodb数据库中的存储信息:
        databaseName:数据库名称,collectionName:集合名称,server:服务器地址,port:服务端口号
        bufferSize:缓冲队列的大小,默认1024,缓冲区大小必须是2的幂。设置为0,记录的日志会立即写入。
    -->
    <Appenders>
        <NoSql name="errorMongo" bufferSize="16"><!-- error日志 -->
            <MongoDb databaseName="mongodbLogs" collectionName="errorLog" server="172.0.0.1" port="27017"/>
        </NoSql>
        <NoSql name="infoMongo" bufferSize="16"><!-- info日志 -->
            <MongoDb databaseName="mongodbLogs" collectionName="infoLog" server="172.0.0.1" port="27017"/>
        </NoSql>
        <NoSql name="debugMongo" bufferSize="16"><!-- debug日志 -->
            <MongoDb databaseName="mongodbLogs" collectionName="debugLog" server="172.0.0.1" port="27017"/>
        </NoSql>
        <NoSql name="rootMongo" bufferSize="16"><!-- root(默认)日志 -->
            <MongoDb databaseName="mongodbLogs" collectionName="autoLog" server="172.0.0.1" port="27017"/>
        </NoSql>
    </Appenders>

    <!-- 
	additivity:默认程序会打印高于或等于所设置级别的日志信息,设置属性为false,可防止重复打印。
    -->
    <Loggers>
        <Logger name="errorMongoLog" level="error" additivity="false">
            <appender-ref ref="errorMongo"/>
        </Logger>
        <Logger name="infoMongoLog" level="info" additivity="false">
            <appender-ref ref="infoMongo"/>
        </Logger>
        <Logger name="debugMongoLog" level="debug" additivity="false">
            <appender-ref ref="debugMongo"/>
        </Logger>
        <Root level="info"><!-- 实际未使用rootlogger -->
            <appender-ref ref="rootMongo" />
        </Root>
    </Loggers>
</Configuration>

MongoDBLogUtil.java

package com.nba;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * 使用log4j 2保存日志信息至mongodb
 */
public class MongoDBLogUtil {

    // 默认root
//  private static Logger rootLogger = LogManager.getLogger(MongoDBLogUtils.class);
    // 指定errorLogger
    private final static Logger ERROR_LOGGER = LogManager.getLogger("errorMongoLog");
    // 指定infoLogger
    private final static Logger INFO_LOGGER = LogManager.getLogger("infoMongoLog");
    // 指定debugLogger
    private final static Logger DEBUG_LOGGER = LogManager.getLogger("debugMongoLog");

    // 保存error级别的日志
    public static void setErrorLogger(String message){
        ERROR_LOGGER.error(message);
    }
    // 保存info级别的日志
    public static void setInfoLogger(String message){
        INFO_LOGGER.info(message);
    }
    // 保存debug级别的日志
    public static void setDebugLogger(String message){
        DEBUG_LOGGER.debug(message);
    }
}

    以上,就是日志服务的内容。当前日志服务比较简单,可以根据实际需求进行扩展及调整。实际上,主要的工作,即log4j 2与MongoDB进行交互及日志信息、格式等均由工具包实现。

    实现过程中,也遇到一些奇特的现象 —— 使用log4j-nosql时,最初使用的是最新的2.9版本,但在实际使用时,保存debug日志到集合中时,其他级别的集合也同时保存了debug日志信息。即无法实现按照日志级别将日志信息进行分类保存。更换至2.5版本后,此问题消失。

    当时急于实现功能,未细致查看原因。不知是操作错误导致,还是其他问题。有时间可以在探查。

    补充,log4j 2配置文件查询顺序:

1、系统属性:log4j.configurationFile;
2、classpath:log4j2-test.properties;
3、classpath:log4j2-test.yaml or log4j2-test.yml;
4、classpath:log4j2-test.json or log4j2-test.jsn;
5、classpath:log4j2-test.xml;
6、classpath:log4j2.properties;
7、classpath:log4j2.yaml or log4j2.yml;
8、classpath:log4j2.json or log4j2.jsn;
9、classpath:log4j2.xml;
10、默认配置,日志输出至:console.

    log4j 2功能很多,没事翻一翻官方文档还是有用的,特别是有时候遇到一些属性不是太了解,可以去查看查看,官方文档还是最权威、最可靠的资料。

    附:

        官网地址:http://logging.apache.org/log4j/2.x/manual/index.html

        MongoDB可视化工具Robo 3T:https://robomongo.org/

 类似资料: