在分布式系统中,有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出。为了方便对这些应用日志进行统一的管理和分析。我们可以将日志统一输出到指定的数据库系统中,而再由日志分析系统去管理。
存储日志的数据库目前考虑使用mongodb,因为它轻便、简单且与log4j整合方便,对系统的侵入性低;再者它与大型的关系型数据库相比有不少优势,比如快速查询、存储结构利于扩展、免费等等。
为解决分布式系统日志统一管理问题,对log4j和Mongodb整合问题展开一系列研究,具体相关内容在文档后面章节将进行详细介绍。
Mongodb是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库与非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
在Mongodb中基本的概念是文档、集合、数据库。其和RDBMS对应术语解析如下:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据库记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins |
| 表连接,MongoDB不支持 |
primary key | primary key | 主键。MongoDB自动将_id字段设置为主键 |
根据你系统下载32位或64位的.msi文件,下面将以使用mongodb-win32-
x86_64-enterprise-windows-64-3.4.7-signed.msi文件在windows系统环境下进行安装为例来介绍具体步骤。
双击mongodb-win32-x86_64-enterprise-windows-64-3.4.7-signed.msi文件,按操作提示安装即可,安装过程中可以通过点击“Custom(自定义)”按钮来设置你的安装目录。
创建MongoDB数据目录,eg:C:\data\db(注意:此目录不会在MongoDB安装时不会自动创建,需要我们自己创建,可通过dos或在资源管理器中创建)。
打开cmd窗口进入到C:\ProgramFiles\MongoDB\Server\3.4\bin目录下,运
MongoDB数据库目录设置命令:mongod--dbpath=C:\data\db;
数据库目录设置成功后,C:\data\db目录下将会生成如下文件:
运行“mongod --dbpath C:\data\db”指令启动MongoDB,指令窗口输出如下信
息表示启动成功。
打开另一个cmd窗口,进入mongodb的bin目录,运行mongo.exe指令,dos窗
口输出如下信息即连接mongodb成功。
连接成功后可以简单测试下:
由于它是一个JavaScript shell,可以运行一些简单的算术运算:
db命令用于查看当前操作的文档(数据库):
> db
test
>
插入一些简单记录然后查询:
> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" :ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 }
>
将上述三个jar包导入到需要和MongoDB整合的项目中,如果项目中已经导入的jar包则不需要重复导入。其中log4j需要在1.2.16以上版本。
#log4j与mongodb整合
log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
#MongoDB日志数据库名,数据库可自动创建
log4j.appender.MongoDB.databaseName=test
#MongoDB日志信息表名,数据表可自动创建。建议不同应用日志使用不同的日志表
log4j.appender.MongoDB.collectionName=log1
#MongoDB服务IP
log4j.appender.MongoDB.hostname=192.168.0.113
#MongoDB服务端口号
log4j.appender.MongoDB.port=27017
#MonogoDB数据库用户名 ##此处用户名和密码可不配置
#log4j.appender.MongoDB.username=admin
#MonogoDB数据库用户密码
#log4j.appender.MongoDB.password=123456
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} %.5p [%t] %l %n
#输出格式
log4j.logger.action=info,action_log
log4j.additivity.action=false
log4j.appender.action.Threshold=info
log4j.appender.action=org.apache.log4j.DailyRollingFileAppender
log4j.appender.action.encoding=utf-8
log4j.appender.action.File=/opt/logs/action.log
log4j.appender.action.DatePattern ='_'yyyy-MM-dd'.log'
log4j.appender.action.layout=org.apache.log4j.PatternLayout
log4j.appender.action.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %.5p [%t] %l %n
使用dos指令,进入Mongodb的bin目录,如下示:
运行指令mongod dbpath “c:\data\db”启动mongodb。(注:c:\data\db为mongodb数据库文件目录)。
如果启动成功dos窗口将输出如下示内容:
本次以Platform为例说明。将Platform分别部署在两个tomcat服务器上,并启动,待两个应用启动成功后,分别跑下两个应用的接口测试(eg:app用户注册接口)。
进入mongodb的bin目录,执行mongo.exe指令连接mongodb,查询test数据库中各日志信息表列表:
可以看到test数据库中有四个数据表,其中应用日志信息表为log和log1。查看log日志信息:
查看log1日志表信息:
查询结果表明,已经成功将两个web服务的应用日志写入mongodb中同一数据库不同的日志信息表中。
MongoDB安装完成后,默认是不需要输入用户名密码即可登录的,但是出于对数据库安全问题的考虑而需要设置用户名密码。
关于用户权限设置主要需要了解下面几点:
1)、MongoDB是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
admin数据库创建用户的dos版运行指令:
db.createUser({
user:”admin”, //用户名
pwd:”123456”, //用户密码
roles:[{
role:”userAdminAnyDatabase”, //用户角色
db:”admin”}] //数据库名
})
2)、切换到admin数据库,添加的账号才是管理员账号。
3)、用户只能在用户所在数据库登录,包括管理员账号。
4)、管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
在创建MongoDB用户过程中涉及到给用户授权问题,以下是查资料搜集到mongodb中关于角色和权限的相关说明。
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase;
超级用户角色:root
内部角色:_system
此外,dbOwner 、userAdmin、userAdminAnyDatabase这几个角色提供了系统超级用户的访问。
read:允许用户读取指定数据库;
readWrite:允许用户读写指定数据库;
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除、查看统计
或访问system.profile;
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和
管理用户;
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的
管理权限;
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限;
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权
限;
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的
userAdmin权限;
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin
权限;
root:只在admin数据库中可用。超级账号,超级权限。