前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转mongoDB(九):通过log4jmongo来实现分布式系统的日志统一管理

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

作者头像
壮壮熊
修改2023-01-17 14:55:35
4550
修改2023-01-17 14:55:35
举报
文章被收录于专栏:程序猿牧场程序猿牧场

背景

  在分布式系统中,我们有多个web app,这些web app可能分别部署在不同的物理服务器上,并且有各自的日志输出。当生产问题来临时,很多时候都需要去各个日志文件中查找可能的异常,相当耗费人力。日志存储多以文本文件形式存在,当有需求需要对日志进行分析挖掘时,这个处理起来也是诸多不便,而且效率低下。

  为了方便对这些日志进行统一管理和分析,我们可以将日志统一输出到指定的数据库系统中,再由日志分析系统去管理。由于这里是mongoDB的篇章,所以主观上以mongoDB来做日志数据存储;客观上,一是因为它轻便、简单,与log4j整合方便,对系统的侵入性低。二是因为它与大型的关系型数据库相比有很多优势,比如查询快速、bson存储结构利于扩展、免费等。

解决方案

代码语言:txt
复制
    整合mongoDB和log4j

1、安装mongoDB数据库,并在本地启动,默认端口是27017,详细请参考:玩转mongoDB(一):初识mongoDB。

2、新建一个maven(maven版本要求3.0以上)工程,选择maven-archetype-quickstart,工程名:log4j2mongo。

3、在pom.xml文件中,添加log4j、log4mongo-java、mongo-java-driver三个依赖。具体代码如下:

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.manyjar</groupId>
  <artifactId>log4j2mongo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>log4j2mongo</name>
  <url>http://maven.apache.org</url>
  <properties>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    <junit.version>3.8.1</junit.version>  
    <log4j.version>1.2.17</log4j.version>  
    <log4mongo.version>0.7.4</log4mongo.version>  
    <mongo-java-driver.version>2.8.0</mongo-java-driver.version>  
  </properties> 
  <dependencies>
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>${junit.version}</version>  
      <scope>test</scope>  
    </dependency>  
      <dependency>  
          <groupId>log4j</groupId>  
          <artifactId>log4j</artifactId>  
          <version>${log4j.version}</version>  
      </dependency>  
      <dependency>  
          <groupId>org.log4mongo</groupId>  
          <artifactId>log4mongo-java</artifactId>  
          <version>${log4mongo.version}</version>  
      </dependency>  
      <dependency>  
          <groupId>org.mongodb</groupId>  
          <artifactId>mongo-java-driver</artifactId>  
          <version>${mongo-java-driver.version}</version>  
      </dependency>
  </dependencies>
</project>

4、在resources文件夹中,添加log4j.properties文件。文件中主要添加log4j对mongoDB的适配器org.log4mongo.MongoDbAppender。这里的适配器是log4mongo-java这个jar包提供。mongoDB数据库的ip:127.0.0.1,port:27017,库名:logs,集合名:log。具体配置如下:

代码语言:javascript
复制
log4j.rootLogger=DEBUG,MongoDB
log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.databaseName=logs
log4j.appender.MongoDB.collectionName=log
log4j.appender.MongoDB.hostname=127.0.0.1
log4j.appender.MongoDB.port=27017
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

5、在java文件夹中,com.manyjar.log4j2mongo这个包中,添加Main.java文件,观察文件中的代码可以发现,和我们平时用log4j来写日志一模一样,把日志流到mongoDB这件事情,对业务开发的程序员完全透明。具体代码如下:

代码语言:javascript
复制
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);
            }
    }
}

6、步骤5中,我们执行了1000万次的日志插入,数据结构如下:

默认的数据量大小有10G:

代码语言:txt
复制
    这里,我们可以看到,日志的数据存储量相对不小。如果需要修改日志数据的存储结构,可以用log4mongo的源代码进行二次开发。
代码语言:txt
复制
    如果数据量过大,我们可以用TTL索引(过期自动删除)或固定集合大小两种方式来解决:
代码语言:txt
复制
    TTL索引:
代码语言:javascript
复制
db.log_events.createIndex({"timestamp": 1},
{expireAfterSeconds: 60*60*24*30}) #1个月后过期后删除
代码语言:txt
复制
    将log集合修改成固定大小集合:
代码语言:javascript
复制
db.runCommand({"convertToCapped":"log",size:10000})
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿牧场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档