php实现日志输出
PHP实现日志输出的方法
在PHP中实现日志输出可以通过多种方式完成,以下介绍几种常见且实用的方法:
使用内置函数error_log
PHP内置的error_log函数可以方便地将日志写入文件或发送到系统日志。该函数支持多种日志输出方式:
// 写入到指定文件
error_log("Error message", 3, "/path/to/error.log");
// 发送到系统日志
error_log("System error", 0);
// 通过邮件发送错误(不推荐用于常规日志)
error_log("Critical error", 1, "admin@example.com");
自定义日志函数
创建一个自定义日志函数可以更灵活地控制日志格式和输出目标:

function writeLog($message, $level = 'INFO') {
$logFile = '/path/to/application.log';
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[$timestamp] [$level] $message" . PHP_EOL;
file_put_contents($logFile, $logMessage, FILE_APPEND);
}
// 使用示例
writeLog('User logged in', 'INFO');
writeLog('Database connection failed', 'ERROR');
使用Monolog库
Monolog是PHP社区广泛使用的专业日志库,提供多种日志处理器和格式化选项:
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// 创建日志频道
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// 添加日志记录
$log->warning('This is a warning');
$log->error('This is an error');
实现日志轮转
为防止日志文件过大,可以添加日志轮转功能:

function rotateLogs($logFile, $maxSize = 1048576) {
if (file_exists($logFile) && filesize($logFile) >= $maxSize) {
$backupFile = $logFile . '.' . date('YmdHis');
rename($logFile, $backupFile);
}
}
// 在写入日志前调用
rotateLogs('/path/to/application.log');
错误处理与异常捕获
设置全局错误和异常处理器可以确保所有问题都被记录:
set_error_handler(function($errno, $errstr, $errfile, $errline) {
writeLog("Error [$errno] $errstr in $errfile on line $errline", 'ERROR');
return false;
});
set_exception_handler(function($exception) {
writeLog("Uncaught exception: " . $exception->getMessage(), 'CRITICAL');
});
日志级别管理
实现不同级别的日志记录可以帮助过滤重要信息:
define('LOG_LEVEL_ERROR', 1);
define('LOG_LEVEL_WARNING', 2);
define('LOG_LEVEL_INFO', 3);
define('LOG_LEVEL_DEBUG', 4);
$currentLogLevel = LOG_LEVEL_INFO;
function logMessage($message, $level) {
global $currentLogLevel;
if ($level <= $currentLogLevel) {
writeLog($message, getLevelName($level));
}
}
每种方法适用于不同场景,从简单的error_log到功能全面的Monolog库,可以根据项目需求选择合适的日志解决方案。






