热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

定制嵌入式系统中Apache的日志回滚工具

引言目前,为了方便地管理和配置嵌入式设备,很多嵌入式设备都提供了Web的接入访问模式。Apache服务器是目前各种的Web服务器中最被广泛使用的。为了有效地管理Web服务器,掌握和反馈服务器的活动、性能以及出现的问题,通常我们都会开启Web服务器的日
引言

目前,为了方便地管理和配置嵌入式设备,很多嵌入式设备都提供了 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)
{
        if( filesize(log_fd) >= f_size)
{
        fclose(log_fd);
        log_fd = -1;
}
}
if(log_fd == -1)
{
        log_fd = create_new_log();
}

最后,当一切都准备就绪以后,我们可以放心地将该条信息写入日志文件中。

write(log_fd, log_buf, n_log);
n_log = read(0, log_buf, sizeof(log_buf));

这样就完成了一次日志信息的登记,完成以后又重新开始下一次日志操作。其实现的简单的流程如下:

回滚日志工具流程图

图 2. 回滚日志工具流程图
回滚日志工具流程图

以上介绍了一个适合于的嵌入式系统的常用日志回滚工具。由于嵌入式系统差异性很大或需求不同,用户可以根据实际应用定制有针对性的日志工具。

结束语

本文详细的描述了 Apache 服务器的管道日志机制的原理,并比较了当前流行的日志回滚工具。在此基础上,介绍了日志回滚工具的工作原理和流程,并定制了一个针对嵌入式系统的日志回滚工具。


推荐阅读
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 本文探讨了服务器系统架构的性能评估方法,包括性能评估的目的、步骤以及如何选择合适的度量标准。文章还介绍了几种常用的基准测试程序及其应用,并详细说明了Web服务器性能评估的关键指标与测试方法。 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
author-avatar
vaaal52653
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有