最近有个需求:日志统一管理。在服务器上,使用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/