filebeat处理nginx日志分割问题
简介
正确配置logrotate切割nginx日志的方式,保证filebeat能正确读取nginx日志。
原理
logrotate切割原理
logrotate切割日志的主要方式有:
- copytruncate:拷贝日志文件内容到新的文件,然后截断原日志文件,类似执行了cp和truncate;这种方式不影响nginx读写日志文件;问题是filebeat会记录文件读取的偏移,truncate之后filebeat不会读取新的日志,不建议使用这种方式;
- create:重命名原日志文件为新的名称(文件名变了,但是inode不变),创建原日志文件同名的文件(新的inode),类似执行了mv和touch;这种方式需要重载(reload)nginx,进程才会继续写新建的日志文件;filebeat建议使用该方式切割日志,因为这样就不会有重复日志或者日志丢失。
- copy: 拷贝原日志文件内容到新的日志文件,这样会导致原日志文件越来越大,使用场景很少。
filebeat工作原理
- filebeat是通过inode来区分文件的,所以重命名日志文件后,filebeat也能正确处理日志文件的读取。
- 新建的文件的inode也是新的,所以filebeat能正常处理新建的文件。
- filebeat记录读取的日志文件偏移的文件为/var/lib/filebeat/registry/filebeat/log.json,清空该文件会导致filebeat重新读取日志文件。
logrotate配置
#/etc/logrotate.d/nginx
/usr/local/nginx/logs/access.log {
daily
dateext
missingok
rotate 7
notifempty
create 0640 nginx nginx
postrotate
/usr/local/nginx/sbin/nginx -s reload
endscript
}

浙公网安备 33010602011771号