设为首页 收藏本站
查看: 536|回复: 0

[经验分享] nginx日志管理之logrotate

[复制链接]

尚未签到

发表于 2018-11-8 12:29:25 | 显示全部楼层 |阅读模式
  其实已经有好长时间没有写博客,这次的博客主要强调两点:一是日志对于运维工作的重要性;
  二是如何很好的管理服务器的日志。博客主要从nginx的日志展开讲解,然后,通过logrotate工具
  对日志进行管理,避免日志太大占满磁盘空间。
  第一个部分:Nginx日志
  nginx是当前互联网中使用非常多的web服务,它能够实现负载均衡、反向代理、缓存等等功能,
  但我要是这些,并不是本篇的内容,本篇主要是介绍nginx的日志。
  日志的格式:
  语法:log_format name string....
  例子:
log_format  combined  '$remote_addr - $remote_user [$time_loca]'  ' "$request" $status $body_bytes_sent '
  ' "$http_referer" "$http_user_agent" '
log_format  proxy     '$http_x_forwarded_for - $remote_user [$time_local]'  ' "$request" $status $body_bytes_sent '
  ' "$http_referer" "$http_user_agent" '
  
  相关变量的解析:
  ---------------------------------------------------------------------
  $remote_addr,$http_x_forwarded_for:记录客户端IP地址
  ---------------------------------------------------------------------
  $remote_user:记录客户端用户名称
  ---------------------------------------------------------------------
  $request:记录请求的URL和HTTP协议
  ---------------------------------------------------------------------
  $status:记录请求状态
  ---------------------------------------------------------------------
  $body_bytes_sent:发送给客户端的字节数,不包括响应头的大小
  ---------------------------------------------------------------------
  $bytes_sent:发送给客户端的总字节数
  ---------------------------------------------------------------------
  $connection:连接的序列号
  ---------------------------------------------------------------------
  $connection_requests:当前通过一个连接获得的请求数量
  ---------------------------------------------------------------------
  $msec:日志写入时间,单位s,精度ms
  ---------------------------------------------------------------------
  $http_referer:记录从哪个页面链接访问过来的
  ---------------------------------------------------------------------
  $http_user_agent:记录客户端浏览器相关信息
  ---------------------------------------------------------------------
  $request_length:请求的长度(包括请求行,请求头和请求正文)
  ---------------------------------------------------------------------
  $request_time:请求处理时间
  ---------------------------------------------------------------------
  $time_iso8601:ISO8601标准格式下的本地时间
  ---------------------------------------------------------------------
  $time_local:通过日志格式下的本地时间
  ---------------------------------------------------------------------
  假设,此时有一个站点为www.test.com,要将访问这个站点的信息记录到log中
http {  

  
log_format  combined  '$remote_addr - $remote_user [$time_loca]'
  ' "$request" $status $body_bytes_sent '
  ' "$http_referer" "$http_user_agent" '
  

  
server {
  listen80;
  server_namewww.test.com;
  root/data/web/htdocs;
  index  index.php index.html index.htm;
  access_log/var/log/nginx/test.access.log  combined;
  error_log/var/log/nginx/test.error.log   error;
  

  location ~ \.php$ {
  root /data/web/htdocs;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
  }
  }
  
}
  上面仅是一个例子,http段中只列出了定义访问日志的部分,其他部分没有写出
  第二部分:logrotate管理日志
  logrotate是一个日志文件管理工具。用来把旧文件轮转、压缩、删除,并且创建新的日志文件。
  我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理,一般都是通过cron计划任务来完成的。
  logrotate的配置文件主要由logrotate.conf和logrotate.d下面的所有文件构成,用户将自己的配置需求写到配置文件中;然后,通过crontab来执行,执行的周期可以是daily,weekly。可以在/etc/cron.daily中进行查看
[root@bbs01 cron.daily]# ls  
logrotate  makewhatis.cron  mlocate.cron  prelink  readahead.cron  tmpwatch
  可以看到在cron.daily目录中有logrotate,主要是执行了logrotate服务
#!/bin/sh  

  
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
  
EXITVALUE=$?
  
if [ $EXITVALUE != 0 ]; then
  
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
  
fi
  
exit 0
  那我们如何知道,crontab在何时执行logrotate这个任务呢,在centos系统中,是由anacrontab自动执行的。配置中定义了每日,每周,每月执行任务的时间。
[root@bbs01 cron.daily]# vim /etc/anacrontab  
#period in days   delay in minutes   job-identifier   command
  
1       5       cron.daily              nice run-parts /etc/cron.daily
  
7       25      cron.weekly             nice run-parts /etc/cron.weekly
  
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
  以上就是logrotate整个的工作过程,那么如何配置我们的logrotate呢?
  先看一个我在线上的配置,主要是针对nginx做的。
# cat /etc/logrotate.d/nginx  
/usr/local/nginx/logs/*.log {
  
    rotate 5
  
    daily
  
    dateext
  
    postrotate
  
        /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
  
    endscript
  
    missingok
  
    compress
  
}
  格式很简单,先指定我们日志所处的位置,还能支持匹配,然后就是一些特定参数了。
  参数的解释如下:
  ---------------------------------------------------------------------
  compress:通过gzip 压缩转储旧的日志
  ---------------------------------------------------------------------
  nocompress:不需要压缩时,用这个参数
  ---------------------------------------------------------------------
  copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
  ---------------------------------------------------------------------
  nocopytruncate:备份日志文件但是不截断
  ---------------------------------------------------------------------
  create mode owner group:使用指定的文件模式创建新的日志文件
  ---------------------------------------------------------------------
  nocreate:不建立新的日志文件
  ---------------------------------------------------------------------
  delaycompress:和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
  ---------------------------------------------------------------------
  dateext  切换后的日志文件会附加上一个短横线和YYYYMMDD格式的日期,没有这个配置项会附加一个小数点加一个数字序号
  ---------------------------------------------------------------------
  nodelaycompress:覆盖 delaycompress 选项,转储同时压缩。
  ---------------------------------------------------------------------
  errors address:专储时的错误信息发送到指定的Email 地址
  ---------------------------------------------------------------------
  ifempty:即使是空文件也转储,这个是 logrotate 的缺省选项。
  ---------------------------------------------------------------------
  notifempty:如果是空文件的话,不转储
  ---------------------------------------------------------------------
  mail address:把转储的日志文件发送到指定的E-mail 地址
  ---------------------------------------------------------------------
  missingok:如果日志文件丢失,继续下一个转储,不发出错误信息
  ---------------------------------------------------------------------
  nomail:转储时不发送日志文件
  ---------------------------------------------------------------------
  olddir directory:转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  ---------------------------------------------------------------------
  noolddir:转储后的日志文件和当前日志文件放在同一个目录下
  ---------------------------------------------------------------------
  prerotate/endscript:在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
  ---------------------------------------------------------------------
  postrotate/endscript:在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
  ---------------------------------------------------------------------
  sharedscripts:所有的日志文件都轮转完毕后统一执行一次脚本
  ---------------------------------------------------------------------
  daily:指定转储周期为每天
  ---------------------------------------------------------------------
  weekly:指定转储周期为每周
  ---------------------------------------------------------------------
  monthly:指定转储周期为每月
  ---------------------------------------------------------------------
  rotate count:指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
  ---------------------------------------------------------------------

  size>  ---------------------------------------------------------------------
  prerotate/endscript
  在prerotate和endscript之间的行(他俩自己各占一行),在日志文件被轮转之前并且有需要轮转时,才会执行。
  该指令只能用于log文件定义中。
  ---------------------------------------------------------------------
  postrotate/endscript
  在prerotate和endscript之间的行,在日志文件被轮转之后执行。
  该指令只能用于log文件定义中。
  ---------------------------------------------------------------------
  firstaction/endscript
  在firstaction和endscript之间的行,在轮转所有匹配了通配符的日志被轮转之前,
  在prerotate执行之前,并且至少要有一个日志需要被轮转时,才会执行。
  只能用于log文件定义中,如果脚本错误退出,就不再继续往下进行。
  ---------------------------------------------------------------------
  lastaction/endscript
  在lastaction和endscript之间的行,在轮转了所有匹配的日志后,在postrotate执行之后,
  并且至少要有一个日志被轮转了的情况下,才会执行。
  ---------------------------------------------------------------------
  
  我们可以手动去执行logrotate立即管理日志,也可以等待crontab自动执行任务计划
  手动执行过程,可以加-f、-d参数,-f去强制执行,-d则是debug模式
  例如:logrotate -f -d /etc/logrotate.d/nginx
  使用logrotate管理nginx的日志,优点在于:
  1、不需要担心日志文件会将目录塞满,logrotate会保留特定个数文件;
  2、每天的日志放在一个文件中,不需要一直往前翻,方便查阅;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-632418-1-1.html 上篇帖子: nginx配置path_info 下篇帖子: nginx实现静态页面,图片分离
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表