阅读量:3
Ubuntu上 ThinkPHP 日志管理实用技巧
一 基础配置与目录规范
- 将日志统一写入项目目录的 runtime/logs,避免与系统日志混淆,便于备份与权限隔离。
- 按环境区分日志级别:开发环境可开启更详细的 debug/sql,生产环境仅保留 info/notice/warning/error 等必要级别。
- 为便于检索与分析,建议开启单行 JSON 格式记录(新版支持)。
- 示例(适配 TP5/6 常见结构):
// config/log.php
return [
'default' => env('log.channel', 'file'),
'level' => env('APP_DEBUG') ? 'debug' : 'info',
'type' => 'File',
'path' => runtime_path('logs'),
'json' => true, // 单行 JSON,便于采集
'max_files' => 30, // 保留最近30个文件(自动清理)
];
说明:ThinkPHP 自 5.1.6 起支持按文件数量自动清理(max_files),自 5.1.15 起支持 JSON 格式日志。
二 分级存储与保留策略
- 建议采用“分级通道”将常规、错误、紧急日志分离,分别设置不同的保留周期与分割策略,既便于排障又利于成本控制。
- 参考配置(可按项目实际调整):
// config/log.php
return [
'default' => 'stack',
'channels' => [
'stack' => [
'type' => 'stack',
'channels' => ['daily', 'error_file', 'emergency'],
],
'daily' => [
'type' => 'file',
'path' => runtime_path('logs/daily'),
'level' => ['info','notice','warning'],
'max_files' => 30, // 保留30天
'file_size' => 10485760, // 10MB 分割
'json' => false,
],
'error_file' => [
'type' => 'file',
'path' => runtime_path('logs/error'),
'level' => ['error','critical'],
'max_files' => 90, // 保留90天
'apart_level' => true, // 每个级别单独文件
'file_size' => 20971520, // 20MB 分割
'json' => true, // JSON 便于分析
],
'emergency' => [
'type' => 'file',
'path' => runtime_path('logs/emergency'),
'level' => ['emergency'],
'max_files' => 365, // 保留1年
],
],
];
要点:常规日志按天/大小滚动并保留较短周期;错误日志保留更久;紧急日志长期留存。
三 系统级日志轮转与清理
- 使用 logrotate 管理 ThinkPHP 日志目录,获得更稳健的按日轮转、压缩与保留策略,避免单文件过大与磁盘被占满。
- 创建配置文件 /etc/logrotate.dphp:
/path/to/project/runtime/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 www-data www-data
sharedscripts
postrotate
# 如需要,可在此触发应用内刷新句柄(可选)
endscript
}
- 说明:上述策略为“每日轮转、保留 30 天、压缩旧日志、按 www-data 创建新文件”。可按目录层级与保留需求调整。
- 如需清理超过 N 天的日志文件,也可使用 crontab + find 的兜底方案(示例保留 10 天):
# 每30分钟清理一次10天前的日志
*/30 * * * * find /path/to/project/runtime/logs -mtime +10 -name "*.log" -delete
提示:优先使用 logrotate;find 方案适合作为应急或特定目录的补充。
四 安全与合规要点
- 避免在生产环境输出敏感信息(如 password、token、credit_card 等)。可在日志格式化或写入前对上下文进行过滤;若使用数据库日志,可在驱动层忽略敏感字段。
- 示例(字段过滤思路):
$context = array_filter($context, function($key) {
return !in_array($key, ['password','token','credit_card']);
}, ARRAY_FILTER_USE_KEY);
- 建议错误日志采用 JSON 格式,便于与 ELK/Graylog 等日志平台对接与检索。
- 生产环境关闭 APP_DEBUG,仅保留必要级别的日志,减少性能开销与信息泄露风险。
五 集中化与扩展采集
- 引入 Monolog 或自定义驱动,将 error/emergency 级别日志同步到外部日志服务或消息通道,实现集中化存储与告警。
- 示例(Monolog 写入文件并滚动):
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\LineFormatter;
$logger = new Logger('app');
$handler = new RotatingFileHandler('/path/to/project/runtime/logs/app.log', 30, Logger::DEBUG);
$formatter = new LineFormatter("[%datetime%] [%channel%.%level_name%] %message% %context% %extra%\n", 'Y-m-d H:i:s', true, true);
$handler->setFormatter($formatter);
$logger->pushHandler($handler);
$logger->error('Something went wrong', ['uid'=>123]);
- 如需大规模检索与可视化,可将日志接入 ELK Stack(Elasticsearch/Logstash/Kibana) 或 Graylog。
以上就是关于“ubuntu上thinkphp日志管理技巧有哪些”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm