(二)。使用日志监测应用程序状况。

日志有两种:产生报表和用于诊断。Brian W. Kernighan和 Rob Pike 在“编程实践”(The Practice of Programming") 一书中从认知体验的角度谈到日志对程序调试的重要性:

作为个人偏好,我们倾向于只使用调试器获得一个或两个变量的值或者堆栈轨迹。 其中一个原因是,程序员很容易迷失在复杂的数据结构的详细信息和流量控制中,我们发现,在调试中一步步跟踪程序运行的步骤的效率很低,不如花力气思考问题,并增加输出语句和增加在关键代码处的自我检查。调试器上步步点击花费的时间比扫描有条理的输出耗时的多。决定把print语句放在哪里很容易,而推断出代码的关键部分在哪里不是那么简单,即使假设我们知道应该在哪里寻找,调试会话也是暂时性的”。 这段话很形象描述出日志在程序开发和调试中的作用。我们下面主要讨论在程序正常运行中如何使用日志来监测应用程序的状况。

服务器日志包括Web服务器日志(ErrorAccess日志),邮件服务器日志(SMTP队列,连接状况),FTP服务器日志(用户登录,执行的命令记录,上传和下载的文件) 和数据库服务器日志(用户活动,执行的查询等)。

做为网络和系统活动的主要记录者, 日志和日志管理的作用包括:

  • 系统健康状态的监测,诊断。

  • 用户活动监测和管理

  • 系统安全性管理,防止非法入侵和攻击

  • 相关法律法规的要求,保存交易相关的资料

一个良好的日志应该具备如下几个特征

  • 不同机器记录的事件的同步时间戳。

  • 适当的日志记录级别,记录详细的事件以备诊断。

  • 保存足够的归档日志信息。

其他还有日志轮值以避免硬盘大小限制,日志保护以防止骇客篡改等等。

 日志记录级别有7类:紧急,警报,危险,错误,警告,通知,信息和调试。在最终运行产品时,日志记录级别的设置是必须考虑 的一个重要的参数。日志级别设置太低,不仅影响程序本身的效率,大量的日志记录也占用大量的磁盘空间,在远程日志记录下占用带宽;而如果日志级别设置太高,不能提供诊断所需要的足够信息。

 

错误或警告的日志记录级别在正常情况下运行产品时就够了。在需要日志记载更多的信息时需要提高日志记录级别,比如记载提供API服务的SLA指标。常用的方法是用统一的格式记录API调用时的时间戳和调用参数值,和API调用完成的时间;籍此可以得出 事务平均响应时间( Average Transaciton Response Time每秒通过事务数/TPS ( Transactions per Second每秒通过事务总数Total Transactions per Second事务响应时间与负载(Transaction Response Time Under Load)等多方面的性能指标。系统可以在收集的服务程序性能指标的基础上建立不同目的的报警(Alert)系统。

 

市场上有许多Web日志分析软件(web log analyzer ),比如Splunk,从Web服务器上分析服务器日志文件,并在日志文件中包含的值的基础上,报告Web的访问情况(Who, WhenHow)。 这里谈论的不仅仅是Web的日子,还包括SOA框架中任何服务API的调用。

在系统构架中充分考虑日志处理对监控,审计和出错诊断极为重要,日志系统的基本架构却也往往是大型系统中被忽略的部分。日志管理包括3个方面: 如何防止日志记录无限增大(轮值),如果整合来自不同服务器,不同类型的日志,获得有意义的信息(中心化管理),如果保护日志不受非授权的篡改(安全性)。而大型分布式系统的日志管理有两大挑战: 1)在业务活跃期同时产生的大量日志数据,需要占用大量的系统资源,和2)不同机器记录的日志事件的时间同步戳问题。 如何构架高效和高性能的日志系统?有些大型网站开发和整合了自己的日志系统已满足内部需要。当然市场上也有很多比较成熟的日志管理系统。

 

集中日志(Centralized Logging

日志在一般情况下存储在当地硬盘上。当系统包括多个主机时,管理和使用不同主机上的日志变得繁琐和困难。当系统出错时,在分布在数百个不同机器上的数百个日志中寻找特定错误记录,将是件令人生畏的任务。常见的解决方案是,在系统构建时设计集中日志方案,将不同机器上的日志集中到同一个地方处理。

 

集中日志的好处包括 1)便于开发人员诊断出错 2)客户支持小组查询客户的交易记录 3)执法,安全机构的取证 4)业务分析(BI)。 从技术支持角度考虑, 集中日志也利于日志循环和备份。

 

如果当前系统已经安装了Syslog(常用的是rsyslog,syslog-ng),可以使用集中模式。用户端的日志守护程序将日志通过TCP (port 10514) 或 UDP (port 514) 传送到syslog的中心守护程序。每个远程的syslog 数据包的报头包括日志记录的时间戳, 服务器名,日志重要性水平,和日志记录内容。

 

如果使用Log4J作为应用程序的日志机制,Log4J的“SyslogAppender”支持UDP对远程服务器的日志传送。

log4j.rootLogger=INFO, SYSLOG
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
log4j.appender.SYSLOG.Header=true
log4j.appender.SYSLOG.Facility=LOCAL1

 

Log4J的配置文件中加入了Syslog的报头,包括服务器名和时间戳,用于syslog的中心守护程序将远程日志分类。Syslog的过滤功能支持正则表达式,如果

只需要某服务器的出错记录, 可以:

if $hostname startswith ‘web’ and $syslogseverity <= 5 then /var/log/web_errors.log
& ~ #
到下一行

 

使用Syslog作为中心日志系统,存在SPOF。 在高通量,高可用性的系统中越来越多的使用分布式日志收集(Distributed Log Collector)。这些系统往往使用通用的事件/消息管理系统, 而分布式日志收集只是一个应用。基本构架包括在每个特定主机上的日志客户端代理程序,代理程序将日志发送到收集者集群,然后由收集者将日志转发到可扩展性的存储层。 这样,收集者集群和存储层都具有横向可扩展性,保证了整个日志系统的高通量和扩展性。

常见的系统包括FacebookScribeApacheFlume, LinkedInKafka等。Splunk是商业版。

 

模式名称: 建立有效的日志管理系统

描述: 在系统构架的整个过程和系统的层次上考虑合理使用日志。

动机/试图解决问题: 大型分布式系统产生大量的日志数据,如何管理这些数据,产生各种报告,如何做到各个日志来源的时间戳同步?日志系统的基本架构却也往往是大型系统中被忽略的部分。

原理: 日志记录了系统活动的过程。 在系统构架中充分考虑日志处理对监控,审计和出错诊断极为重要。

使用

 

模式名称: 自动收集各项系统性能指数

描述: 自动收集各项系统性能指数, 提供报告和监控基础。

动机/试图解决问题: 复杂系统牵涉很多子系统的相互作用,运行成本需要和经济效益挂钩。

原理: 自动收集各项系统性能指数, 帮助了解系统运行情况,提供商业决策的支持依据。

使用

 

模式名称: 安装自动报警系统

描述: 在系统各个层次安装自动报警,及时发现出错,减少对终端用户的影响

动机/试图解决问题:复杂系统可能出错环节很多, 一个环节的错误有可能扩散到整个系统,引起灾难性后果。

原理: 自动收集到的各项系统性能指数基础上设立报警阈值, 尽早发现纠正错误。

相关模式:自动收集各项系统性能指数

模式名称: Layer-7 健康监测

描述: 负载平衡器通过Layer-7 健康监测来决定分流请求

动机/试图解决问题: 负载平衡器无论使用Ping还是TCP connection 都无法判断 应用程序是否正常工作 。

原理: Layer-7 健康监测程序自身的健康状态,比如数据库连接是否正常。

使用: 负载平衡

相关模式: 所有服务实现心跳(Heart-beat)API

 

模式名称: 所有服务实现心跳(Heart-beat)API

描述: 各个服务实现相同的接口,表达自身的健康状况。

动机/试图解决问题: 如果Web服务器运行良好,程序也在运行中,但是程序内部处于非正常工作状况,需要拒绝接受服务请求,自动被重启。

原理: 各个服务程序实现相同的API接口, API调用时,程序检测自身的健康状态。 系统也可以通过周期性的检测服务心跳而发现非正常工作程序,实现自动重启。

使用: SOA

相关模式: Layer-7 健康监测

 

附录:

Syslog

Syslog常被称作系统日志,是一种在TCP/IP的网络中传递记录日志的标准,使产生日志的软件和存储,分析日志的系统分离。Syslog属于主从式协定: Syslog的客户端使用UDP/TCP的协议传送 小于 1024的文字信息到Syslog服务器。因为获得各种设备(打印机,路由器)和平台的广泛支持, Syslog 可被用来整合不同类型系统来源的日志记录。

 

Syslog的另二层含义是指日志记录本身或者管理日志的系统。做为一个功能比较全面的日志管理系统,Syslog用来记录管理Kernel和系统辅助程序产生的消息,消息可以按照来源和重要性分类,传送到日志文件,用户终端或者远程机器。

Syslogd 是管理日志的守护进程,/etc/syslog.conf Linux上的配置文件。

 

日志文件分析软件

在使用日志进行出错诊断时 grep/awk 是非常便捷的工具。常用的分析软件包括监测非法入侵的ACID Analysis Console for Intrusion Detection), guard 和一般用途的Lire ,log_analysis , LogSentry (Logcheck), SAWMILL等。log_merge可以按照统一的时间线索合并不同来源的日志。

 

MRTG/RRDTool

MRTGMulti Router Traffic Grapher) 是一套用来绘制网络流量图的软件,用Perl写成,因此可以跨平台使用。最初的MRTG只能绘出网路设备的流量图,后来开发出各种plug-in, 以绘制服务器的硬盘使用量,CPU负载等。

 RRDToolMRTG原作者开发的功能更强大的绘图引擎,很多工具例如MRTG都可以调用rrdtool绘图。

RRD是指一种环状数据库(Round Robin Database ) ,适合存储时间序列的数据,而且数据集不会增大,不需要维护 。RRDtool使用RRD创建数据库、存储数据、提取数据、生成用于在Web浏览器中显示的PNG格式的图像 。

常用的网络监测系统Cacti 和 Munnin 都使用 RRDTool做绘图引擎。

 

Gnuplot

如果需要构建自己的监控报警系统,Gnuplot提供了更加强大的绘图引擎。Gnuplot是最受欢迎的跨平台的开源绘图软件,可以产生png, svg, ps, hpgl等各种图形格式输出。 如果使用REGEXP将任何有规律的文字标志转换成Gnuplot接受的简单格式,可以满足绝大部分文档的绘图需要。一些大型网站内部就使用Gnuplot提供基于日志记录的各种图表。

 

plot 命令的格式:

Syntax:

plot {[ranges]}

{[function] | {"[datafile]"

{datafile-modifiers}}}

{axes [axes] } { [title-spec] } {with [style] }

{, {definitions,} [function] ...}

使用“data.txt” 数据文件第一列表示 坐标,第二列表示 坐标, 用点画图

gnuplot> plot "data.txt" using 1:2 with points

用一些外部命令处理后的数据,再用plot画图

gnuplot> plot "&lt; awk '{print $1,$2+$3,$2}' &lt; a.txt" using 1:2