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
}

参考

posted @ 2024-02-19 11:24  董少奇  阅读(205)  评论(0)    收藏  举报