IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

用syslog-ng实时收集每一行php报错

互联网,请记住我 2011-12-11 16:01:10 累计浏览 2,119 次
本机暂存

因为目前的创业项目是电商服务,为了将服务可用率不断地提高,以保证我们的客户不管何时总是能正常使用我们的服务,我们决定收集PHP的每一个报错信息.最终的方案如下:

1.安装syslog-ng,修改配置文件vim /etc/syslog-ng/syslog-ng.conf ,加上这几行:

source s_phplog { file(“/home/x/logs/php/php.www.log”);};
destination d_php_tomail { program(“/home/x/bin/send_my_mail.py”);};
log { source(s_phplog);destination(d_php_tomail);};

这几行配置就是让syslog-ng来监控php日志输出,然后每当有日志输出,就启动我写好的一个脚本文件,让它来发送到我的邮箱.send_my_mail.py内容很简单:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#导入smtplib和MIMEText
import smtplib
from email.mime.text import MIMEText
#############
#要发给谁,这里发给2个人
#####################
#设置服务器,用户名、口令以及邮箱的后缀
mail_host="smtp.****.com"
mail_user="noreply@example.com"
mail_pass="****"
######################
def send_mail(to_list,sub,content):
    '''
    to_list:发给谁
    sub:主题
    content:内容
    send_mail("aaa@126.com","sub","content")
    '''
    msg = MIMEText(content)
    msg['Subject'] = sub
    msg['From'] = mail_user
    msg['To'] = ";".join(to_list)
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(mail_user, to_list, msg.as_string())
        s.close()
        return True
    except Exception, e:
        print str(e)
        return False
if __name__ == '__main__':
    mailto_list=["renlu.xu@xiaoqianbao.com"]
    lines = raw_input()
    if send_mail(mailto_list,"发生了错误",lines):
        print "发送成功"
    else:
        print "发送失败"

就是从标准输入中读到内容,然后发送到邮箱.我就是从网上扒了段代码,都没细读.

然后重启syslog-ng:

sudo /etc/init.d/syslog-ng

就可以了.我把这个日志设置为发送到了qq邮箱,然后用微信接收,就实现了服务器的实时报警.

但是后来发现,一些日志,发过来的,完全没法查是怎么出问题了,比如如报警是undefined function init_framework() called这种,连我初始化函数都没有加载,我都不知道这程序从哪儿开始执行的了….于是决定小改造一下,在有严重的出错信息时,将当前的URI信息记录到errorlog中.就有了这么一段代码,插入到php文件的开头了:

<?php
register_shutdown_function('handleShutdown');
function handleShutdown() {
        $error = error_get_last();
        if($error !== NULL){
            $info = "[SHUTDOWN] file:".$error['file']." | ln:".$error['line']." | msg:".$error['message'] .PHP_EOL;
            $sapi_type = php_sapi_name();
            $sapi = substr($sapi_type, 0, 3);
            if($sapi=="cli"){
                $info .= join(" ",$_SERVER["argv"]);
            }else{
                $info .= $_SERVER["HTTP_HOST"]."".$_SERVER["REQUEST_URI"];
            }
            error_log($info.PHP_EOL,3,ini_get("error_log"));
        }
}
?>

提示一下本人搞东西极期不认真,所有代码均非原创,请勿直接使用于生产环境.

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. WEB系统需要关注的一些点 (累计阅读 18,219)
  5. 批量添加主机到cacti+nagios的监控报警系统中 (累计阅读 14,994)
  6. 我常用的主机监控shell脚本 (累计阅读 13,435)
  7. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  8. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)
  9. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  10. Redis消息队列的若干实现方式 (累计阅读 12,088)