ThinkPHP日志管理指南(Debian服务器版)
ThinkPHP的日志配置主要通过配置文件实现,支持动态调整日志行为。
application/config.php(部分版本可能为config/log.php),需修改log节点参数。type:日志存储类型,推荐使用File(文件存储),也可选database(数据库)、syslog(系统日志);path:日志存储路径,默认为runtime/log/(相对于项目根目录),可自定义(如/var/log/thinkphp/);level:日志级别,支持DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)、FATAL(致命),生产环境建议设为ERROR以减少日志量;max_file:保留的日志文件数量(如30表示保留最近30个文件);day:是否按天分割日志(true表示开启,日志文件以日期命名,如20251103.log)。config.php中):'log' => [
'type' => 'File',
'path' => runtime_path() . 'log',
'level' => ['error'],
'max_file' => 30,
'day' => true,
],
ThinkPHP的日志默认存储在runtime/log/目录下,文件名格式为日期_日志类型.log(如20251103_systemErr.log)。可通过以下命令查看:
# 查看最新日志(按时间排序)
tail -f /path/to/project/runtime/log/20251103.log
# 查看特定类型日志(如错误日志)
cat /path/to/project/runtime/log/systemErr.log
通过php think log命令快速检索日志内容,支持按级别、关键词过滤:
# 查看所有日志
php think log:list
# 查看ERROR级别日志
php think log:read --level=error
# 搜索包含"SQL"关键词的日志
php think log:search "SQL"
直接删除runtime/log/目录下不需要的日志文件(如旧日志):
# 删除7天前的日志文件
find /path/to/project/runtime/log/ -type f -name "*.log" -mtime +7 -exec rm -f {} \;
# 删除所有ERROR级别日志
rm -f /path/to/project/runtime/log/systemErr.log
通过cron定时任务自动清理过期日志,避免磁盘空间占用。
crontab -e
0 2 * * * find /path/to/project/runtime/log/ -type f -name "*.log" -mtime +7 -exec rm -f {} \;
systemctl restart cron
日志轮转可将单个日志文件分割为多个小文件,保留指定数量的历史日志。
Logrotate是Linux系统自带的日志轮转工具,需创建自定义配置文件:
sudo vim /etc/logrotate.d/thinkphp
/path/to/project/runtime/log/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
dateext
dateformat -%Y%m%d
}
daily:每天轮转一次;rotate 30:保留30个历史日志文件;compress:压缩旧日志(如20251103.log.gz);copytruncate:复制原日志文件后清空,避免日志丢失(适用于正在写入的日志文件);dateext:使用日期作为轮转后文件的后缀(如20251103.log-20251103.gz)。sudo logrotate -vf /etc/logrotate.d/thinkphp
若不想使用Logrotate,可编写Shell脚本实现轮转:
sudo vim /usr/local/bin/thinkphp_log_rotate.sh
#!/bin/bash
LOG_DIR="/path/to/project/runtime/log"
DATE=$(date +%Y%m%d)
# 备份并压缩日志
find $LOG_DIR -type f -name "*.log" -exec gzip {} \;
# 删除7天前的压缩日志
find $LOG_DIR -type f -name "*.gz" -mtime +7 -exec rm -f {} \;
chmod +x /usr/local/bin/thinkphp_log_rotate.sh
echo "0 2 * * * /usr/local/bin/thinkphp_log_rotate.sh" | sudo tee -a /etc/crontab
确保runtime/log/目录可写,避免日志无法记录:
# 设置目录权限(755:所有者可读写执行,其他用户可读执行)
chmod 755 /path/to/project/runtime/log/
# 设置目录所属用户组(如Web服务器用户为www-data)
chown -R www-data:www-data /path/to/project/runtime/log/
通过Log门面手动记录不同级别的日志,便于调试和跟踪:
use think\facade\Log;
// 记录INFO级别日志(带上下文数据)
Log::info('用户登录成功', ['user_id' => 123, 'ip' => '192.168.1.1']);
// 记录ERROR级别日志(带异常信息)
try {
// 业务代码
} catch (\Exception $e) {
Log::error('订单创建失败', ['exception' => $e->getMessage()]);
}
生产环境中无需记录所有SQL语句,可通过配置关闭:
// 关闭SQL日志
'log' => [
'type' => 'File',
'path' => runtime_path() . 'log',
'level' => ['error'], // 不包含SQL日志
],
// 或单独关闭SQL日志
'sql' => [
'type' => 'File',
'level' => [], // 不记录SQL日志
],