Supervisor与Logrotate

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Supervisor与Logrotate相关的知识,希望对你有一定的参考价值。

参考技术A         在golang的gin项目中使用supervisor守护进程,用子进程配置将标准输出日志转移到指定目录下,然后使用阿里云的日志服务将标准输出日志转移到线上做一些分析和预警。

      项目上线之后一切正常,可是周日夜里三点左右阿里云的日志服务采集不到日志,一顿pv为0的告警过来,赶紧打开电脑,线上服务正常,松一口气,supervisor状态也正常,观察了一会业务数据正常就安然入睡了,心想可能是因为配置项有缺陷吧,回头好好整整supervisor的配置再观察一波。

       早上起来打开服务器,cd /var/log/supervisor/,发现存在两个日志文件,分别是xxxx.log-20201223和xxxx.log,xxxx.log的大小为0,xxxx.log-20201223还在继续写入请求日志,权限问题?chmod 777之后发现新的文件还是不写入日志,重启 supervisor之后发现日志能正常写入了。。。一开始怀疑是supervisor日志切割备份有问题,将配置stdout日志文件大小的stdout_logfile_maxbytes配置项,默认 50MB改成0,代表无限大,stdout日志文件备份数的stdout_logfile_backups配置项,默认10改为0,代表不备份,重启supervisor,心想不切割总不会再出现切割之后不往新文件写内容的问题了,真乃明智之选。:)

        一周过去,0pv的告警如期而至,虽然不影响线上业务,如鲠在喉让我久久不能释怀。全网翻,百度谷歌,中文英文,去github上翻issue等等,看到一个历史issue1090,Better support for logrotate,感觉和日志转储相关,于是查了下logrotate相关资料,logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。centos系统默认安装,于是找到对应的配置文件,果不其然里面就有supervisor,默认配置如下:

/var/log/supervisor/*.log

      missingok

      weekly

      notifempty

      nocompress

,看到weekly感觉离这个问题的答案不远了,于是去查找linux的logrotate往旧文件写入的问题,在一篇logrotate writing to old app.log.1 instead of app.log的文章中找到需要配置参数copytruncate,是用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。增加完配置之后,为了快速验证结果,修改weekly为daily,第二天日志正常切割了,新的文件也正常写入了标准日志。至此问题解决。

        linux的logrotate对于运维来说可能是常识,作为开发刚接触运维,只能慢慢积累了,工作之余看看相关的运维知识,尽量少采坑。

Supervisor的安装与使用入门

Supervisor是一个进程管理工具,官方的说法

用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断。当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了Supervisor

这个工具主要就两个命令:

supervisord : supervisor的服务器端部分,启动supervisor就是运行这个命令

supervisorctl:启动supervisor的命令行窗口。

安装(Centos):

yum install python-setuptools -y
easy_install supervisor
#如果easy_install不好使就从官方下载:
#然后通过python安装:
tar zxf supervisor-3.1.3.tar.gz
cd supervisor
python setup.py install

 

成功安装后可以登陆python控制台输入import supervisor 查看是否能成功加载。

生成配置文件(supervisord.conf):

echo_supervisord_conf > /etc/supervisord.conf

 

修改配置文件:

在supervisord.conf最后增加(分号后边的表示注释,可以不写):

[program:bandwidth]
command=python26 /usr/local/bin/bandwidth.sh  ;需要执行的命令wd)
user =root  ;(default  is  current  user , required  if  root)
autostart=true  ;start at supervisord start (default: true)
autorestart=true  ;whether/when to restart (default: unexpected)
startsecs=3  ;number of secs prog must stay running ( def . 1)
stderr_logfile=/tmp/bandwidth_err.log  ;redirect proc stderr to stdout (default false) 错误输出重定向
stdout_logfile=/tmp/bandwidth.log  ;stdout log path, NONE  for  none; default AUTO, log输出
#(更多配置说明请参考:http://supervisord.org/configuration.html)

 

运行命令:

#启动supervisor
supervisorctl //打开命令行
[root @iZ2365j7l5bZ  bin]# supervisorctl status  
bandwidth                        RUNNING   pid  2423 , uptime  0 : 06 : 35  
[root @iZ2365j7l5bZ  bin]# supervisorctl help  
   
default  commands (type help <topic>):  
=====================================  
add    clear  fg        open  quit    remove  restart   start   stop  update   
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version 
ctl中: help //查看命令
ctl中: status //查看状态

 

另外有一个坑需要注意:如果修改了 /etc/supervisord.conf ,需要执行 supervisorctl reload 来重新加载配置文件,否则不会生效。。

以上是关于Supervisor与Logrotate的主要内容,如果未能解决你的问题,请参考以下文章

supervisor介绍与使用

ubuntu16.04中supervisor安装与使用(转载)

【转】daemon、supervisor 与php

Supervisor的作用与配置

supervisor安装与问题

Supervisor 的配置与使用