logback储存在mongodb

1.在实习中遇到一个问题,就是日志太多,一般日志是保存在服务器文件里面,动不动就几g,那解决这个问题的话,可以保存到数据库里面。

2.这里不局限与mongodb,mysql。

3.如何实现?

pom.xml

         <dependency>
			<groupId>org.mongodb</groupId>
			<artifactId>mongo-java-driver</artifactId>
			<version>3.4.2</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>1.1.11</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.1.11</version>
		</dependency>

我们要去重写log原本继承的类

import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.status.ErrorStatus;
import com.mongodb.*;

import java.util.Date;
import java.util.Map;


public class MongoDBAppender extends AppenderBase<LoggingEvent> {

    private Mongo _mongo;
    private String _dbHost = "127.0.0.1";
    private int _dbPort = 27017;
    private String _dbName = "admin";

    public String get_dbCollectionName() {
        return _dbCollectionName;
    }

    public void set_dbCollectionName(String _dbCollectionName) {
        this._dbCollectionName = _dbCollectionName;
    }

    private String _dbCollectionName = "logging";
    private DBCollection _collection;

    @Override
    public void start() {
        try {
            _mongo = new Mongo(_dbHost, _dbPort);
            DB db = _mongo.getDB(_dbName);
            _collection = db.getCollection(_dbCollectionName);
        } catch (Exception e) {
            addStatus(new ErrorStatus("Failed to initialize MondoDB", this, e));
            return;
        }
        super.start();
    }

    public void setDbHost(String dbHost) {
        _dbHost = dbHost;
    }

    public void setDbName(String dbName) {
        _dbName = dbName;
    }

    public void setDbPort(int dbPort) {
        _dbPort = dbPort;
    }


    @Override
    public void stop() {
        _mongo.close();
        super.stop();
    }

    @Override
    protected void append(LoggingEvent e) {

        BasicDBObjectBuilder objectBuilder = BasicDBObjectBuilder.start().
                add("ts", new Date(e.getTimeStamp())).
                add("msg", e.getFormattedMessage()).
                add("level", e.getLevel().toString()).
                add("logger", e.getLoggerName()).
                add("thread", e.getThreadName());
        if(e.hasCallerData()) {
            StackTraceElement st = e.getCallerData()[0];
            String callerData = String.format("%s.%s:%d", st.getClassName(), st.getMethodName(), st.getLineNumber());
            objectBuilder.add("caller", callerData);
        }
        Map<String, String> mdc = e.getMdc();
        if(mdc != null && !mdc.isEmpty()) {
            objectBuilder.add("mdc", new BasicDBObject(mdc) );
        }
        _collection.insert(objectBuilder.get());
    }
}

关键是在里面append,这个是定义想存储哪些参数滴!

最后登场的是logback.xml


网上摘些东西:1、Logback的配置文件
Logback 配置文件的语法非常灵活。正因为灵活,所以无法用 DTD 或 XML schema 进行定义。尽管如此,可以这样描述配置文件的基本结构:以<configuration>开头,后面有零个或多个<appender>元素,有零个或多个<logger>元素,有最多一个<root>元素。
  2、Logback默认配置的步骤
    (1). 尝试在 classpath下查找文件logback-test.xml;
    (2). 如果文件不存在,则查找文件logback.xml;
    (3). 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。


它具体的配置:

<configuration >
<appender name="MONGODB" class="com.example.demo.MongoDBAppender">
        <DbHost>127.0.0.1</DbHost>
        <DbPort>27017</DbPort>
        <DbName>admin</DbName>


</appender>

    <logger name="MONGODB" level="INFO">
        <appender-ref ref="MONGODB"/>
    </logger>
</configuration>

具体参数意思http://aub.iteye.com/blog/1101222

如何使用这个自定义的log?

在类里面

private static final Logger mongoLog = LoggerFactory.getLogger("MONGODB");

 

github项目:https://github.com/dajitui/logback-mongodb-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值