php实现日志
PHP 实现日志功能的方法
使用内置函数 error_log()
PHP 提供了 error_log() 函数,可以直接将日志写入文件或系统日志中。error_log("Error message", 3, "/path/to/error.log");
参数说明:第一个参数是日志内容,第二个参数 3 表示写入文件,第三个参数是文件路径。
使用 Monolog 库
Monolog 是 PHP 社区广泛使用的日志库,支持多种日志处理器和格式化方式。
安装 Monolog:composer require monolog/monolog
基本使用示例:
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 message');
自定义日志类
可以创建一个简单的日志类来管理日志文件:
class Logger {
private $filePath;
public function __construct($filePath) {
$this->filePath = $filePath;
}
public function log($message) {
$time = date('Y-m-d H:i:s');
$logMessage = "[$time] $message" . PHP_EOL;
file_put_contents($this->filePath, $logMessage, FILE_APPEND);
}
}
$logger = new Logger('/path/to/logfile.log');
$logger->log('This is a test message');
日志级别管理
在生产环境中,应该实现日志级别管理:
define('LOG_LEVEL_ERROR', 1);
define('LOG_LEVEL_WARNING', 2);
define('LOG_LEVEL_INFO', 3);
function write_log($message, $level = LOG_LEVEL_INFO) {
$levels = [
LOG_LEVEL_ERROR => 'ERROR',
LOG_LEVEL_WARNING => 'WARNING',
LOG_LEVEL_INFO => 'INFO'
];
$logEntry = date('Y-m-d H:i:s') . " [{$levels[$level]}] $message" . PHP_EOL;
file_put_contents('/var/log/app.log', $logEntry, FILE_APPEND);
}
日志轮转
为避免日志文件过大,可以实现简单的日志轮转:
function rotate_logs($filePath, $maxSize = 1048576) {
if (file_exists($filePath) && filesize($filePath) >= $maxSize) {
$backupPath = $filePath . '.' . date('YmdHis');
rename($filePath, $backupPath);
}
}
// 在写入日志前调用
rotate_logs('/path/to/logfile.log');
数据库日志
可以将日志存储在数据库中便于查询和分析:
function log_to_db($message, $level = 'INFO') {
$pdo = new PDO('mysql:host=localhost;dbname=logs', 'username', 'password');
$stmt = $pdo->prepare("INSERT INTO log_entries (timestamp, level, message) VALUES (NOW(), ?, ?)");
$stmt->execute([$level, $message]);
}
注意事项
日志文件应放在 Web 根目录之外,防止直接访问
为日志文件设置适当的文件权限
定期清理旧日志文件,避免占用过多磁盘空间
敏感信息不应记录在日志中
生产环境应考虑使用专业的日志管理系统如 ELK Stack







