本文目录导读:

在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错误日志,便于调试和维护应用程序。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播