有时候,我们需要对一些程序的日志文件进行数据分析,如果是我们自己处理和分析的情况下一般是使用程序读取对应日志文件按照对应规则保存到数据库然后再进行分析。
如果我们直接到日志文件进行分析,我们没有办法记录以及分析过的。因为日志文件是随时在增加的。但是我们程序读取到和处理一次时,没有办法确定是否有新的日志追加到里面。
那么如果直接读取第一行后删除第一行后再写入文件中。这样会造成日志丢失,所以这个方法是不可行的。那么既然直接读取不可行,就想其他的办法。在日志文件中我们都有一些习惯或者对应规则按照天拆分。也就是每当一天结束后,对应那天的日志文件会按照规则新生成一个文件,而不是当前正在使用的日志文件(老司机懂,新司机请自行脑补)
根据这个思路我们就读取备份的日志文件,这样就不会在当前日志造成丢失了。但是考虑到日志分析对按照天来读取,这样数据更新太慢不好,那么就想法指定周期读取如5分钟一次,10分钟一次,30分钟一次。。。。
具体看对应业务对数据更新速度要求,这样一来我们就可以实现去用程序动态解析日志文件了。按照指定周期拆分文件,大部分程序都有自己的配置规则,根据实际程序来定,这里举例说明nginx 没有自己的拆分规则。需要借助其他工具来拆分。
在linux 中可以使用logrotate 来实现 似乎logrotate 中最小单位是天所以这里还是很推荐的一种方案,如果业务量大,一天的日志很可能上G
logrotate 不可以实现那么还是我们自己动手吧
#!/bin/bash
# 遍历目录下所有文件
function listPath(){
for file in `ls $1`
do
if [ -d $1"/"$file ]; then
listPath $1$file/
else
path=$1$file
end=${path: -4}
if [ "$end" == ".log" ]; then
dologFile $path
fi
fi
done
}
# 处理日志文件
function dologFile(){
if [ -s $1 ]; then
time=$(date +%Y%m%d-%H%M%S)
echo $1 $time
mv $1 $1-$time
fi
}
# 重新加载nginx 日志
function loadNginx(){
echo "loadNginx"
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
echo "end load"
}
# 删除过期文件
function delOverdueFile(){
find $INIT_PATH -mtime +7 -name "*.*" | xargs rm -f
}
INIT_PATH="/var/log/nginx/log/"
listPath $INIT_PATH
上面命令即可实现对应拆分方法。
这里解释一下#重新加载nginx 日志方法的作用。因为linux 中是按照文件的描述来确定文件的,所以如果我们直接mv 过去对应程序会mv 后的文件中追加,所以我们必须重新加载一次对应程序,来重新定位日志文件。
上面这个命令在部分程序里面都实现了,只需要配置好规则就行,如果没有就可以使用上面命令来实现。
这里命令写好了,就得想办法让这个命令定期执行 这里使用crontab 来实现如果没有安装这个软件请自行安装
安装好后
crontab -e
然后输入
*/5 * * * * /etc/nginx/nginxlog.sh
然后保存就好了,这里需要提醒java quartz 的老司机这里的cron 表达式是精确到分钟而是秒,所以当保存保存的时候请注意表达式书写正确没有
这里不清楚cron 表达式的可以自行脑补一下。
这样就完成日志文件安装指定周期分割了。然后就是这些程序去扫描对应文件进行分析了