PHP实现日志系统
文件日志记录
使用PHP内置的error_log函数将日志写入文件。配置php.ini中的error_log参数指定日志文件路径,或直接在代码中动态设置。
$message = "用户登录失败,用户名:admin";
error_log(date('[Y-m-d H:i:s]') . " " . $message . "\n", 3, "/var/log/myapp.log");
数据库日志存储
创建专门的日志表结构,通过PDO或MySQLi实现数据库写入。适合需要复杂查询和分析的场景。
$pdo = new PDO('mysql:host=localhost;dbname=logs', 'user', 'pass');
$stmt = $pdo->prepare("INSERT INTO system_logs (level, message, context, created_at) VALUES (?, ?, ?, ?)");
$stmt->execute([
'WARNING',
'数据库连接超时',
json_encode(['ip' => $_SERVER['REMOTE_ADDR']]),
date('Y-m-d H:i:s')
]);
Monolog组件集成
通过Composer安装Monolog库实现专业级日志管理,支持多处理器和格式化。
composer require monolog/monolog
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
$log->warning('支付验证失败', ['order_id' => 12345]);
日志分级处理
实现不同严重级别的日志分类,通常包含DEBUG、INFO、NOTICE、WARNING等层级。

const LOG_LEVELS = [
'DEBUG' => 0,
'INFO' => 1,
'ERROR' => 2
];
function writeLog($message, $level = 'INFO') {
if (LOG_LEVELS[$level] >= LOG_LEVELS['INFO']) {
file_put_contents('app.log', "[$level] $message\n", FILE_APPEND);
}
}
日志轮转机制
处理日志文件过大问题,可以按日期或大小分割日志文件。
$logFile = 'app_' . date('Y-m-d') . '.log';
if (filesize($logFile) > 1024 * 1024) {
rename($logFile, 'app_' . date('Y-m-d_His') . '.log');
}
上下文信息记录
在日志中附加请求上下文,便于问题追踪。

$context = [
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'request_uri' => $_SERVER['REQUEST_URI']
];
error_log(json_encode($context), 3, 'context.log');
日志报警机制
当日志达到特定级别时触发邮件或短信通知。
if (strpos($logEntry, 'CRITICAL') !== false) {
mail('admin@example.com', '系统告警', $logEntry);
}
性能日志记录
专门记录执行时间和内存消耗等性能指标。
$start = microtime(true);
// 业务代码执行
$elapsed = round((microtime(true) - $start) * 1000, 2);
error_log("SQL查询耗时:{$elapsed}ms", 3, 'performance.log');
日志清理策略
设置自动清理过期日志的机制,避免磁盘空间耗尽。
foreach (glob('/var/log/app/*.log') as $file) {
if (filemtime($file) < strtotime('-30 days')) {
unlink($file);
}
}






