logrotate 日志相关的交接
Author: fupeng.li
Date: 2020-05-11
关键词:日志 logrotate
脚本位置
对于服务而言:/var/vanguard/logrotate.conf
对于任务而言:/opt/tasklet/*
所有服务都有 logrotate, 但是有些任务是没有的
现状
当前大部分的EC2日志是没有实时上报给 S3 的,而是直接存储到本地机器上,但是日志的大小是在不断增加的,为了防止日志撑爆搞挂服务器,因此需要进行日志的轮替工作
logrotate 部署脚本
ansible 脚本, 用脚本讲解
#对应的脚本内容
- name: Deploy logrotate config
copy:
src: logrotate.conf
dest: "{{ APP_DIR }}/logrotate.conf"
owner: root
group: root
mode: 0644
- name: Schedule logrotate to run every 2 minutes
cron:
name: "Run logrotate"
minute: "*/2"
job: "/usr/sbin/logrotate {{ APP_DIR }}/logrotate.conf"
logrotate 内容
以 060 为例
/mnt/log/vanguard/app.log /mnt/log/vanguard/task/event.log{
size 1G
missingok # 如果日志丢失,不报错继续rotate下一个日志
rotate 20 # 转储的个数
# dateext 日志文件切割时添加日期后缀
compress # 通过gzip 压缩转储以后的日志
delaycompress # 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
# nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
# ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty # 如果是空文件的话,不转储
create 644 root root # 转储的文件的属性
# create 模式,默认模式,将旧的日志轮替掉,新的日志是新建的文件,改变了原有的 iNode 编号,需要服务支持重新打开并读写这个日志文件
# copytruncate 用于还在打开中的日志文件,把当前日志备份并截断,不改变他的 iNode编号,因此不用重新打开日志
# nocopytruncate 备份日志文件但是不截断原有的日志文件,会令原有的日志文件与日俱增,每天都在增加
sharedscripts # 运行 postrotate 脚本,作用是在所有日志都 rotate 后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本(对于要 rotate 多个日志文件的时候使用)
# prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
# postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate
ps -aux | grep vanguard | grep -v 'grep' | awk '{print $2}' | xargs sudo kill -s SIGUSR2
endscript
}
ps -aux | grep vanguard | grep -v 'grep' | awk '{print $2}' | xargs sudo kill -s SIGUSR2
这个命令涉及到代码里的内容,对着代码讲解,主要涉及到 log 模块和开的监听协程
注意事项
如果 logrotate 不工作了,或者出现问题,排查时使用如下命令即可
sudo /usr/sbin/logrotate -v -f -d /var/vanguard/logrotate.conf
多了个-d参数代表只执行预演调试而不实际执行 rotate 操作
其他日志处理脚本
查看日志里哪个错误出现的频率最高
#!/bin/bash
sed -n '/Err\ -\ code:\ /p' app.log | awk -F 'Err - code:' '{print $2}' | awk -F ',' '{print $1}' | sort | uniq -c| sort -r -n
带请求路径的错误码以及对应的频率
sed -n '/Err\ -\ code:\ /p' app.log | awk -F ',' '{print $4,$3}' | awk '{print $4,$5}' | sort | uniq -c | sort -r
统计 IP 的数量
sed -n '/##XFF##/p' app.log | awk -F ' ##XFF## ' '{print $2}' | awk -F '"' '{print $1}' | sort | uniq -c | sort -r -n
统计返回值以及对应的数量
sed '/END REQUEST:/p' app.log | awk -F 'END REQUEST: ' '{print $2}' | awk '{print $1}' | awk -F '{' '{print $2}' | sort | uniq -c | sort -r -n
统计每个人对应的返回值和数量,展示错误码以及对应的用户和数量
sed -n '/END REQUEST:/p' app.log | awk -F '"M":"' '{print $2}' | awk -F 'END REQUEST:' '{print $1,$NF}' | awk -F '{' '{print $1,$2}' | awk '{print $1,$2}' | sed -n '/UU/p' | awk -F '/' '{print $1, $NF}' | awk '{print $NF,$1}' | sort | uniq -c | sort -r -n | awk '$2 > 0 {print $0}'