php代码实现日志
PHP 日志实现方法
在 PHP 中实现日志功能可以通过多种方式完成,以下是几种常见的方法:
使用内置 error_log 函数
PHP 提供了内置的 error_log 函数,可以将错误信息写入日志文件或发送到系统日志。
$message = "This is a log message";
error_log($message, 3, "/path/to/your/logfile.log");
error_log 函数的第二个参数 3 表示将消息写入文件,第三个参数指定日志文件路径。
自定义日志函数
创建一个自定义的日志函数可以更灵活地控制日志格式和行为。
function writeLog($message, $level = 'INFO') {
$logFile = '/path/to/your/logfile.log';
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[$timestamp] [$level] $message" . PHP_EOL;
file_put_contents($logFile, $logMessage, FILE_APPEND);
}
// 使用示例
writeLog('Application started', 'INFO');
writeLog('Invalid user input', 'WARNING');
使用 Monolog 库
Monolog 是 PHP 社区广泛使用的日志库,提供了丰富的日志处理功能。
安装 Monolog:
composer require monolog/monolog
基本使用示例:
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/your/logfile.log');
日志级别管理
实现不同级别的日志记录可以帮助更好地管理日志信息。
define('LOG_LEVEL_ERROR', 1);
define('LOG_LEVEL_WARNING', 2);
define('LOG_LEVEL_INFO', 3);
define('LOG_LEVEL_DEBUG', 4);
function logMessage($message, $level = LOG_LEVEL_INFO) {
$currentLevel = LOG_LEVEL_INFO; // 可以从配置中获取
if ($level > $currentLevel) {
return;
}
$levelMap = [
LOG_LEVEL_ERROR => 'ERROR',
LOG_LEVEL_WARNING => 'WARNING',
LOG_LEVEL_INFO => 'INFO',
LOG_LEVEL_DEBUG => 'DEBUG'
];
$logLevel = $levelMap[$level] ?? 'UNKNOWN';
writeLog($message, $logLevel);
}
数据库日志记录
将日志记录到数据库可以提供更灵活的查询和分析功能。
function logToDatabase($message, $level = 'INFO') {
$pdo = new PDO('mysql:host=localhost;dbname=logs', 'username', 'password');
$stmt = $pdo->prepare("INSERT INTO logs (timestamp, level, message) VALUES (NOW(), :level, :message)");
$stmt->execute([
':level' => $level,
':message' => $message
]);
}
日志格式化
自定义日志格式可以使日志更易读和解析。
function formatLogMessage($message, $level, $context = []) {
$timestamp = date('c'); // ISO 8601 格式
$contextStr = json_encode($context);
return sprintf(
"[%s] [%s] %s %s%s",
$timestamp,
strtoupper($level),
$message,
$contextStr,
PHP_EOL
);
}
异常日志记录
专门处理异常情况的日志记录。
function logException(Exception $e) {
$message = sprintf(
"Exception: %s in %s on line %d",
$e->getMessage(),
$e->getFile(),
$e->getLine()
);
writeLog($message, 'ERROR');
// 记录堆栈跟踪
writeLog("Stack trace:\n" . $e->getTraceAsString(), 'DEBUG');
}
这些方法可以根据具体需求进行组合和调整,构建适合项目需求的日志系统。对于大型项目,推荐使用 Monolog 这样的成熟日志库,它提供了处理器、格式化程序和日志级别管理等高级功能。







