Phalcon框架中添加日志

日志可以在程序出现bug时帮助排查问题,如果没有日志在解决bug时很可能无从下手。这两天修改了一个发邮件的功能,期间在自测代码的时候对日志接触的比较多,也意识到其重要性,在这里小结一下。由于公司使用的是Phalcon框架,因此这篇文章主要说说在Phalcon框架下添加日志。

在Phalcon框架下添加日志

Phalcon框架下添加日志的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
//可以添加不同级别的日志
\Phalcon\DI::getDefault()->getLog()->critical("message"); //critical级别日志
\Phalcon\DI::getDefault()->getLog()->emergency("message"); //emergency级别日志
\Phalcon\DI::getDefault()->getLog()->fatal("message"); //fatal级别日志
\Phalcon\DI::getDefault()->getLog()->debug("message"); //debug级别日志
\Phalcon\DI::getDefault()->getLog()->error("message"); //error级别日志
\Phalcon\DI::getDefault()->getLog()->info("message"); //只记录相关信息,不给出错误级别,也可能没有错误
\Phalcon\DI::getDefault()->getLog()->notice("message"); //notice级别日志
\Phalcon\DI::getDefault()->getLog()->warning("message"); //warning级别日志
\Phalcon\DI::getDefault()->getLog()->alert("message"); //alert级别日志

//也可以直接使用log()方法,加一个表示错误级别的常量参数(可省略)
\Phalcon\DI::getDefault()->getLog()->log("message"[,ERROR LEVEL]);

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//1中的发邮件功能在线上环境时可以这样添加日志
$to = 'zuolicong@foxmail.com';
foreach ($areaAttachs as $city => $attachs) {
$title = $city . "IM响应记录\r\n";
$body = "附件为" . $city . "IM响应记录\r\n";
$mailTarget = $this->getAreaMailer($city);
if ($mailTarget) { //收件人存在
$mailTarget = explode(',',$mailTarget);
$ret = Lib\Email::send($to, $title, $body, (array) $mailTarget, $attachs);
\Phalcon\DI::getDefault()->getLog()->info(date('Y-m-d H:i:s') . " send mail to:{$to} city:{$city} ret:" . json_encode($ret));
} else {
//邮件发送失败的日志
\Phalcon\DI::getDefault()->getLog()->info(date('Y-m-d H:i:s') . " cant not found mail receiver city:{$city}");
}
}

//添加error级别的日志
if ($ins->save()) {
return true;
} else {
\Phalcon\DI::getDefault()->getLog()->error(__method__ . " error with message:" . $ins->getErrorAsString());
return false;
}

正常情况下Phalcon日志会自动记录时间,但是在命令行运行不会记录,如果要在命令行运行或测试代码,例如执行定时脚本任务等,可以记录时间,这样便于在出错时尽快找出原因所在。此外,如果想要日志直接在终端输出,可以在函数的第一行加上下面这种用法:

1
\Phalcon\DI::getDefault()->getLog()->toConsole=1;

Phalcon日志详细用法可以参考:日志记录(Logging) — Phalcon 2.0.8 文档 - Phalcon PHP

在哪里添加日志比较合适

一般来说容易出错的函数最好添加日志,便于排查问题,例如上述的发邮件函数。在开发的时候有些地方不知道是否容易出错,但是后续过程中如果出现了bug,就会知道哪些地方容易出错,可以加上日志。还是以发邮件功能为例,突然有一天南京那边的分公司说没有收到邮件,但是其它的分公司都收到了(后面发现有少数几家分公司也没有收到邮件,只是没有在意而已),经排查发现原来是生成邮件附件时出问题了,附件内容用iconv(“UTF-8”, “GB2312”, $contents)函数进行字符编码转换时$contents含有特殊字符转换失败,iconv()函数返回false,导致附件内容为空,邮件不发送,在修复了这个bug之后给iconv()函数添加了日志如下:

1
2
3
4
5
6
7
8
9
10
11
12
private function createAttach($fileName, $contents) {
if (!$contents) {
return false;
}
$contents = iconv("UTF-8", "GB18030//IGNORE", $contents); //忽略特殊字符
if($contents){
return file_put_contents($fileName, $contents);
} else {
\Phalcon\DI::getDefault()->getLog()->info(date('Y-m-d H:i:s') . " 字符编码转换失败!");
return false;
}
}

需要注意的是file_put_contents()函数也容易出错从而返回false,因此这里选择给file_put_contents()函数添加日志也是可以的。此外在次数不是很多的循环中可以添加日志,这样可以知道每条是否执行成功。

查看日志

日志一般在/tmp/或者/apps/log/文件夹里,假如我们要查看的日志文件为daily_mail.log,可以使用tail命令查看最近的日志:

1
tail -f daily_mail.log

或者先用less命令打开日志文件,再shift+g跳到日志末尾,然后用k/j进行上/下翻动:

1
less daily_mail.log

如果需要查找包含特定信息的日志内容,例如查找包含南京的最近的日志,可以这样做:

1
tail -f daily_mail.log | grep 南京

如果需要查看所有包含南京的日志信息,可以这样做:

1
cat daily_mail.log | grep 南京