本文目录导读:

在PHP中记录错误日志有多种方法,下面详细介绍几种常用的方式:
配置php.ini文件
基础配置
; 开启错误日志 log_errors = On ; 设置错误日志文件路径 error_log = /var/log/php_errors.log ; 设置错误报告级别(开发环境) error_reporting = E_ALL ; 生产环境建议 ; error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; 是否显示错误(生产环境应设为Off) display_errors = Off
运行时动态配置
在PHP代码中动态设置:
<?php
// 开启错误日志
ini_set('log_errors', 1);
// 设置错误日志文件
ini_set('error_log', '/path/to/your/error.log');
// 设置错误报告级别
error_reporting(E_ALL);
// 不显示错误到页面
ini_set('display_errors', 0);
?>
使用error_log()函数
基本用法
<?php
// 记录自定义错误信息
error_log("这是一条错误信息");
// 记录到指定文件
error_log("自定义错误信息", 3, "/var/log/my_errors.log");
// 发送到系统日志
error_log("系统日志信息", 0);
// 发送到邮件
error_log("邮件错误信息", 1, "admin@example.com");
?>
参数说明
- message:必需,错误信息内容
- message_type:可选,0=系统日志,1=邮件,3=文件
- destination:可选,目标位置
- extra_headers:可选,额外的邮件头
自定义错误处理函数
<?php
// 自定义错误处理器
function customErrorHandler($errno, $errstr, $errfile, $errline) {
$logMessage = sprintf(
"[%s] 错误代码: %d | 错误信息: %s | 文件: %s | 行号: %d",
date('Y-m-d H:i:s'),
$errno,
$errstr,
$errfile,
$errline
);
// 写入文件
file_put_contents('/var/log/custom_errors.log', $logMessage . PHP_EOL, FILE_APPEND);
// 也可以使用系统日志
// error_log($logMessage);
// 可以根据错误类型返回不同的处理
if ($errno == E_USER_ERROR) {
die("发生严重错误");
}
// 阻止PHP默认的错误处理
return true;
}
// 设置自定义错误处理器
set_error_handler("customErrorHandler");
// 测试错误
trigger_error("这是一个测试错误", E_USER_WARNING);
?>
异常日志记录
<?php
// 自定义异常处理
function exceptionHandler($exception) {
$logMessage = sprintf(
"[%s] 未捕获异常: %s | 文件: %s | 行号: %d",
date('Y-m-d H:i:s'),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine()
);
error_log($logMessage);
// 开发环境显示,生产环境隐藏
if (ini_get('display_errors')) {
echo "错误: " . $exception->getMessage();
}
}
// 设置异常处理器
set_exception_handler('exceptionHandler');
?>
完整的日志类示例
<?php
class Logger {
private $logFile;
private $logLevel;
const LEVEL_INFO = 1;
const LEVEL_WARNING = 2;
const LEVEL_ERROR = 3;
public function __construct($logFile = null) {
$this->logFile = $logFile ?: dirname(__FILE__) . '/app.log';
$this->logLevel = self::LEVEL_INFO;
}
public function setLogLevel($level) {
$this->logLevel = $level;
}
public function info($message) {
$this->writeLog($message, 'INFO', self::LEVEL_INFO);
}
public function warning($message) {
$this->writeLog($message, 'WARNING', self::LEVEL_WARNING);
}
public function error($message) {
$this->writeLog($message, 'ERROR', self::LEVEL_ERROR);
}
private function writeLog($message, $levelName, $level) {
if ($level < $this->logLevel) {
return;
}
$formatMessage = sprintf(
"[%s] [%s] %s\n",
date('Y-m-d H:i:s'),
$levelName,
$message
);
file_put_contents($this->logFile, $formatMessage, FILE_APPEND);
}
public function getLogFile() {
return $this->logFile;
}
}
// 使用示例
$logger = new Logger('/var/log/myapp.log');
$logger->setLogLevel(Logger::LEVEL_WARNING);
$logger->info("这是信息");
$logger->warning("这是警告");
$logger->error("这是错误");
?>
日志轮转配置
<?php
// 简单日志轮转
function rotateLogFile($logFile, $maxSize = 1048576) { // 默认1MB
if (file_exists($logFile) && filesize($logFile) > $maxSize) {
$backupFile = $logFile . '.' . date('Y-m-d_His');
rename($logFile, $backupFile);
}
}
// 在写入日志前检查
$logFile = '/var/log/rotating.log';
rotateLogFile($logFile);
error_log("新日志内容", 3, $logFile);
?>
框架中的日志记录
Laravel
use Illuminate\Support\Facades\Log;
Log::info('用户登录成功');
Log::warning('警告信息');
Log::error('数据库连接失败');
// 带上下文
Log::info('用户操作', ['user_id' => 123, 'action' => 'login']);
ThinkPHP
use think\facade\Log;
Log::write('记录日志');
Log::info('信息日志');
Log::error('错误日志');
最佳实践建议
开发环境
// php.ini 配置 error_reporting = E_ALL display_errors = On log_errors = On error_log = /var/log/php_development.log
生产环境
// php.ini 配置 error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE display_errors = Off log_errors = On error_log = /var/log/php_production.log
安全注意事项
<?php
// 不要在日志中记录敏感信息
// 错误信息不要暴露给用户
// 设置适当的文件权限
chmod('/var/log/php_errors.log', 0644);
// 使用系统日志可以避免权限问题
error_log("错误信息", 0);
?>
监控和告警
<?php
class ErrorAlert {
public static function sendAlert($errorContent) {
// 发送到监控系统
$ch = curl_init('https://monitoring.example.com/api/alerts');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'message' => $errorContent,
'timestamp' => date('Y-m-d H:i:s')
]));
curl_exec($ch);
curl_close($ch);
}
}
// 在错误处理函数中使用
function customErrorHandler($errno, $errstr, $errfile, $errline) {
$logMessage = "错误: $errstr in $errfile on line $errline";
error_log($logMessage);
// 重要错误发送告警
if ($errno == E_ERROR) {
ErrorAlert::sendAlert($logMessage);
}
return true;
}
?>
使用这些方法,你可以灵活地记录和管理PHP错误日志,便于调试和维护应用程序。