# PHP连接MySQL的日志记录方法详解
在PHP应用中,与MySQL数据库的交互是核心功能之一。为了确保系统的稳定性和便于故障排查,记录MySQL连接和操作日志显得尤为重要。本文将详细介绍几种PHP连接MySQL时的日志记录方法。
## 1. 使用PHP内置错误日志
最简单的方法是利用PHP的错误日志功能记录MySQL连接问题:
```php
<?php
// 配置错误日志
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_mysql_errors.log');
// 尝试连接MySQL
$conn = new mysqli('localhost', 'username', 'password', 'database');
// 检查连接错误
if ($conn->connect_error) {
error_log("MySQL连接失败: " . $conn->connect_error);
die("连接失败: " . $conn->connect_error);
}
// 记录查询日志
function logQuery($query, $startTime) {
$duration = microtime(true) - $startTime;
error_log(sprintf("查询执行: %s (耗时: %.4f秒)", $query, $duration));
}
$startTime = microtime(true);
$result = $conn->query("SELECT * FROM users");
logQuery("SELECT * FROM users", $startTime);
?>
```
## 2. 使用MySQL通用查询日志
MySQL服务器本身提供了强大的日志功能,可以在MySQL配置文件中启用:
```
# my.cnf 或 my.ini 配置文件
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql-general.log
log_output = FILE
```
这种方法会记录所有发送到MySQL服务器的查询,包括连接信息,但会产生大量日志数据。
## 3. 创建自定义日志类
对于更精细的控制,可以创建专门的日志类:
```php
class MySQLLogger {
private $logFile;
public function __construct($logFile = '/var/log/mysql_operations.log') {
$this->logFile = $logFile;
}
public function logConnection($host, $user, $success, $error = '') {
$message = sprintf(
"[%s] 连接MySQL - 主机: %s, 用户: %s, 状态: %s%s",
date('Y-m-d H:i:s'),
$host,
$user,
$success ? '成功' : '失败',
$error ? ", 错误: $error" : ''
);
file_put_contents($this->logFile, $message . PHP_EOL, FILE_APPEND);
}
public function logQuery($query, $duration, $rowsAffected = 0) {
$message = sprintf(
"[%s] 查询执行 - 耗时: %.4f秒, 影响行数: %d, 查询: %s",
date('Y-m-d H:i:s'),
$duration,
$rowsAffected,
trim(preg_replace('/\s+/', ' ', $query))
);
file_put_contents($this->logFile, $message . PHP_EOL, FILE_APPEND);
}
}
// 使用示例
$logger = new MySQLLogger();
try {
$conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$logger->logConnection('localhost', 'user', true);
$startTime = microtime(true);
$stmt = $conn->query("SELECT * FROM products");
$logger->logQuery(
"SELECT * FROM products",
microtime(true) - $startTime,
$stmt->rowCount()
);
} catch (PDOException $e) {
$logger->logConnection('localhost', 'user', false, $e->getMessage());
}
```
## 4. 使用Monolog等日志库
对于大型应用,推荐使用专业的日志库如Monolog:
```php
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// 创建日志通道
$logger = new Logger('mysql');
$logger->pushHandler(new StreamHandler('/var/log/mysql_app.log', Logger::DEBUG));
try {
$pdo = new PDO('mysql:host=db;dbname=test', 'user', 'pass');
$logger->info('MySQL连接成功', [
'host' => 'db',
'user' => 'user'
]);
$start = microtime(true);
$stmt = $pdo->prepare("INSERT INTO logs (message) VALUES (:message)");
$stmt->execute([':message' => '测试日志']);
$logger->debug('查询执行完成', [
'query' => "INSERT INTO logs (message) VALUES (?)",
'params' => ['测试日志'],
'duration' => microtime(true) - $start,
'affected_rows' => $stmt->rowCount()
]);
} catch (PDOException $e) {
$logger->error('MySQL连接失败', [
'exception' => $e->getMessage(),
'host' => 'db',
'user' => 'user'
]);
}
```
## 5. 慢查询日志
除了常规日志,记录慢查询对性能优化很有帮助:
```php
// 在MySQL连接后设置慢查询阈值(秒)
$conn->query("SET SESSION long_query_time = 1");
$conn->query("SET GLOBAL slow_query_log = 'ON'");
$conn->query("SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log'");
$conn->query("SET GLOBAL log_queries_not_using_indexes = 'ON'");
```
## 最佳实践建议
1. **敏感信息处理**:避免在日志中记录完整的密码或敏感数据
2. **日志轮转**:配置日志轮转防止日志文件过大
3. **分级日志**:使用DEBUG、INFO、WARNING、ERROR等级别
4. **上下文信息**:记录足够的上下文信息便于排查问题
5. **性能考虑**:高频日志记录可能影响性能,生产环境需权衡
通过以上方法,您可以有效地记录PHP与MySQL交互过程中的各种事件,为系统维护和问题排查提供有力支持。
转载请注明出处:http://www.17can.com/articles/4516.html