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");