Skip to main content

记录

supervisord 执行的主要任务之一是日志记录。 supervisord 记录一个活动日志,详细说明它运行时的操作。它还将子进程stdout和stderr输出记录到其他文件(如果配置为这样)。

活动日志

活动日志是 supervisord 记录有关其自身健康,其子进程状态更改,任何由事件导致的消息以及调试和信息性消息的消息的位置。活动日志的路径通过配置文件的 [supervisord] 部分中的 logfile 参数配置,默认为 $CWD/supervisord.log。示例活动日志流量显示在下面的示例中。有些线条被破坏,更适合屏幕。

示例活动日志输出

2007-09-08 14:43:22,886 DEBG 127.0.0.1:Medusa (V1.11) started at Sat Sep  8 14:43:22 2007
        Hostname: kingfish
        Port:9001
2007-09-08 14:43:22,961 INFO RPC interface 'supervisor' initialized
2007-09-08 14:43:22,961 CRIT Running without any HTTP authentication checking
2007-09-08 14:43:22,962 INFO supervisord started with pid 27347
2007-09-08 14:43:23,965 INFO spawned: 'listener_00' with pid 27349
2007-09-08 14:43:23,970 INFO spawned: 'eventgen' with pid 27350
2007-09-08 14:43:23,990 INFO spawned: 'grower' with pid 27351
2007-09-08 14:43:24,059 DEBG 'listener_00' stderr output:
 /Users/chrism/projects/supervisor/supervisor2/dev-sandbox/bin/python:
 can't open file '/Users/chrism/projects/supervisor/supervisor2/src/supervisor/scripts/osx_eventgen_listener.py':
 [Errno 2] No such file or directory
2007-09-08 14:43:24,060 DEBG fd 7 closed, stopped monitoring <PEventListenerDispatcher at 19910168 for
 <Subprocess at 18892960 with name listener_00 in state STARTING> (stdout)>
2007-09-08 14:43:24,060 INFO exited: listener_00 (exit status 2; not expected)
2007-09-08 14:43:24,061 DEBG received SIGCHLD indicating a child quit

活动日志“级别”在配置文件中通过 [supervisord] ini文件部分中的 loglevel 参数进行配置。设置 loglevel 时,指定优先级的消息以及具有任何较高优先级的消息将记录到活动日志中。例如,如果 loglevelerror,则将记录 errorcritical 优先级的消息。但是,如果loglevel是 warn,则将记录 warnerrorcritical 的消息。

活动日志级别

下表更详细地描述了日志记录级别,以最高优先级到最低优先级排序。 “配置文件值”是提供给配置文件的 [supervisord] 部分中的 loglevel 参数的字符串,“输出代码”是活动日志输出行中显示的代码。

配置文件值

输出代码

描述

危急

CRIT

指示需要立即引起用户注意的状态的消息,supervisor状态更改或supervisor本身中的错误。

错误

ERRO

表示潜在可忽略的错误情况的邮件(例如,无法清除日志目录)。

警告

警告

指示异常情况的消息,不是错误。

信息

信息

正常信息输出。如果没有显式配置,这是默认日志级别。

调试

DEBG

对试图调试进程配置和通信行为(进程输出,监听程序状态更改,事件通知)的用户有用的消息。

跟踪

TRAC

对于试图调试管理程序插件的开发人员有用的消息,以及有关HTTP和RPC请求和响应的信息。

废话

BLAT

消息对开发人员试图调试管理程序本身有用。

活动日志轮播

活动日志由 supervisord 基于配置文件的 [supervisord] 部分中的 logfile_maxbyteslogfile_backups 参数的组合来“旋转”。当活动日志达到 logfile_maxbytes 字节时,当前日志文件将移动到备份文件,并创建一个新的活动日志文件。发生这种情况时,如果现有备份文件的数量大于或等于 logfile_backups,则会删除最旧的备份文件,并相应地重命名备份文件。如果被写入的文件被命名为 supervisord.log,当它超过 logfile_maxbytes 时,它被关闭并重命名为 supervisord.log.1,并且如果存在文件 supervisord.log.1supervisord.log.2 等,则它们分别被重命名为 supervisord.log.2supervisord.log.3 等。如果 logfile_maxbytes 为0,则日志文件永远不会旋转(因此不会进行备份)。如果 logfile_backups 为0,则不保留备份。

子进程日志

缺省情况下,捕获由supervisor生成的子进程的stdout,以便重新显示给 supervisorctl 和其他客户端的用户。如果在配置文件中的 [program:x][fcgi-program:x][eventlistener:x] 部分中未执行特定的与日志文件相关的配置,则会出现以下情况:

  • supervisord 将捕获子进程的stdout和stderr输出到临时文件。每个流都捕获到一个单独的文件。这称为 AUTO 日志模式。

  • AUTO 日志文件将自动命名,并放置在配置为配置文件的 [supervisord] 部分的 childlogdir 的目录中。

  • 每个 AUTO 日志文件的大小由程序段(其中{streamname}是“stdout”或“stderr”)的 {streamname}_logfile_maxbytes 值限定。当它到达那个数字,它被旋转(像活动日志),基于 {streamname}_logfile_backups

[program:x][fcgi-program:x] 部分中影响子进程日志记录的配置键如下:

redirect_stderrstdout_logfilestdout_logfile_maxbytesstdout_logfile_backupsstdout_capture_maxbytesstderr_logfilestderr_logfile_maxbytesstderr_logfile_backupsstderr_capture_maxbytes

可以将 stdout_logfilestderr_logfile 设置为特殊字符串“syslog”。在这种情况下,日志将路由到syslog服务,而不是保存到文件。

[eventlistener:x] 段可以不指定 redirect_stderrstdout_capture_maxbytesstderr_capture_maxbytes,否则它们接受相同的值。

影响 [supervisord] 配置文件部分中的子进程日志记录的配置键包括:childlogdirnocleanup

捕获模式

捕获模式是Supervisor的高级功能。您不需要了解捕获模式,除非您希望根据从子进程输出解析的数据执行操作。

如果配置文件中的 [program:x] 段定义了非零 stdout_capture_maxbytesstderr_capture_maxbytes 参数,则由程序段表示的每个进程可以分别在其stdout或stderr流上发出特殊的令牌,这将有效地导致管理程序发出 PROCESS_COMMUNICATION 事件(见 事件 的事件描述)。

过程通信协议依赖于两个标签,一个命令管理程序进入流的“捕获模式”,另一个命令它退出。当进程流进入“捕获模式”时,发送到流的数据将被发送到存储器中的单独缓冲器“捕获缓冲器”,其允许包含最大 capture_maxbytes 字节。在捕获模式期间,当缓冲区的长度超过 capture_maxbytes 字节时,缓冲区中最早的数据将被丢弃,为新数据腾出空间。当进程流退出捕获模式时,管理程序发出 PROCESS_COMMUNICATION 事件子类型,可以由事件监听器拦截。

在过程流中开始“捕获模式”的标签是 <!--XSUPERVISOR:BEGIN-->。退出捕获模式的标签为 <!--XSUPERVISOR:END-->。这些标签之间的数据可以是任意的,并且形成 PROCESS_COMMUNICATION 事件的有效载荷。例如,如果程序设置为 stdout_capture_maxbytes 为“1MB”,并且它在其stdout流上发出以下命令:

<!--XSUPERVISOR:BEGIN-->Hello!<!--XSUPERVISOR:END-->

在这种情况下,supervisord 将在“Hello!”的有效载荷中发射具有数据的 PROCESS_COMMUNICATIONS_STDOUT 事件。

发出进程通信事件的脚本(用Python编写)的示例在管理程序包的 scripts 目录中,名为 sample_commevent.py

指定为“事件侦听器”([eventlistener:x] 段)的进程的输出不以此方式处理。这些进程的输出无法进入捕获模式。