日志入库

实现方式

有两种方式:

  • 自定义 appender

  • 使用官方定义好的 appender

NoSQLAppenderMongoDB3

实战

环境:

jdk: 1.8

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

jar 引入

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

<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 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
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() 即可。

  • 查询入库信息
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);
        }
    }

}

日志如下:

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