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 ...
随机推荐
- 浅谈PHP面向对象编程(一、简介)
传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...
- javaweb地图定位demo
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- SET STATISTICS IO
SET STATISTICS IO (Transact-SQL) https://technet.microsoft.com/zh-cn/library/ms184361(SQL.90).aspx 如 ...
- Array 数组类
除了 Object 之外, Array 类型恐怕是 ECMAScript 中最常用的类型了.而且,ECMAScript 中的数组与其他多数语言中的数组有着相当大的区别.虽然 ECMAScript 数组 ...
- Node.js的适用场景
高并发.聊天.实时消息推送.服务器做前端资源压缩
- Ceph的工作原理及流程
本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...
- 1.docker学习之简介
什么是Docker Docker是一个开源的应用容器引擎.通俗来说:所谓开源,就是指Docker是开放源代码的,比如用户可以免费使用该源代码, 并在该源代码的基础上自由修改或传播.所谓引擎,指的是程序 ...
- Java EE学习路线
题记: 不行动,注定是个失败者! 1.coding:servlet->jsp 通过看视频快速上手 2.reading:Thinking in java 英文版 时间协调安排: 1.上课时认真听课 ...
- 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)
一 : 正则解析 : 常用正则回顾: 单字符: . : 除换行符以外的所有字符 [] : [aoe] [a-w] 匹配集合中任意一个字符 \d : 数字 [0-9] \D : 非数字 \w : 非数字 ...
- 用ZedGraph控件作图圆
转自原文 用ZedGraph控件作图圆 用ZedGraph控件绘制圆各位: 我想利用第三方控ZedGraph在WinForm窗体中绘制图形如,圆,填充圆,只是简单的圆图形,但一直没有找到相应的方 ...