supervisor系列:5、日志
文章目录
supervisord执行的主要任务之一是日志记录。
supervisord会记录一个活动日志,详细描述它在运行时所做的事情。它还将子进程stdout和stderr输出记录到其他文件(如果配置为这样做的话)。
1. 活动日志
活动日志是supervisord记录有关自身健康状况、子流程状态更改、事件产生的任何消息以及调试和信息消息的地方。活动日志的路径是通过配置文件的[supervisord]
部分中的logfile
参数配置的,默认为$CWD/supervisord.log
。如果此选项的值是特殊字符串syslog
,则活动日志将路由到syslog服务,而不是写入文件。活动日志流量示例如下所示。为了更好地适应屏幕,有些线条被打断了。
1.1 活动日志输出示例
活动日志“level”是在配置文件中通过[supervisord]
ini文件部分中的loglevel
参数配置的。设置loglevel
后,指定优先级的消息以及优先级更高的消息将被记录到活动日志中。例如,如果loglevel
为error
,则将记录error
和critical
优先级的消息。但是,如果loglevel
为warn
,则将记录warn
、error
和critical
消息。
1.2 活动日志等级
下表更详细地描述了日志级别,按最高优先级到最低优先级排序。“配置文件值”是在配置文件的[supervisord]
部分提供给loglevel
参数的字符串,“输出代码”是显示在活动日志输出行的代码。
配置文件值 | 输出编码 | 描述 |
critical | CRIT | 指示需要用户立即注意的条件、管理员状态更改或管理员本身的错误的消息。 |
error | ERRO | 指示潜在可忽略的错误条件的消息(例如,无法清除日志目录)。 |
warn | WARN | 指示异常情况(不是错误)的消息。 |
info | INFO | 正常的信息输出。如果没有显式配置日志级别,则这是默认的日志级别。 |
debug | DEBG | 对于试图调试流程配置和通信行为(流程输出、侦听器状态更改、事件通知)的用户有用的消息。 |
trace | TRAC | 对试图调试管理插件的开发人员有用的消息,以及关于HTTP和RPC请求和响应的信息。 |
blather | BLAT | 对试图调试supervisor本身的开发人员有用的消息。 |
1.3 活动日志轮换
根据配置文件[supervisord]
部分中的logfile_maxbytes
和logfile_backups
参数的组合,supervisord会对活动日志进行轮换。当活动日志达到logfile_maxbytes
字节时,当前日志文件将被移动到备份文件中,并创建一个新的活动日志文件。出现这种情况时,如果现有备份文件的数量大于或等于logfile_backups
,则删除最旧的备份文件,并对备份文件进行相应的重命名。如果正在写入的文件名为supervisord.log
,当它超过logfile_maxbytes
时,它将被关闭并改名为supervisord.log.1
,如果文件supervisord.log.1
, supervisord.log.2
等已经存在,则重命名为supervisord.log.2
, supervisord.log.3
等。如果logfile_maxbytes
为0,则永远不会转换日志文件(因此永远不会进行备份)。如果logfile_backups
为0,则不保留任何备份。
2. 子进程日志
默认情况下,会捕获supervisor生成的子进程的标准输出,以便重新显示给supervisorctl
和其他客户端用户。如果配置文件中的[program:x]
,[fcgi-program:x]
,或[eventlistener:x]
部分没有执行与日志文件相关的特定配置,则为true:
- supervisord将捕获子进程的stdout和stderr输出到临时文件中。每个流都被捕获到一个单独的文件中。这就是所谓的
AUTO
日志模式。 -
AUTO
日志文件是自动命名的,并放置在配置文件的[supervisord]
部分的childlogdir
目录下。 - 每个
AUTO
日志文件的大小由程序部分的{streamname}_logfile_maxbytes
值限定(其中{streamname}是" stdout “或” stderr ")。当它达到这个数字时,它会根据{streamname}_logfile_backups
轮换(就像活动日志一样)。
影响子进程登录[program:x]
和[fcgi-program:x]
节的配置关键词如下:
redirect_stderr
, stdout_logfile
, stdout_logfile_maxbytes
, stdout_logfile_backups
, stdout_capture_maxbytes
, stdout_syslog
, stderr_logfile
, stderr_logfile_maxbytes
, stderr_logfile_backups
, stderr_capture_maxbytes
, 和 stderr_syslog
.
[eventlistener:x]
段可能不指定redirect_stderr
、stdout_capture_maxbytes
或stderr_capture_maxbytes
,但否则它们接受相同的值。
在[supervisord]
配置文件部分影响子进程日志记录的配置关键词是:childlogdir
和nocleanup
。
2.1 捕获模式
捕获模式是Supervisor的一个高级功能。您不需要理解捕获模式,除非您希望根据从子进程输出解析的数据采取操作。
如果配置文件中的[program:x]
节定义了一个非零的stdout_capture_maxbytes
或stderr_capture_maxbytes
参数,由program部分表示的每个进程可以在其stdout或stderr流(分别)上发出特殊的令牌,这将有效地导致supervisor发出PROCESS_COMMUNICATION
事件(有关事件的描述,请参阅Events)。
进程通信协议依赖于两个标签,一个命令supervisor进入捕获模式,另一个命令退出。当进程流进入捕获模式时,发送到流的数据将被发送到内存中的一个单独的缓冲区,即捕获缓冲区,该缓冲区允许包含最大的capture_maxbytes
字节。在捕获模式中,当缓冲区的长度超过capture_maxbytes
字节时,缓冲区中最早的数据将被丢弃,以便为新数据腾出空间。当一个进程流退出捕获模式时,一个PROCESS_COMMUNICATION
事件子类型会被supervisor触发,它可能会被事件监听器拦截。
在进程流中开始“捕获模式”的标记是<!--XSUPERVISOR:BEGIN-->
。退出捕获模式的标记是<!--XSUPERVISOR:END-->
。这些标记之间的数据可以是任意的,并构成PROCESS_COMMUNICATION
事件的有效负载。例如,如果一个程序的stdout_capture_maxbytes
设置为“1MB”,它在其stdout流上发出以下内容:
在这种情况下,supervisord将发出一个PROCESS_COMMUNICATIONS_STDOUT
事件,其中包含有效负载“Hello!”中的数据。
一个(用Python编写的)会发出进程通信事件的脚本示例位于supervisor包的scripts
目录中,名为sample_comment.py
。
指定为“事件监听器”([eventlistener:x]
节)的进程的输出不会以这种方式处理。这些进程的输出不能进入捕获模式。