Logrotate日志相关

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}'