分三步:

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的更多相关文章

  1. 利用log4j+mongodb实现分布式系统中日志统一管理

    背景     在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...

  2. log4j+mongodb

    maven 配置: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...

  3. log4net 日志写入MongoDB 实现分布式日志

    本人在.net framework 4.5下测试成功,首先需要安装log4mongo-net组件,见https://www.nuget.org/packages/log4mongo-net/ vs20 ...

  4. 如何将Log4Net 日志保存到mongodb数据库之实践

    log4net的大名早有耳闻,一直没真正用过,这次开发APP项目准备在服务端使用log4net. 日志的数据量较大,频繁的写数据库容易影响系统整体性能,所以独立将日志写到mongodb数据库是不错的选 ...

  5. MongoDB log4j 日志整合

    在分布式系统当中,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数据库系统中,而再由日志分析系统去管理.而这个储存日志 ...

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

    背景 在分布式系统中,我们有多个web app,这些web app可能分别部署在不同的物理服务器上,并且有各自的日志输出.当生产问题来临时,很多时候都需要去各个日志文件中查找可能的异常,相当耗费人力. ...

  7. log4net 写入 mongodb+Mongodb记录日志

    项目里面需要记录大量的日志,为了方便分析,也是为了方便开发人员远程查询日志,可以把日志写入MongoDB. 1.先上Log4net配置 <?xml version="1.0" ...

  8. 升级到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 ...

  9. log4j配置目标到mongodb

    首先,具体采用什么技术作为集中式存储方案在99%的应用中应该来说并没有多大区别,最重要的是要定期清理不必要的日志,以及日志格式设计(也可以重写org.log4mongo.MongoDbPatternL ...

随机推荐

  1. node的express中使用socket.io

    服务器端server.js代码 var express=require("express"); var http=require("http"); var si ...

  2. html5的canvas方法的总结

    canvas的方法 save()保存当前环境的状态 restore() 返回之前保存过的路径状态和属性 createEvent() getContext()返回一个对象,指出访问绘图功能必要的API ...

  3. SQLServer数据库优化常用语句

    -- 平均物理读次数最多的SQL语句:select top 50 *, (s.total_physical_reads / s.execution_count) as avephysicalreads ...

  4. Java 内存机制、内存泄露

    http://wenku.baidu.com/view/61f31da6284ac850ad02423e.html 自己注:hashset和hashmap不同 JDK1.6 API 中 HashSet ...

  5. C# List对于自定义对象的比较判断

    实际开发中,我们经常会把同类型的一系列对象封装到List集合中,当我们有需要在封装对象到List集合中时,排除重复的对象,这时直接使用: if(!List.Contains(obj)) { List. ...

  6. 3.Redis 数据类型

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集 ...

  7. python算法之希尔排序

    希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔 ...

  8. go_内建变量类型

    bool, string (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr (uintptr 是指针) byte, rune(表示字符cha ...

  9. 【HDU1542】Atlantis

    题意 给出n个矩形的左下角和右上角的坐标,计算总的面积(相交部分只算一次). 分析 线段树扫描线的模板题. 将每个矩形都拆成上下两条线段,然后从下网上扫,当遇到底边时就加上这个区间,遇到顶边时,就减去 ...

  10. ArcGIS js api三种查询功能

    转自https://blog.csdn.net/lovecarpenter/article/details/52669777