LAMP是很常用的软件栈,有时开发一些小型的PHP站点程序,在发生语法错误等阻断程序执行的问题时,类似Whoops这样的调试辅助组件也不能起作用,只能看日志然后检查代码;不过ssh到服务器(或vagrant的开发环境)看日志文件总是有些不太方便,所以本文提供一种便捷的在web页查看错误日志的方法。
2019-05-18 更新:推荐LogHappens替换本文的简陋方案,这是一款与本文所述工作原理相同,但做的比较精致的错误日志查看程序,且支持更多Web服务器。
原理和要点
原理很简单,就是提供一个无需路由的固定路径的php文件,由它读取最新的日志,然后直接打印输出。要点有这么几个:
- 保证www-data对要读取的日志文件及其路径有读权限;
- 区分开发环境和生产环境,有时这两个环境的错误文件路径也不一致;
- 日志文件通常是由logrotate程序滚动更新的,不过即使最新的日志文件也不应输出全部内容,通常tail打印最新的10行就够了;
- 长时间不用了,要将此文件删除或者命名为随机字符串,不要因为这个通道泄露关键信息;
代码
下面的html换行符+html换行符
请自行替换,部分注释代码是为了解释清楚以及备忘,实际使用时可以删除。
if (!preg_match('#production.com#', $_SERVER['HTTP_HOST'])) {
$logpath = '/var/log/apache2/production_error.log';
} else {
$logpath = '/var/log/apache2/dev_error.log';
}
// 根目录
// $logpath = '/errora.log';
// 与此文件同目录
// $logpath = 'error.log';
// 通常打印最近的10行即可
exec('tail ' . $logpath . ' -n 10', $error_logs);
foreach($error_logs as $error_log) {
echo "html换行符+html换行符".$error_log;
}
// 必要时也可以获取文件的全部内容
// echo file_get_contents($logpath);
权限
apache的站点错误日志默认在/var/log/apache2
目录下,从属于root:adm
,www-data是没有读取权限的。文末第二个参考链接中给出了三个让www-data可以读取error日志的方法:
- 转移错误日志文件到www-data有读权限的路径;
- 创建软连接;
- 将www-data加入root组;
作者推荐第一个方法,因为安全原因不建议使用第三个,而第二个可能不起作用。因为第一个方法太麻烦,且无法保证读到最新的日志文件,所以对我们的最初目的来说没有意义;我实际使用的是第三个方法,安全固然不安全,不过那开发环境下就图个省事嘛,也不失为一个不错的方法。关于添加www-data到新组后,如何使新的权限设定生效,请参看前文如何以恰当的权限运行Syncthing。
参考资料
- How to view PHP or Apache error log online in a browser?
- How to make php webpage to access the file in /root directory?
- How to make apache2 user to access the file in /root directory?
-- EOF --
本文最后修改于6年前 (2019-05-18)