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:123456@localhost: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("这是一个错误!");
结果:

MongoDBAppender的更多相关文章
- 利用log4j+mongodb实现分布式系统中日志统一管理
背景 在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...
- log4j+mongodb
maven 配置: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...
- log4net 日志写入MongoDB 实现分布式日志
本人在.net framework 4.5下测试成功,首先需要安装log4mongo-net组件,见https://www.nuget.org/packages/log4mongo-net/ vs20 ...
- 如何将Log4Net 日志保存到mongodb数据库之实践
log4net的大名早有耳闻,一直没真正用过,这次开发APP项目准备在服务端使用log4net. 日志的数据量较大,频繁的写数据库容易影响系统整体性能,所以独立将日志写到mongodb数据库是不错的选 ...
- MongoDB log4j 日志整合
在分布式系统当中,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数据库系统中,而再由日志分析系统去管理.而这个储存日志 ...
- 玩转mongodb(九):通过log4jmongo来实现分布式系统的日志统一管理
背景 在分布式系统中,我们有多个web app,这些web app可能分别部署在不同的物理服务器上,并且有各自的日志输出.当生产问题来临时,很多时候都需要去各个日志文件中查找可能的异常,相当耗费人力. ...
- log4net 写入 mongodb+Mongodb记录日志
项目里面需要记录大量的日志,为了方便分析,也是为了方便开发人员远程查询日志,可以把日志写入MongoDB. 1.先上Log4net配置 <?xml version="1.0" ...
- 升级到0.9 log4jmongodb(mongo-java-driver 3.x)后,报No server chosen by WritableServerSelector from cluster description ClusterDescription
接上一篇http://www.cnblogs.com/zhjh256/p/6690003.html. 17-04-11 13:47:54.676 INFO cluster-ClusterId{valu ...
- log4j配置目标到mongodb
首先,具体采用什么技术作为集中式存储方案在99%的应用中应该来说并没有多大区别,最重要的是要定期清理不必要的日志,以及日志格式设计(也可以重写org.log4mongo.MongoDbPatternL ...
随机推荐
- Java复习——反射和泛型的复习
反射 Class类 一个类被类加载器加载到内存之中,占有一片区域,这个空间里的内容就是类的字节码,不同的类的字节码是不一样的,这一个个空间页可以使用类来表示,这就是Class类. 根据这个概念可知:不 ...
- Oracle中的dbms_metadata.get_ddl的用法
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- 初识python(python的安装与运行)
python--“优雅”.“明确”.“简单”的哲学定位 一.python的安装(Windows环境下) 1.在python官网下载安装文件 python的官方网址:https://www.python ...
- Python Twisted系列教程18:Deferreds 全貌
作者:dave@http://krondo.com/deferreds-en-masse/ 译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted 入 ...
- WTL教程
很不错的教程 http://www.yakergong.net/wtl/
- Drools笔记:初识与入门
Drools是什么? Drools是一个用Java编写的开源规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境 ...
- centos 和KVM安装
- linux下mysql的源码安装
mysql有多中安装方法,本文只涉及编译安装,对其他方法感兴趣的可以自行百度. 1.首先获取mysql软件安装包,这里用wget下载 [root@localhost ~]# wget http://d ...
- go unit test-monkey
package main import ( "fmt" "github.com/bouk/monkey" "os" "os/exe ...
- SaltStack 的通讯及安全机制
SaltStack 的通讯架构模型: Salt 采用服务端-代理的通讯模型(也可以通过 SSH 方式实现非代理模式).服务端称为 Salt master,代理端称为 Salt minion. Salt ...