适合去重的日志是配置生成、脚本循环打印等冗余输出;单文件去重用流式处理+哈希优化防爆内存;去重压缩可直接用gzopen流式生成.gz文件;批量处理需加flock锁并按月归档。

日志文件里重复行太多?用 PHP 快速去重并压缩,不丢顺序、不爆内存、还能保留关键信息——其实很简单。
一、先判断要不要去重
不是所有日志都适合直接去重。比如:
- 带时间戳的访问日志(如 Nginx access.log):同一 URL 可能被不同用户、不同时间反复请求,重复行本身有意义,不宜简单删掉;
- 错误堆栈或调试输出:相同错误反复出现,但每次发生时间、上下文不同,建议按「错误类型 + 时间窗口」聚合,而不是逐行去重;
- 纯操作记录日志(如“用户A登录”、“用户B登出”):若大量重复操作(如心跳检测日志),且只关心“是否发生”,就可以安全去重。
✅ 真正适合全文去重的典型场景:配置生成日志、脚本循环打印的固定提示、测试环境冗余输出等。
二、单文件去重(保留首次出现顺序)
用 array_unique() 最省事,但要注意它默认不保留键名顺序 —— 实际上 PHP 7.2+ 已修复,默认就保持原始顺序。更稳妥写法:
$lines = file('app.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$unique_lines = array_values(array_unique($lines));
file_put_contents('app_clean.log', implode("\n", $unique_lines) . "\n");
⚠️ 注意:file() 会把整个文件读进内存,超大日志(>500MB)容易 OOM。这时改用流式处理:
$input = fopen('app.log', 'r');
$output = fopen('app_clean.log', 'w');
$seen = [];
while (($line = fgets($input)) !== false) {
$line = rtrim($line, "\r\n");
if ($line === '' || isset($seen[$line])) continue;
$seen[$line] = true;
fwrite($output, $line . "\n");
}
fclose($input); fclose($output);
? 小技巧:如果日志行很长但前缀固定(如 [2024-05-01 10:23:45]),可对 $line 做哈希(如 md5(substr($line, 25)))存入 $seen,节省内存。
三、去重 + 压缩一步到位(生成 .gz 文件)
PHP 内置 gzencode() 或 gzopen() 都能直接产出压缩内容。推荐用后者流式压缩,避免中间生成大文本文件:
$input = fopen('app.log', 'r');
$gzip = gzopen('app_clean.log.gz', 'w9'); // 'w9' 表示最高压缩比
$seen = [];
while (($line = fgets($input)) !== false) {
$line = rtrim($line, "\r\n");
if ($line === '' || isset($seen[$line])) continue;
$seen[$line] = true;
gzwrite($gzip, $line . "\n");
}
fclose($input); gzclose($gzip);
✅ 输出就是标准 gzip 文件,Linux 下可直接 zcat app_clean.log.gz | head -20 查看,Windows 用 7-Zip 也能解压。
四、批量处理多个日志 + 自动归档
假设每天生成 app-2024-05-01.log、app-2024-05-02.log……想统一去重压缩并移走:
$log_dir = '/var/log/myapp/';
$files = glob($log_dir . 'app-*.log');
foreach ($files as $file) {
$clean_file = str_replace('.log', '_clean.log.gz', $file);
// (复用上面的流式去重+gzip逻辑)
// ……
// 处理完后归档原文件
rename($file, $log_dir . 'archived/' . basename($file));
}
? 建议加个简单锁机制(如 flock())防止定时任务并发冲突;再配合 date('Y-m') 按月建归档目录,长期跑也清爽。
核心就三点:看清日志语义再决定去重、大文件务必流式处理、压缩直接走 gzip 流不落地。做对这三步,日志瘦身不踩坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











