`

[转]用 syslog 改进和调试 PHP 应用程序

 
阅读更多

来源: http://www.ibm.com/developerworks/cn/opensource/os-php-syslog/

William B. Zimmerly (bill@zimmerly.com), 自由撰稿人和知识工程师, Author

2007 年 10 月 16 日

探索正在运行中的程序的一种老技术是在策略点上放置代码,显示变量当前值。但是如何完成此操作而不干扰程序的标准输出呢?使用 PHP 的 syslog() 工具,可以非常容易检验这些值。阅读本文了解如何操作。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

用计算机编程是一件单调乏味的事情,但是它也很有趣。编程有趣的一面在于了解使用旧工具的新方法。最近,我签了一份合同帮助解决基于 Linux®、Apache、MySQL 和 Linux、Apache、MySQL、PHP/Perl (LAMP) 的大型复杂内容管理系统 (CMS) 中的若干个错误。该 CMS 的架构是标准的 LAMP 模型,使用运行 Apache V2.0 的 Enterprise Red Hat Linux。驱动 Web 站点的代码由分布在 Apache 文档根目录的 30 个子目录中的几百个 PHP 源模块组成。系统的 Apache 和 MySQL 部分不需要更改,因为我的所有纠错操作都是在 PHP 工作区中进行的。

请访问 PHP 技术资源中心,获取有关 PHP 的信息,包括大量 PHP 技术文章、教程、下载和相关技术资源。

RSS 订阅 PHP 相关文章和教程的 RSS 提要

在研究了该 CMS 的工作原理一段时间之后,我渐渐开始欣赏该系统优雅的设计并且意识到在大多数成熟的编程环境中,此系统只依赖于少量的可用 PHP 函数(在这里想起了旧的 80/20 法则,其中 80% 的工作是用 20% 的可用函数来完成的)。本文将展示如何调试未知的复杂系统,以帮助您了解那些很少使用的函数,并提供如何使用 syslog() 函数的丰富功能来应用新知识的示例。

调试程序

虽然表面上 PHP 编程语言有成百上千个函数可用,但是在读到与本文类似的文章之前,您可能从未使用过某些函数(或许大多数函数)。另一种深入学习语言的方法是调试别人已经用该语言编写的程序。我总是对程序员用具有创造性的方法使用工具印象深刻。

调试像计算机编程一样,一半是科学,一半是艺术。在不是由您创建的系统中跟踪并不明显的错误时,需要能够很快地定位这些错误在代码中的位置。由于要处理的代码模块有成百上千个,因此最佳起点是显示找到错误的输出位置,然后从该位置开始逆向查找来隔离问题。

例如,如果知道输出的计算值不正确,则必须设计一种方法来查看导致出现问题的中间值。通过重要的数据库查询得到的错误数据可以证明存在其他问题。您必须能够查看生成(并由代码提交给 MySQL 引擎)的 SQL 语句以查看问题是不是出在语句里。

完成此操作的一项古老技术是插入可以打印这些字符串和值的代码。不幸的是,使用诸如 PHP 之类的工具或任何基于 Web 的应用程序,您不希望在这样的系统固有输出(即,被发送给浏览器的 HTML 代码)中掺入调试信息,尤其是在要检验的系统是一台生产服务器时。

您可以创建自定义日志记录文件并向其中写入日志消息,但是为什么不使用已经提供给您的工具呢?请始终记住:不要把工具尘封起来。您值得花一些时间查看语言创建者是否已经提供了一种库例程或函数,可以执行您通常需要的功能。实际上,只要您觉得某些内容很明显应当是编程包的一部分,那么它很可能就包含在其中。

我意识到需要使用类似于 UNIX® 的 syslog 的工具。我想 PHP 很有可能有 syslog 功能,因此在快速查看了 PHP 文档后,我找到了它!PHP syslog() 函数是我多年来没注意到的函数,直到我签约来做这个项目。使用 syslog(),我可以搜索直至找到并消除生产系统中的大多数错误,除了需要几分钟时间执行各个函数之外,不会引入其他副作用。

随着知识的积累并且在专业领域中越来越有经验,显然可以采用不同的方法来做事情,并且某种方法将最终成为执行必要任务的首选方法。必须始终牢记的是您认为很明显的事情对其他人来说并不一定是明显的。对您来说很简单的事情对于其他人来说可能非常复杂。

使用诸如 syslog() 函数之类的工具可以控制复杂度,并允许通过配置文件(例如 syslog.conf)来轻松地进行自定义。例如,可以插入代码来设定 SQL 语句的格式,将它记录到 syslog() 中并将其传递给 MySQL 来执行。随后,对 syslog.conf 文件稍微修改一下,把文本发送给另一个日志文件或者可能就发送给位桶(bit bucket)。几个星期或几个月之后,如果有必要再次查看发生的情况,则再对 syslog.conf 文件进行简单更改将还原该功能。





回页首


syslog

syslog 在 UNIX 世界中有着丰富多彩的历史。syslog 最初是作为 Sendmail 项目的一部分开发的,实践证明它非常有用,因此许多其他工具引入了 syslog 功能,证明了最简单的想法有时最有效。

简要地说,syslog 允许应用程序将带有标记的消息写入一组公共系统日志文件中,这些日志文件可以驻留在程序员和网络管理员能够轻松访问的位置。这意味着,例如,您可以配置 Web 服务器上的 syslog 以记录另一台服务器上的系统消息 —— 这台服务器可能是在安全防火墙后面几层并且更易于让前述管理员访问。但是按照我的目的,我只接受将文件写入 /var/log 目录的默认行为。

syslog 机制是在启动时启动的,并且其初始行为是由 syslog.conf 文件中的规则定义的。这些规则使您可以很好地调整使用该机制记录的内容 —— 在一台高容量而且工作繁重的服务器上使用 syslog 机制可以转换为可改变大小的日志文件。

每条规则都包含两个字段:selectoraction。基本上,selector 字段选择要记录的工具(例如,kern、user、mail、lpr)和工具拥有的优先级。优先级字段包含一个关键字,例如 debug、info、notice 或者 warning。而规则的 action 字段用于定义对匹配 selector 字段的那类消息执行的操作。规则可以指定记录消息的文件,将记录消息发送给哪台计算机,将消息发送给什么用户(以控制台消息的形式)等。





回页首


日志记录

研究与 syslog 工具相关的信息和手册页以了解如何根据需要配置系统。在我的例子中,我需要知道在生产 CMS 系统每次运行时各个 PHP 变量的值是什么。我还需要知道某些模块何时启动及何时停止以及各个中间变量值。在说明需要记录哪些信息的细节之前,让我们先来设置日志的基本信息。

使用您最喜欢用的编辑器,创建清单 1 中所示的文件,将其命名为 test.php 并把它放在 Apache 文档根目录中(在我的系统中,它是 /var/www)。


清单 1. test.php
                
<html>
  <head>
    <title>PHP Test Page</title>
  </head>
  <body>
    <?php
	syslog(LOG_NOTICE, "{

来源: http://www.ibm.com/developerworks/cn/opensource/os-php-syslog/

William B. Zimmerly (bill@zimmerly.com), 自由撰稿人和知识工程师, Author

2007 年 10 月 16 日

探索正在运行中的程序的一种老技术是在策略点上放置代码,显示变量当前值。但是如何完成此操作而不干扰程序的标准输出呢?使用 PHP 的 syslog() 工具,可以非常容易检验这些值。阅读本文了解如何操作。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

用计算机编程是一件单调乏味的事情,但是它也很有趣。编程有趣的一面在于了解使用旧工具的新方法。最近,我签了一份合同帮助解决基于 Linux®、Apache、MySQL 和 Linux、Apache、MySQL、PHP/Perl (LAMP) 的大型复杂内容管理系统 (CMS) 中的若干个错误。该 CMS 的架构是标准的 LAMP 模型,使用运行 Apache V2.0 的 Enterprise Red Hat Linux。驱动 Web 站点的代码由分布在 Apache 文档根目录的 30 个子目录中的几百个 PHP 源模块组成。系统的 Apache 和 MySQL 部分不需要更改,因为我的所有纠错操作都是在 PHP 工作区中进行的。

请访问 PHP 技术资源中心,获取有关 PHP 的信息,包括大量 PHP 技术文章、教程、下载和相关技术资源。

RSS 订阅 PHP 相关文章和教程的 RSS 提要

在研究了该 CMS 的工作原理一段时间之后,我渐渐开始欣赏该系统优雅的设计并且意识到在大多数成熟的编程环境中,此系统只依赖于少量的可用 PHP 函数(在这里想起了旧的 80/20 法则,其中 80% 的工作是用 20% 的可用函数来完成的)。本文将展示如何调试未知的复杂系统,以帮助您了解那些很少使用的函数,并提供如何使用 syslog() 函数的丰富功能来应用新知识的示例。

调试程序

虽然表面上 PHP 编程语言有成百上千个函数可用,但是在读到与本文类似的文章之前,您可能从未使用过某些函数(或许大多数函数)。另一种深入学习语言的方法是调试别人已经用该语言编写的程序。我总是对程序员用具有创造性的方法使用工具印象深刻。

调试像计算机编程一样,一半是科学,一半是艺术。在不是由您创建的系统中跟踪并不明显的错误时,需要能够很快地定位这些错误在代码中的位置。由于要处理的代码模块有成百上千个,因此最佳起点是显示找到错误的输出位置,然后从该位置开始逆向查找来隔离问题。

例如,如果知道输出的计算值不正确,则必须设计一种方法来查看导致出现问题的中间值。通过重要的数据库查询得到的错误数据可以证明存在其他问题。您必须能够查看生成(并由代码提交给 MySQL 引擎)的 SQL 语句以查看问题是不是出在语句里。

完成此操作的一项古老技术是插入可以打印这些字符串和值的代码。不幸的是,使用诸如 PHP 之类的工具或任何基于 Web 的应用程序,您不希望在这样的系统固有输出(即,被发送给浏览器的 HTML 代码)中掺入调试信息,尤其是在要检验的系统是一台生产服务器时。

您可以创建自定义日志记录文件并向其中写入日志消息,但是为什么不使用已经提供给您的工具呢?请始终记住:不要把工具尘封起来。您值得花一些时间查看语言创建者是否已经提供了一种库例程或函数,可以执行您通常需要的功能。实际上,只要您觉得某些内容很明显应当是编程包的一部分,那么它很可能就包含在其中。

我意识到需要使用类似于 UNIX® 的 syslog 的工具。我想 PHP 很有可能有 syslog 功能,因此在快速查看了 PHP 文档后,我找到了它!PHP syslog() 函数是我多年来没注意到的函数,直到我签约来做这个项目。使用 syslog(),我可以搜索直至找到并消除生产系统中的大多数错误,除了需要几分钟时间执行各个函数之外,不会引入其他副作用。

随着知识的积累并且在专业领域中越来越有经验,显然可以采用不同的方法来做事情,并且某种方法将最终成为执行必要任务的首选方法。必须始终牢记的是您认为很明显的事情对其他人来说并不一定是明显的。对您来说很简单的事情对于其他人来说可能非常复杂。

使用诸如 syslog() 函数之类的工具可以控制复杂度,并允许通过配置文件(例如 syslog.conf)来轻松地进行自定义。例如,可以插入代码来设定 SQL 语句的格式,将它记录到 syslog() 中并将其传递给 MySQL 来执行。随后,对 syslog.conf 文件稍微修改一下,把文本发送给另一个日志文件或者可能就发送给位桶(bit bucket)。几个星期或几个月之后,如果有必要再次查看发生的情况,则再对 syslog.conf 文件进行简单更改将还原该功能。





回页首


syslog

syslog 在 UNIX 世界中有着丰富多彩的历史。syslog 最初是作为 Sendmail 项目的一部分开发的,实践证明它非常有用,因此许多其他工具引入了 syslog 功能,证明了最简单的想法有时最有效。

简要地说,syslog 允许应用程序将带有标记的消息写入一组公共系统日志文件中,这些日志文件可以驻留在程序员和网络管理员能够轻松访问的位置。这意味着,例如,您可以配置 Web 服务器上的 syslog 以记录另一台服务器上的系统消息 —— 这台服务器可能是在安全防火墙后面几层并且更易于让前述管理员访问。但是按照我的目的,我只接受将文件写入 /var/log 目录的默认行为。

syslog 机制是在启动时启动的,并且其初始行为是由 syslog.conf 文件中的规则定义的。这些规则使您可以很好地调整使用该机制记录的内容 —— 在一台高容量而且工作繁重的服务器上使用 syslog 机制可以转换为可改变大小的日志文件。

每条规则都包含两个字段:selectoraction。基本上,selector 字段选择要记录的工具(例如,kern、user、mail、lpr)和工具拥有的优先级。优先级字段包含一个关键字,例如 debug、info、notice 或者 warning。而规则的 action 字段用于定义对匹配 selector 字段的那类消息执行的操作。规则可以指定记录消息的文件,将记录消息发送给哪台计算机,将消息发送给什么用户(以控制台消息的形式)等。





回页首


日志记录

研究与 syslog 工具相关的信息和手册页以了解如何根据需要配置系统。在我的例子中,我需要知道在生产 CMS 系统每次运行时各个 PHP 变量的值是什么。我还需要知道某些模块何时启动及何时停止以及各个中间变量值。在说明需要记录哪些信息的细节之前,让我们先来设置日志的基本信息。

使用您最喜欢用的编辑器,创建清单 1 中所示的文件,将其命名为 test.php 并把它放在 Apache 文档根目录中(在我的系统中,它是 /var/www)。


清单 1. test.php
___FCKpd___0

您同样应当安装并配置了 PHP。如果没有,请查看 参考资料 以获得介绍如何安装和配置的链接。如果一切配置正确,那么当您访问 URL 为 http://localhost/test.php 的页面时应当会在浏览器中看到以下文本:

PHP Test Page

接下来,打开一个 X 终端窗口并键入以下命令来查看记录到 /var/log/messages 文件中的内容:

tail /var/log/messages

如果一切运行正常,您应当会在接近清单末尾的位置看到下面一行:

Jul 23 14:43:42 localhost apache2: 127.0.0.1: test.php - PHP Index page accessed.

如果您看到了,那很好。您现在已经准备好开始详细调试所使用的复杂系统。

我发现了一个优秀实践:对所有 PHP/MySQL 调用使用 syslog(),这样每次都与 Web 站点交互,可以看到实时生成了哪些 SQL 查询以构建返回给您的页面。一种简单的实现方法是打开另一个 X 终端窗口并结合使用 tail 命令与 -f 选项来 “实时” 查看消息日志:

tail -f /var/log/messages





回页首


记录的内容

现在您已经检验了日志可以正常工作并且可以看到记录机制的结果,下面的提示介绍了如何使用这些工具尽可能快速地缩短学习陌生系统的过程。

必须知道哪些模块执行了超出其文档所述范围的操作。由于这个原因,我喜欢记录标记模块开头和结尾的日志消息。这样,您可以对 Web 站点的页面进行操作,同时监视运行 tail -f /var/log/messages 命令的另一个 X 终端窗口。这样可以看到哪些模块在执行并且浏览器每次请求新页面时的顺序。

我还需要记录在 PHP 代码运行期间被调用的各个程序之间的边界。例如,查询数据库时调用 MySQL,或者修改数据格式时调用外部程序(例如,Extensible Stylesheet Language Transformation(XSLT)引擎)。系统地把这些检查点插入每个 PHP 代码模块中,这种实践将帮助您熟悉模块的名称和位置。当浏览各个页面时代码把您在另一个 X 终端中看到的消息发送给您时,您将获得推动和增强系统知识的重要反馈。





回页首


结束语

syslog 工具是调试由其他人编写的应用程序的强大工具。它允许您查看哪些模块正被执行,哪些 SQL 语句正在执行,以及在您浏览 Web 站点时哪些变量值发生更改。这有助于查找可能会发生问题的模块。

SERVER['REMOTE_ADDR']}: test.php - PHP Index page accessed."); echo '<p>PHP Test Page</p>'; ?> </body> </html>

您同样应当安装并配置了 PHP。如果没有,请查看 参考资料 以获得介绍如何安装和配置的链接。如果一切配置正确,那么当您访问 URL 为 http://localhost/test.php 的页面时应当会在浏览器中看到以下文本:

___FCKpd___1

接下来,打开一个 X 终端窗口并键入以下命令来查看记录到 /var/log/messages 文件中的内容:

___FCKpd___2

如果一切运行正常,您应当会在接近清单末尾的位置看到下面一行:

___FCKpd___3

如果您看到了,那很好。您现在已经准备好开始详细调试所使用的复杂系统。

我发现了一个优秀实践:对所有 PHP/MySQL 调用使用 syslog(),这样每次都与 Web 站点交互,可以看到实时生成了哪些 SQL 查询以构建返回给您的页面。一种简单的实现方法是打开另一个 X 终端窗口并结合使用 tail 命令与 -f 选项来 “实时” 查看消息日志:

___FCKpd___4





回页首


记录的内容

现在您已经检验了日志可以正常工作并且可以看到记录机制的结果,下面的提示介绍了如何使用这些工具尽可能快速地缩短学习陌生系统的过程。

必须知道哪些模块执行了超出其文档所述范围的操作。由于这个原因,我喜欢记录标记模块开头和结尾的日志消息。这样,您可以对 Web 站点的页面进行操作,同时监视运行 tail -f /var/log/messages 命令的另一个 X 终端窗口。这样可以看到哪些模块在执行并且浏览器每次请求新页面时的顺序。

我还需要记录在 PHP 代码运行期间被调用的各个程序之间的边界。例如,查询数据库时调用 MySQL,或者修改数据格式时调用外部程序(例如,Extensible Stylesheet Language Transformation(XSLT)引擎)。系统地把这些检查点插入每个 PHP 代码模块中,这种实践将帮助您熟悉模块的名称和位置。当浏览各个页面时代码把您在另一个 X 终端中看到的消息发送给您时,您将获得推动和增强系统知识的重要反馈。





回页首


结束语

syslog 工具是调试由其他人编写的应用程序的强大工具。它允许您查看哪些模块正被执行,哪些 SQL 语句正在执行,以及在您浏览 Web 站点时哪些变量值发生更改。这有助于查找可能会发生问题的模块。

分享到:
评论

相关推荐

    SYSLOG发送小程序

    非常轻便的SYSLOG日志发送及日志测试软件,windows平台上使用,可测试windows、linux日志发送。

    evtsys服务将windows日志转换为syslog格式

    window日志采集器 采用evtsys收集windows日志。 基本思路是使用evtsys把windows日志转换为syslog格式,然后发送到日志服务器

    syslog工具(win10可以用)

    syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10可以用)syslog工具(win10...

    winlogd 源码: windows 事件转syslog日志

    winlogd 源码 windows 事件转syslog日志winlogd 源码 windows 事件转syslog日志winlogd 源码 windows 事件转syslog日志winlogd 源码 windows 事件转syslog日志winlogd 源码 windows 事件转syslog日志

    kiwi syslog server 9.5

    1. 运行Kiwi_Syslog_Server_9.5.0.setup.exe安装程序 2. 安装完成退出程序 3. 拷贝SolarWinds.Licensing.Framework.dll和ufmod.dll两个文件到软件安装目录,选择覆盖目的文件 4. 运行Kiwi Syslog软件,点击Help&gt;&gt;...

    syslog receiver syslog接收测试工具

    syslog receiver syslog接收测试工具 MegaLogSyslogTestReceiverV2.zip

    syslog工具

    由于syslog简单而灵活的特性,syslog不再仅限于 Unix类主机的日志记录,任何需要记录和发送日志的场景,都可能会使用syslog。 长期以来,没有一个标准来规范syslog的格式,导致syslog的格式是非常随意的。最坏的情况...

    SYSLOG日志数据采集实现

    syslog 使用UDP 作为传输协议,通过目的端口514(也可以是其他定义的端口 号),将所有安全设备的日志管理配置发送到安装了syslog 软件系统的日志服务器,syslog 日志服务器自动接收日志数据并写到日志文件中。

    syslog协议发送日志(java)

    利用syslog协议 ,发送网络安全设备日志。java版

    kiwisyslog 免费版

    kiwisyslog server 免费版本,可收集展示syslog日志统计报表

    Syslog Watcher 2.zip

    系统管理员使用Syslog进行网络管理和安全审核。 通过专用的syslog服务器和syslog协议将来自整个网络的事件记录整合到一个中央存储库中,对于网络安全具有重大意义,syslog日志服务器可收集,解析,存储,分析和解释...

    MT_Syslog.exe中文版 MT_Syslog中文版

    MT_Syslog MT_Syslog.exe MT_Syslog中文版 ros日志远程记录 ros日志 网上找了好久也没有找到个中文版的,很是郁闷,最后干脆我自己做个汉化要点分不好意思啊,花了我半天的时间翻译,编译的,一点辛苦,有的地方,不...

    SysLog日志工具1

    SysLog日志工具术语SYSLOG:系统日志协议SYSLOG功能功能启/停用参数配置,包括使用协议、服务器地址、服务器端口、字符编码SYSLOG预置数据使用已

    [日志分析工具]Syslog Watcher 5

    [日志分析工具]Syslog Watcher 5 软件调试必备软件!!!

    SyslogWatcher

    Syslog Watcher is a Windows-based syslog server for corporate networks. The syslog server collects, stores, parses, displays and explains syslog information to both new and professional network ...

    syslog-server.zip

    syslog server可用于接收syslog的SpringBoot程序

    redhat syslog 配置 笔记

    redhat syslog 配置 笔记 介绍syslog.conf的配置文件格式和配置实例

    syslog_win32.lib

    2.将syslog.h头文件和syslog.h头文件编译成静态库,已经编译好的静态库; 3.下载完syslog_win32.lib后包含到工程文件中,添加syslog.h头文件,即可使用; 4.新建syslog.host配置文件,包含服务器IP:514,默认端口号...

    SNMP V3 和 SYSLOG 配置范例

    网上所有资料都没有详细的配置SNMP V3 和 syslog 的实例

    Kiwi Syslog Server 9.6.2官方免费版本

    软件介绍: Kiwi Syslog Server 9.6.2官方免费版本,有使用限制,只能免费管理5台设备。Kiwi-Syslog-Server是一款应用于WINDOWS系统的系统日志守护进程,能够接收并记录系统日志,各种设备的SYSLOG消息,内置丰富的...

Global site tag (gtag.js) - Google Analytics