用syslog-ng实时收集每一行php报错
浏览:1902次 出处信息
因为目前的创业项目是电商服务,为了将服务可用率不断地提高,以保证我们的客户不管何时总是能正常使用我们的服务,我们决定收集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"));
}
}
?>
提示一下本人搞东西极期不认真,所有代码均非原创,请勿直接使用于生产环境.
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Web开发中需要了解的东西
后一篇:Erlang虚拟机内存使用问题以及监控 >>
文章信息
- 作者:一米六二 来源: 互联网,请记住我
- 标签: syslogng
- 发布时间:2011-12-11 16:01:10
近3天十大热文
-
[899] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[56] 整理了一份招PHP高级工程师的面试题 -
[55] Innodb分表太多或者表分区太多,会导致内 -
[53] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] 全站换域名时利用nginx和javascri -
[52] CloudSMS:免费匿名的云短信 -
[52] 海量小文件存储 -
[52] 用 Jquery 模拟 select -
[51] 分享一个JQUERY颜色选择插件