概述:
在分布式系统中,经常需要采集各个节点的日志,然后统一分析。
本文提供一种简单的方案,本文采用开源日志项目 + 统一数据库结构的方式,在各个开发环境中,提供统一的配置及调用方法,所有的日志均记录在日志服务器中,可以追踪查询任意一个系统节点上任意应用的任意线程的运行状况。
考究现在比较流行的apache的开源日志项目log4j以及它在其他平台的衍生产物(log4net log4py等)。其由appender模块向不同目标输出日志。
比如log4j 中使用jdbcAppender可以基本实现插入数据库的功能。log4j可以提供如下数据:
日志信息,
日志级别,
时间,
线程名,
文件路径,
类路径,
行号,
方法名
这些数据在单个客户端模块已经可以很好的定位日志发生的各种需要信息。但是对于我们的分布式日志收集,还缺少 机器的定位。以及应用、线程的定位。
比如在同一个机器上跑着两个相同的应用,在同处同时往日志系统中记录,我们在现有的lo4j基础上是区分不出来的。
可能有人说,用log4j的NDC——NDC也不行,其的标识是字符串,而且用NDC的话会加大应用使用的复杂度。
那么我们如何定位 机器、应用、线程 呢?对应三者我们可以调用系统函数获得 hostname、processId(进程号)、threadId(线程号)
而在log4j中这三者是无法通过配置获取到的,如何解决呢?
1。 然后很简单的想法,我们可以封装其logger的 debug、info、warn等接口来实现。——这有个很操蛋的地方,在你封装了之后,log4j记录日志时拿到的location information(日志发起的时间、线程等)就变成咱们自己封装的位置了,所以行不通。
2。接下来我们自然的想到改写appender,比如我们改写jdbcAppender的写拼SQL语句的方法,将我们需要的三个变量给加进去。但是会发现这个问题:log4j写日志是由一个任务队列线程来控制的,在这个队列的位置获取hostname和processId可能是正确的,但是获取线程ID肯定是错误的。。所以也行不通。
3。所以很无奈,我们只能修改log4j的源代码。我们会发现logger类所有的记录日志方法,在通过许可校验后,都会调用一个forceLog的函数(貌似叫这个名),里头new了一个LogingEvent的对象,我们修改该构造函数,在此处将PID及线程ID传进去,然后继承jdbcAppender,重写拼SQL语句的函数,搞定。
同理,在log4net中也按照如此修改即可(架构基本相似)。
这样我们就获得了自己的日志jar包和dll,引用之后,可以按照原来的配置方法,以及完全兼容log4j 和log4net的方法记录日志。同时提供我们自己私有的appender,可以作为我们分布式日志收集系统的调用入口。
扩充话题:
1。 关于日志库规模太大了检索效率十分低下怎么处理?
方案1, 可以使用lucene,从日志库中提取信息,专用于检索。
方案2, 定期清理、备份数据库。
2。 此方案适用的情景
此方案适用于中等规模(如1000个并发应用以下节点),并且节点间具有稳定、快速的通信信道(如局域网),对实时性要求、记录完整型要求不是十分苛刻的系统。
3。 为何不用socket相关的appender
经了解,log4j及其各个衍生品居然在tcp应用层协议上不统一,遂不用。
4。 版权许可?
apache许可,适合商用,如果发布你修改的代码,需要做如下事情:
1。发布时需要给用户一份apache许可。
2。需要在原代码文件里注明你修改了哪。
3。发布需要带有原工程的协议、商标、专利声明以及其中一切要求衍生软件/类库声明的内容。
4。发布需要包含一个Notice文件,里面包含Apache许可证及你自己要求声明的内容。(该内容不可与apache协议本身冲突)
相关代码及演示:
log4j 配置
log4j.rootLogger=DEBUG, DATABASE
log4j.appender.DATABASE=com.netvideo.log.NvJdbcAppender
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.URL=jdbc:mysql://192.168.25.156:3306/test?useUnicode=true&characterEncoding=utf-8
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=XXX
log4j.appender.DATABASE.password=XXXX
log4j.appender.DATABASE.tableName=log
log4j.appender.DATABASE.consolePrint=true
使用方法(和log4j完全一致):
Logger logger = Logger.getLogger(Test.class);
logger.info("info called");
NvJdbcAppender源码
(有个小插曲,jdbcAppender是有漏洞的。。message里头无法带单引号,不然会造成SQL拼写错误,我在此处修正了这个问题)
log4net配置:
使用方法:
log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger.Debug("test");
NetVideoAppender代码:
分享到:
相关推荐
资源名称:分布式计算开源框架Hadoop入门实践内容简介: Hadoop是Apache开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用,如亚马逊、 Facebook和Yahoo等等。对于我来说,最近的一个使用点就是...
前言:Hadoop是Apache开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用,如亚马逊、Facebook和Yahoo等等。对于我来说,最近的一个使用点就是服务集成平台的日志分析。服务集成平台的日志量将会...
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...
Kafka的基本介绍 ...基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Elasticsearch是一个开源的分布式搜索和分析引擎,构建在Apache Lucene之上。它提供了一套强大的API和工具,可以实现分布式全文搜索、结构化和非结构化数据分析、日志存储和实时数据可视化等功能。 以下是一些...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
xrkmonitor字符云监控系统是一个国产开源监控系统,专注于通过监控系统对软硬件系统进行掌控以及系统相关数据的可视化,通过插件化进制完成对通用项目监控的复用,支持多种开发语言开发接口以便能为各类语言开发者...
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的...
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的...
基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。 主要应用场景是:日志收集系统和消息...
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica...web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。