日志入库

实现方式

有两种方式:

  • 自定义 appender

  • 使用官方定义好的 appender

NoSQLAppenderMongoDB3

实战

环境:

jdk: 1.8

mongodb: 3.4.4 (未设置登录密码)

jar 引入

按照官方 demo, log4j2 版本为: 2.11.0

  [xml]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-mongodb3</artifactId> <version>2.11.0</version> </dependency> <!--mongodb--> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.4.2</version> </dependency>

log4j 配置

  [xml]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <NoSql name="databaseAppender"> <MongoDb3 databaseName="applicationDb" collectionName="applicationLog" server="127.0.0.1" /> </NoSql> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="databaseAppender"/> </Root> </Loggers> </Configuration>

测试简单方法

  • LogMain.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class LogMain { private static Logger LOG = LogManager.getLogger(LogMain.class); public static void main(String[] args) { LOG.error("error"); } }

运行 main() 即可。

  • 查询入库信息
  [java]
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
import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import org.junit.Test; public class MongoDbLogTest { @Test public void findDocumentTest() { // 连接到 mongodb 服务 MongoClient mongoClient = new MongoClient("localhost", 27017); MongoDatabase mongoDatabase = mongoClient.getDatabase("applicationDb"); MongoCollection<Document> collection = mongoDatabase.getCollection("applicationLog"); //检索所有文档 FindIterable<Document> findIterable = collection.find(); for (Document aFindIterable : findIterable) { System.out.println(aFindIterable); } } }

日志如下:

  [plaintext]
1
Document{{_id=5b529b07ebea9a99670e090b, level=ERROR, loggerName=com.github.houbb.mongdb.log.LogMain, message=error, source=Document{{className=com.github.houbb.mongdb.log.LogMain, methodName=hello, fileName=LogMain.java, lineNumber=27}}, marker=null, threadId=1, threadName=main, threadPriority=5, millis=1532140295301, date=Sat May 31 10:31:35 CST 2017, thrown=null, contextMap=Document{{}}, contextStack=[]}}

总结

实际使用中,可以使用 mongodb 做 warn 以上日志信息,或者重要的日志信息记录。

便于分析查询。

  • 2.11.0 以前的版本如何使用?

本质只是一个 Log4j2 Appender,我们可以自定义一个。

可以参考源码中的 MongoDbProvider