使用php的syslog函数,调用本地的syslog服务,然后从本地syslog发送到中央syslog服务器进行分析整理,配置如下
首先我们先写一个php的测试文件
\<\?php
define_syslog_variables();
openlog(“TextLog”, LOG_PID, LOG_LOCAL0);
$data = date(“Y/m/d H:i:s”);
syslog(LOG_DEBUG,”Messagge: $data”);
closelog();
\?\>
注意,我们用local0这个openlog所以在本地的syslog.conf中需配置local0具体配置如下
vi /etc/syslog.conf
local0.*
保存退出以后/etc/init.d/syslog restart
index-server是中央服务器的hostname也可以是IP地址
然后我们配置中央服务器的syslog
vi /etc/sysconfig/syslog
将SYSLOGD_OPTIONS=”-m 0″改成SYSLOGD_OPTIONS=”-m 0 -r”
存盘退出
vi /etc/syslog.conf
local0.*
#这里就是从各个机器打过来的log放在哪个文件里。。这个文件可能会比较大,建议对这个文件作每日存档
#还有local0.debug 可以打在/var/log/php_debug.log中类似这种。。。可以自由发挥。。
存盘退出以后/etc/init.d/syslog restart
在远端机执行t.php
Sep
你看。。app01的log已经写入index-server的php.log文件中了!是不是很简单,很好用??至于t.php如何封装一下,优化一下。。
这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
#include
void openlog (char*ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();
程序的用法示例代码如下:
#include
int main(int argc, char **argv)
{
}
编译生成可执行程序后,运行一次程序将向/var/log/message文件添加一行信息如下:
openlog及closelog函数说明
此函数原型如下:
void openlog(const char *ident, int option, int facility);
此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
openlog的第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数option是下列值取与运算的结果:LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID,各值意义请参考man openlog手册:
LOG_CONS
LOG_NDELAY
LOG_NOWAIT
LOG_ODELAY
LOG_PERROR
LOG_PID
第三个参数facility指明记录日志的程序的类型。
syslog函数及参数
syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
void syslog(int priority, const char *format, ...);
第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。
如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。
level
NOTES
SEE ALSO
vsyslog与syslog函数的功能是一样的。
用计算机编程是一件单调乏味的事情,但是它也很有趣。编程有趣的一面在于了解使用旧工具的新方法。最近,我签了一份合同帮助解决基于 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 工作区中进行的。
在研究了该 CMS 的工作原理一段时间之后,我渐渐开始欣赏该系统优雅的设计并且意识到在大多数成熟的编程环境中,此系统只依赖于少量的可用 PHP 函数(在这里想起了旧的 80/20 法则,其中 80% 的工作是用 20% 的可用函数来完成的)。本文将展示如何调试未知的复杂系统,以帮助您了解那些很少使用的函数,并提供如何使用 syslog()
虽然表面上 PHP 编程语言有成百上千个函数可用,但是在读到与本文类似的文章之前,您可能从未使用过某些函数(或许大多数函数)。另一种深入学习语言的方法是调试别人已经用该语言编写的程序。我总是对程序员用具有创造性的方法使用工具印象深刻。
调试像计算机编程一样,一半是科学,一半是艺术。在不是由您创建的系统中跟踪并不明显的错误时,需要能够很快地定位这些错误在代码中的位置。由于要处理的代码模块有成百上千个,因此最佳起点是显示找到错误的输出位置,然后从该位置开始逆向查找来隔离问题。
例如,如果知道输出的计算值不正确,则必须设计一种方法来查看导致出现问题的中间值。通过重要的数据库查询得到的错误数据可以证明存在其他问题。您必须能够查看生成(并由代码提交给 MySQL 引擎)的 SQL 语句以查看问题是不是出在语句里。
完成此操作的一项古老技术是插入可以打印这些字符串和值的代码。不幸的是,使用诸如 PHP 之类的工具或任何基于 Web 的应用程序,您不希望在这样的系统固有输出(即,被发送给浏览器的 HTML 代码)中掺入调试信息,尤其是在要检验的系统是一台生产服务器时。
您可以创建自定义日志记录文件并向其中写入日志消息,但是为什么不使用已经提供给您的工具呢?请始终记住:不要把工具尘封起来。您值得花一些时间查看语言创建者是否已经提供了一种库例程或函数,可以执行您通常需要的功能。实际上,只要您觉得某些内容很明显应当是编程包的一部分,那么它很可能就包含在其中。
我意识到需要使用类似于 UNIX® 的 syslog 的工具。我想 PHP 很有可能有 syslog 功能,因此在快速查看了 PHP 文档后,我找到了它!PHP syslog()
syslog()
,我可以搜索直至找到并消除生产系统中的大多数错误,除了需要几分钟时间执行各个函数之外,不会引入其他副作用。
随着知识的积累并且在专业领域中越来越有经验,显然可以采用不同的方法来做事情,并且某种方法将最终成为执行必要任务的首选方法。必须始终牢记的是您认为很明显的事情对其他人来说并不一定是明显的。对您来说很简单的事情对于其他人来说可能非常复杂。
使用诸如 syslog()
syslog()
syslog 在 UNIX 世界中有着丰富多彩的历史。syslog 最初是作为 Sendmail 项目的一部分开发的,实践证明它非常有用,因此许多其他工具引入了 syslog 功能,证明了最简单的想法有时最有效。
简要地说,syslog 允许应用程序将带有标记的消息写入一组公共系统日志文件中,这些日志文件可以驻留在程序员和网络管理员能够轻松访问的位置。这意味着,例如,您可以配置 Web 服务器上的 syslog 以记录另一台服务器上的系统消息 —— 这台服务器可能是在安全防火墙后面几层并且更易于让前述管理员访问。但是按照我的目的,我只接受将文件写入 /var/log 目录的默认行为。
syslog 机制是在启动时启动的,并且其初始行为是由 syslog.conf 文件中的规则定义的。这些规则使您可以很好地调整使用该机制记录的内容 —— 在一台高容量而且工作繁重的服务器上使用 syslog 机制可以转换为可改变大小的日志文件。
每条规则都包含两个字段:selector
研究与 syslog 工具相关的信息和手册页以了解如何根据需要配置系统。在我的例子中,我需要知道在生产 CMS 系统每次运行时各个 PHP 变量的值是什么。我还需要知道某些模块何时启动及何时停止以及各个中间变量值。在说明需要记录哪些信息的细节之前,让我们先来设置日志的基本信息。
使用您最喜欢用的编辑器,创建清单 1 中所示的文件,将其命名为 test.php 并把它放在 Apache 文档根目录中(在我的系统中,它是 /var/www)。
\<\html> \ \ \ \\<\?php syslog(LOG_NOTICE, "{$_SERVER['REMOTE_ADDR']}: test.php - PHP Index page accessed."); echo ' PHP Test Page '; \?\> \<\/body> \ 您同样应当安装并配置了 PHP。如果没有,请查看
接下来,打开一个 X 终端窗口并键入以下命令来查看记录到 /var/log/messages 文件中的内容:
如果一切运行正常,您应当会在接近清单末尾的位置看到下面一行:
如果您看到了,那很好。您现在已经准备好开始详细调试所使用的复杂系统。 我发现了一个优秀实践:对所有 PHP/MySQL 调用使用
现在您已经检验了日志可以正常工作并且可以看到记录机制的结果,下面的提示介绍了如何使用这些工具尽可能快速地缩短学习陌生系统的过程。 必须知道哪些模块执行了超出其文档所述范围的操作。由于这个原因,我喜欢记录标记模块开头和结尾的日志消息。这样,您可以对 Web 站点的页面进行操作,同时监视运行 我还需要记录在 PHP 代码运行期间被调用的各个程序之间的边界。例如,查询数据库时调用 MySQL,或者修改数据格式时调用外部程序(例如,Extensible Stylesheet Language Transformation(XSLT)引擎)。系统地把这些检查点插入每个 PHP 代码模块中,这种实践将帮助您熟悉模块的名称和位置。当浏览各个页面时代码把您在另一个 X 终端中看到的消息发送给您时,您将获得推动和增强系统知识的重要反馈。 syslog 工具是调试由其他人编写的应用程序的强大工具。它允许您查看哪些模块正被执行,哪些 SQL 语句正在执行,以及在您浏览 Web 站点时哪些变量值发生更改。这有助于查找可能会发生问题的模块。 |