目前,为了方便地管理和配置嵌入式设备,很多嵌入式设备都提供了 Web 的接入访问模式。Apache服务器是目前各种的 Web 服务器中最被广泛使用的。为了有效地管理 Web 服务器,掌握和反馈服务器的活动、性能以及出现的问题,通常我们都会开启 Web 服务器的日志文件(访问日志和错误日志)以方便后续的查询和统计。虽然目前的嵌入式设备较之以往在性能和存储容量上都有很大的提高,但是相比硬盘来说,嵌入式设备中的 flash 存储容量还是很小的。即使是一个并不繁忙的服务器,当长时间的运行以后,日志文件就会变得越来越大。如果不进行处理,那么日志文件就会影响 Web 服务器运行效率、速率,还可能耗尽嵌入式设备本来就小的存储空间,导致系统变慢甚至无法正常运行,因此就有必要定期回滚日志文件。如何定制日志处理程序来管理日志就是本文讨论的重点。
回页首
Apache 的日志模式Apache 服务器有两种开启日志的方式:普通模式和管道模式。
1) 普通日志使用模式Apache 服务器在默认的情况下会自动打开2个日志文件:访问日志文件和错误日志文件。我们通过在配置文件 httpd.conf 中分别对 CustomLog 访问指令使用命令 “CustomLog /usr/local/apache/logs/access_log common“和对 ErrorLog 错误指令使用命令 “ErrorLog /usr/local/apache/logs/error_log common”来指示。其中错误日志文件,更为重要。Apache 服务器会将运行中的诊断信息和处理请求中出现的错误存放到该文件中,以供将来的错误诊断和解决。通过这种方式产生的默认日志文件是不分割的,并随着时间越变越大。这样一个大文件既不易于管理,也不易于后期的分析与统计。因此就有必要定期回滚日志文件。
2) 管道模式最新的 Apache 服务器版本提供了一种新的日志处理方式,即服务器不是直接将日志写入一个文件中,而是通过管道将访问记录和出错信息传递给另一个通常被称为日志回滚的进程,由其根据用户的设定进行分割(回滚)。其实现的原理图如下:
图 1. 管道机制原理图该模式无须对主服务器进行编程,同时又允许在不重新启动服务器的状态下可以进行日志回滚,这个功能显著地增强了日志的灵活性。
管道模式的使用是比较简单的,只需要在配置文件的 ‘CustomLog’ 或 ‘ErrorLog’ 指令中以管道操作符 "|" 开始,并在其后给出一个回滚工具文件路径,就可以使这个程序从标准输入设备获得日志记录。Apache 提供了一种可靠的管道日志技术,在其启动时,会同时启动这个管道日志进程,并且在运行过程中,如果该回滚进程崩溃的话,会重新启动此进程。
回页首
当前流行的日志回滚工具下面将介绍当前最流行的三种日志文件回滚工具,简单描述其使用方法,分析各自的优势、劣势及其适用的场景。
1) logrotate 工具logrotate 工具是一个 Linux 系统自带的日志回滚程序,由系统计划服务工具 cron 程序启动,可以对各种系统日志进行回滚。对于 web 服务器的日志管理,只需要在 logrotate.conf 配置文件中添加相应的指令即可轻松实现。
这是一种不使用其它第三方工具就可以实现日志文件回滚的方式。该工具可以通过指定回滚时间或日志文件大小来回滚日志,同时还可以指定保留的备份文件的数目。对于存储空间有限的嵌入式系统是非常不错的选择。但是 logrotate 工具存在一个严重的缺点,即通过对 web 服务器进程发送 HUP 重新启动命令来实现对当前日志文件的截断和轮循。通过这种方式实现日志的回滚会严重的影响 web 服务的连续性,因此对于实时监控的系统来说是不实用的。
2) rotatelogs 工具rotatelogs 工具是 Apache 自带的一个比较简单的日志回滚程序,可以通过在 Apache 配置文件中添加如下命令来启动: errorlog “|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/apache_error_log 86400”。
这是一种通过管道方式、可以不重启服务器就实现对日志文件的回滚,大大加强了对日志的处理能力。该工具提供了按时间或按文件大小来控制日志的方式。对于按时间回滚日志文件时,所指定的时间是指回滚的时间间隔,并且是相对于服务器启动时间的。即如果 web 服务器在中途被重启时,会产生一个新的日志文件,并且新产生的文件与上次产生的文件时间间隔不是设定的回滚时间间隔,这可能对日志文件后续分析程序产生影响。按文件大小回滚时,指定的文件大小最小是以兆为单位。这对于存储有限的嵌入式系统不是很恰当。此外 rotatelogs 工具不会删除旧的日志文件,也不能指定要保留的旧的回滚日志文件数目,因此,如果对于产生的旧日志文件不进行及时的转移或删除,就会越来越占用存储空间,这对于嵌入式系统来说也是不合适的。
3) cronolog 工具cronolog 是一个简单小巧而高效的日志文件回滚工具,其启动方式与 rotatelog 一样,即ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"。但是其生成的日志文件的名字是由指令中的文件名模板和当前的日期时间组成。
cronolog 工具只能按时间的方式来回滚日志文件,但是提供了可以按年、月、日等多种形式的方式回滚日志。同时你也设定目录结构的格式,使日志文件清晰的存放。例如按 %Y/%m/%d/error_log 的方式指定,将使 error_log 存放在年/月/日/的目录下面。但是该工具同样存在不删除旧的日志文件,使存储占用量越来越大,因此对嵌入式系统也是不合适的。
回页首
如何定制日志回滚工具由于以上的工具并不适合嵌入式系统,下面将详细的讲解和实现一个满足日志回滚工具的原理并实现一个满足嵌入式系统的日志工具。该工具提供了与其他的日志工具相似的接口,可以设定的日志文件的大小,同时设定旧日志的保留数目。
系统准备:第一,由 Apache 管道模式的原理可知,我们需要使用管道操作符“|”来启动 Apache 服务器的管道机制。因此为了确保能正确运行,需要确保当前的系统下面是否有 shell 脚本执行器存在。通常在嵌入式系统中一般都是使用最小的 linux 系统,使用 busybox 命令工具来提供最常用的系统命令。为了与 PC 上的 linux 系统具有相似性,建议在 /bin 文件夹下创建一个 sh 的链接文件。
第二,许多的嵌入式系统的文件系统都是使用只读文件系统,因此为了确保能成功创建日志文件,请确保你要保存日志的文件系统是可写的。
原理与实现:由于 Apache 服务器会把日志信息输出到屏幕,通过管道变成标准输入。因此,日志回滚首先需要读取屏幕获取输出的日志信息,其中0表示标准输入的文件描述符。
n_log = read(0, log_buf, sizeof(log_buf));其次,在把读到的日志信息写入文件前,需要判断当前是否已存在日志文件可供写入。如果存在,并且该日志的大小还未达到指定的文件大小,就写入该文件。否则,新建一个日志文件。
if(log_fd >= 0)最后,当一切都准备就绪以后,我们可以放心地将该条信息写入日志文件中。
write(log_fd, log_buf, n_log);这样就完成了一次日志信息的登记,完成以后又重新开始下一次日志操作。其实现的简单的流程如下:
回滚日志工具流程图
图 2. 回滚日志工具流程图以上介绍了一个适合于的嵌入式系统的常用日志回滚工具。由于嵌入式系统差异性很大或需求不同,用户可以根据实际应用定制有针对性的日志工具。
回页首
结束语本文详细的描述了 Apache 服务器的管道日志机制的原理,并比较了当前流行的日志回滚工具。在此基础上,介绍了日志回滚工具的工作原理和流程,并定制了一个针对嵌入式系统的日志回滚工具。