玩转mongodb(九):通过log4jmongo来实现分布式系统的日志统一管理
2017-05-07 22:16
671 查看
背景
在分布式系统中,我们有多个web app,这些web app可能分别部署在不同的物理服务器上,并且有各自的日志输出。当生产问题来临时,很多时候都需要去各个日志文件中查找可能的异常,相当耗费人力。日志存储多以文本文件形式存在,当有需求需要对日志进行分析挖掘时,这个处理起来也是诸多不便,而且效率低下。为了方便对这些日志进行统一管理和分析,我们可以将日志统一输出到指定的数据库系统中,再由日志分析系统去管理。由于这里是mongodb的篇章,所以主观上以mongodb来做日志数据存储;客观上,一是因为它轻便、简单,与log4j整合方便,对系统的侵入性低。二是因为它与大型的关系型数据库相比有很多优势,比如查询快速、bson存储结构利于扩展、免费等。
解决方案
整合mongodb和log4j1、安装mongodb数据库,并在本地启动,默认端口是27017,详细请参考:玩转mongodb(一):初识mongodb
2、新建一个maven(maven版本要求3.0以上)工程,选择maven-archetype-quickstart,工程名:log4j2mongo
3、在pom.xml文件中,添加log4j、log4mongo-java、mongo-java-driver三个依赖。具体代码如下:
package com.manyjar.log4j2mongo; import org.apache.log4j.Logger; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; public class Main { public static void main(String[] args) { Logger logger = Logger.getLogger(Main.class); for (int i = 0; i < 10000000; i++) { DBObject bson = new BasicDBObject(); bson.put("name", "ryan"+i); logger.debug(bson); } } }
Main.java
6、步骤5中,我们执行了1000万次的日志插入,数据结构如下:
默认的数据量大小有10G:
这里,我们可以看到,日志的数据存储量相对不小。如果需要修改日志数据的存储结构,可以用log4mongo的源代码进行二次开发。
如果数据量过大,我们可以用TTL索引(过期自动删除)或固定集合大小两种方式来解决:
TTL索引:db.log_events.createIndex({
"timestamp"
: 1},{expireAfterSeconds: 60*60*24*30}) #1个月后过期后删除
将log集合修改成固定大小集合:db.runCommand({"convertToCapped":"log",size:10000})。
喜欢请微信扫描下面二维码,关注我公众号--“精修Java”,做一些实战项目中的问题和解决方案分享。
相关文章推荐
- 利用log4j+mongodb实现分布式系统中日志统一管理
- 利用log4j+mongodb实现分布式系统中日志统一管理
- 利用log4j+mongodb实现分布式系统中日志统一管理
- Zookeeper:通过yarn实现大型分布式管理系统
- [置顶] ELK日志分析系统通过shield实现权限管理
- 改造apache的开源日志项目来实现 分布式日志收集系统
- VC下通过系统快照实现进程管理
- 2014.06.12 枚举类 实现 系统角色的统一管理
- 使用perl+MongoDB实现一个WEB站点请求耗时日志分析系统
- 分布式系统用户统一认证浅析(一)--认证中心被动认证实现
- Struts2拦截器实现日志管理系统 (同理实现权限,模块点击计数器等)
- 使用perl+MongoDB实现一个WEB站点请求耗时日志分析系统
- asp.net通过基类实现统一脚本和样式的管理
- 用一个系统去控制管理多个现有系统, 实现核心集中的统一管理控制系统
- 通用权限管理系统组件 中实现统一身份认证(Single Sign On,单点登录)附源码
- C/S架构分布式系统客户端操作日志监控模块实现思路
- 用一个系统去控制管理多个现有系统, 实现核心集中的统一管理控制系统
- 使用Node.js + MongoDB实现一个简单的日志分析系统
- 转:统一用户身份管理系统的研究与实现
- Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录