PHP连接MySQL的日志记录方法?

发布时间: 2025-07-11 19:13:16

# 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

← 返回首页