27000个日志文件用GoAccess批量解析时遇参数列表过长错误求助
解决GoAccess解析大量日志文件时参数列表过长的问题
方法1:用find + xargs 分批传递文件
bash对命令行参数列表的长度有系统限制,直接用*.log通配符匹配27000个文件会触发"Argument list too long"错误。通过find遍历目标目录下的日志文件,再用xargs自动拆分参数列表,分批传递给GoAccess:
find /home/goaccess/part/2 -name "*.log" -type f -print0 | xargs -0 goaccess --log-format='%^ %dT%t.%^ %v %h:%^ %^ %^ %T %^ %s %^ %^ %b "%r" "%u" %k %K %^' -o /var/www/html/index.html --date-format=%Y-%m-%d --time-format=%T
-print0和-0参数用于兼容包含空格、特殊字符的文件名,避免出现解析错误。
方法2:通过标准输入传递日志内容
如果日志文件总大小在内存可承受范围内,可以直接将所有日志内容拼接后,通过标准输入传给GoAccess(命令末尾的-表示从标准输入读取数据):
cat /home/goaccess/part/2/*.log | goaccess --log-format='%^ %dT%t.%^ %v %h:%^ %^ %^ %T %^ %s %^ %^ %b "%r" "%u" %k %K %^' -o /var/www/html/index.html --date-format=%Y-%m-%d --time-format=%T -
应急临时方案:修改系统参数限制
可以临时增大bash的参数列表限制,但该设置重启后会失效,且可能影响其他程序运行,仅作为应急选择:
ulimit -s unlimited
执行上述命令后,再重新运行你的GoAccess解析命令即可。
内容的提问来源于stack exchange,提问作者Shubham Sable
相关产品推荐
相关产品推荐

