ThinkPHP的日志管理需结合框架自身配置与Ubuntu系统工具,实现日志的分类存储、轮转清理及安全管控。以下是具体操作流程:
ThinkPHP的日志配置主要通过config/log.php文件完成,支持分级存储、多通道及敏感信息过滤,确保日志结构清晰且安全。
return [
'default' => env('LOG_CHANNEL', 'stack'), // 默认使用stack通道(组合多个通道)
'channels' => [
'stack' => [
'type' => 'stack',
'channels' => ['daily', 'error_file', 'emergency'], // 组合常规、错误、紧急日志通道
],
'daily' => [ // 常规日志(按日分割)
'type' => 'file',
'path' => runtime_path('logs/daily'), // 日志存储路径(默认在runtime/logs下)
'level' => ['info', 'notice', 'warning'], // 记录info及以上级别日志
'max_files' => 30, // 保留30天日志
'file_size' => 10485760, // 单个日志文件超过10MB时分割
'json' => false, // 不使用JSON格式
],
'error_file' => [ // 错误日志(单独存储)
'type' => 'file',
'path' => runtime_path('logs/error'),
'level' => ['error', 'critical'], // 仅记录error及以上级别
'apart_level' => true, // 每个级别单独文件(如error.log、critical.log)
'max_files' => 90, // 保留90天
'file_size' => 20971520, // 20MB分割
'json' => true, // JSON格式便于后续分析
],
'emergency' => [ // 紧急日志(长期保留)
'type' => 'file',
'path' => runtime_path('logs/emergency'),
'level' => ['emergency'],
'max_files' => 365, // 保留1年
],
// 可选:数据库日志(审计需要)
'audit' => [
'type' => 'database',
'table' => 'system_logs',
'connection' => 'log_db',
'level' => ['info', 'notice'],
'ignore_fields' => ['password', 'token'], // 过滤敏感字段
],
],
];
配置说明:
file_size(10-20MB)和max_files(30-365天)控制日志体积与保留周期;password、token等敏感信息,防止泄露。Logrotate是Ubuntu系统自带的日志管理工具,可实现ThinkPHP日志的自动轮转、压缩及删除,避免日志占满磁盘。
在/etc/logrotate.d/目录下创建thinkphp配置文件:
sudo nano /etc/logrotate.d/thinkphp
添加以下内容(根据实际日志路径调整):
/var/www/html/your_project/runtime/logs/*.log { # ThinkPHP日志目录(替换为实际路径)
daily # 每天轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志(如.gz格式)
delaycompress # 延迟压缩(避免当天日志被压缩)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 www-data www-data # 新日志文件权限(属主:www-data,属组:www-data)
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
/usr/bin/systemctl reload php8.1-fpm > /dev/null 2>&1 || true # 重启PHP-FPM(根据实际版本调整)
endscript
}
参数解释:
daily:每天轮转一次;rotate 7:保留最近7天的日志;compress:压缩旧日志以节省空间;create:轮转后创建新日志文件,权限设置为640(确保Web服务器用户可写入);postrotate:轮转后重启PHP-FPM,确保日志写入新文件。-d选项模拟运行,检查配置是否正确:sudo logrotate -d /etc/logrotate.d/thinkphp
若输出无错误,则配置正确。sudo logrotate -f /etc/logrotate.d/thinkphp
除Logrotate自动清理外,还可通过手动删除或ThinkPHP配置定期清理日志。
通过rm命令删除指定日志文件(谨慎操作,避免误删):
# 删除runtime/logs目录下所有.log文件(谨慎使用)
sudo rm -f /var/www/html/your_project/runtime/logs/*.log
# 或使用truncate命令清空文件内容(保留文件,节省inode)
sudo truncate -s 0 /var/www/html/your_project/runtime/logs/*.log
在config/log.php的daily或error_file通道中添加clear_time参数,设置日志自动清理周期(单位:天):
'daily' => [
'type' => 'file',
'path' => runtime_path('logs/daily'),
'level' => ['info', 'notice', 'warning'],
'max_files' => 30,
'file_size' => 10485760,
'clear_time' => 1, // 每天清理一次(框架会自动删除过期日志)
],
注意:clear_time需配合max_files使用,确保日志不会无限增长。
ThinkPHP日志目录(runtime/logs)需设置正确的权限,避免未授权访问或写入:
# 设置runtime目录权限(属主:www-data,属组:www-data)
sudo chown -R www-data:www-data /var/www/html/your_project/runtime
# 设置logs目录权限(640:属主可读写,属组可读,其他用户无权限)
sudo chmod -R 640 /var/www/html/your_project/runtime/logs
通过以上步骤,可实现Ubuntu环境下ThinkPHP日志的分类存储、自动轮转、安全清理及权限管控,确保日志管理高效且安全。