简单的说,
开发中的日志可以分为错误日志和一般用户操作日志。除了以前做管理后台的时候会记录一些操作日志以外,之前没怎么重视日志。其实完善的日志机制能够记录恶
意的操作,帮助程序员发现问题,提高安全性。用户操作日志(比如登录日志、删除操作日志)通常需要手动记录,根据情况,决定是记录在数据库还是文件中。
通常错误日志 php 可以自己记录。比如我在 php.ini 文件中设置:
error_reporting = E_ALL
log_errors = On
error_log = "D:\Program\php5\hick.log"
php 就会把除 E_STRICT (Runtime Notice)以外的全部错误(参考 )都记录到上面设置的 .log 文件。如果这时候设置 php.ini 中的 display_errors 为 Off (当然也可以通过 ini_set 设置),PHP 的错误信息就不会被输出到浏览器端。对产品环境来说,错误所暴露的信息可能是很严重的安全隐患,也是很不友好的。
默认情况下, php 的错误通常以类似下面这样的形式输出:
Warning: Cannot modify header information - headers already sent (output started at ./hick.php:41) in ./hick.php on line 43
你
也可以通过 set_error_handler 来自定义错误处理函数,定制具体输出样式。详细情况可以参考手册。不过需要注意使用
set_error_handler 以后, 即使进行了上面的设置, PHP 也不会记录错误日志,需要手动用 error_log 或者
file_put_contents 函数写入日志文件。另外自定义错误处理函数有一个缺点,就是无法处理这些错误类型:E_ERROR,
E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR,
E_COMPILE_WARNING 等。而作为一种特殊的”错误”—异常, set_exception_handler 能够处理所有异常。
以上笔记经过了实践,运行环境为 apache2 + php 5.2 ,更多详细信息可以参考 php 手册。
顺
便提一下, file_put_contents 是 PHP5 才支持的函数,它和依次调用 fopen(),fwrite() 以及
fclose() 功能一样。而 error_log
的写日志文件的用法也跟该函数差不多。实际上我通过循环写入文件的测试,两者性能也差不多,估计写文件的实现方式也差不多。
阅读(836) | 评论(0) | 转发(0) |