MongoDBAppender

分三步:

1. client

2. appender

3. 配置文件

logback-test.xml

<configuration>

    <appender name="MONGO" class="cn.zno.mongodb.MongoDBAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <mongoClient class="cn.zno.mongodb.CustomMongoClient">
            <uri><![CDATA[mongodb://xiaoming:[email protected]:27017/?authSource=logtest&authMechanism=MONGODB-CR]]></uri>
            <dbName>logtest</dbName>
            <collectionName>news</collectionName>
        </mongoClient>
    </appender>

    <root level="INFO">
        <appender-ref ref="MONGO" />
    </root>

</configuration>

MongoDBAppender.java

package cn.zno.mongodb;

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;

import org.bson.Document;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;

public class MongoDBAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {

    public static final String UNKNOW_HOST = "unknow host";

    private CustomMongoClient mongoClient;

    @Override
    protected void append(ILoggingEvent eventObject) {
        if (mongoClient.getCollection() == null) {
            mongoClient.init();
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                public void run() {
                    mongoClient.destroy();
                }
            }, "mongo shutdown"));
        }

        Document document = new Document();
        document.append("message", eventObject.getFormattedMessage());
        document.append("logger", eventObject.getLoggerName());
        document.append("thread", eventObject.getThreadName());
        document.append("timestamp", new Date(eventObject.getTimeStamp()));
        document.append("level", eventObject.getLevel().toString());
        document.append("pid", getPid());
        document.append("ip", getIp());

        mongoClient.getCollection().insertOne(document);
    }

    private String getIp() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return UNKNOW_HOST;
        }
    }

    private String getPid() {
        return ManagementFactory.getRuntimeMXBean().getName();
    }

    public CustomMongoClient getMongoClient() {
        return mongoClient;
    }

    public void setMongoClient(CustomMongoClient mongoClient) {
        this.mongoClient = mongoClient;
    }
}

CustomMongoClient.java

package cn.zno.mongodb;

import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;

public class CustomMongoClient {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    private MongoClient mongoClient;
    private MongoCollection<Document> mongoCollection;

    private String uri;
    private String dbName;
    private String collectionName;

    public void init() {
        MongoClientURI mongoClientURI = new MongoClientURI(uri);
        mongoClient = new MongoClient(mongoClientURI);
        mongoCollection = mongoClient.getDatabase(dbName).getCollection(collectionName);
        logger.info("MongoClient init");
    }

    public void destroy() {
        mongoClient.close();
        logger.info("MongoClient closed");
    }

    public MongoCollection<Document> getCollection() {
        return this.mongoCollection;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public String getDbName() {
        return dbName;
    }

    public void setDbName(String dbName) {
        this.dbName = dbName;
    }

    public String getCollectionName() {
        return collectionName;
    }

    public void setCollectionName(String collectionName) {
        this.collectionName = collectionName;
    }
}

如何使用:

logger.error("这是一个错误!");

结果:

时间: 2024-10-14 07:18:22

MongoDBAppender的相关文章

玩转mongodb(九):通过log4jmongo来实现分布式系统的日志统一管理

背景 在分布式系统中,我们有多个web app,这些web app可能分别部署在不同的物理服务器上,并且有各自的日志输出.当生产问题来临时,很多时候都需要去各个日志文件中查找可能的异常,相当耗费人力.日志存储多以文本文件形式存在,当有需求需要对日志进行分析挖掘时,这个处理起来也是诸多不便,而且效率低下. 为了方便对这些日志进行统一管理和分析,我们可以将日志统一输出到指定的数据库系统中,再由日志分析系统去管理.由于这里是mongodb的篇章,所以主观上以mongodb来做日志数据存储:客观上,一是

将Log4Net 日志保存到mongodb数据库实践

log4net的大名早有耳闻,一直没真正用过,这次开发APP项目准备在服务端使用log4net. 日志的数据量较大,频繁的写数据库容易影响系统整体性能,所以独立将日志写到mongodb数据库是不错的选择.---经过2天的摸索,总结出本文档. github有个开源项目log4mongo-net,另一位斯克迪亚作者根据开源项目又做了修改http://skyd.sinaapp.com/archives/1282. 所以直接拿斯克迪亚的代码来使用. 1.将log4net和mongodb驱动升级为最新版本

windows下日志存储到mongodb下

需求:系统做分布式,各个模块的日志写文件,对于运维来说找起日志来不方便,统一写到mongodb中,error级别的日志单独存储. 我的环境是win7 64位系统 第一步: 下载mongdb,下载地址: https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl  ,我下载的是:win32/mongodb-win32-x86_64-2008plus-ssl-v3.0-latest.zip,下载后解压到d盘根目录下,路径为:D:\mongodb 启动,进

日志项目 【精】

web-logback 项目地址见git │ pom.xml │ └─src ├─main │ ├─java │ │ └─cn │ │ └─zno │ │ │ HelloWorld.java │ │ │ HelloWorldImpl.java │ │ │ │ │ ├─mongodb │ │ │ CustomMongoClient.java │ │ │ MongoDBAppender.java │ │ │ │ │ └─pojo │ │ In.java │ │ Out.java │ │ │ ├─re