svlogd(8) | System Manager's Manual | svlogd(8) |
svlogd - runit's service logging daemon
svlogd [-tttv] [-r c] [-R xyz] [-l len] [-b buflen] logs
logs consists of one or more arguments, each specifying a directory.
svlogd continuously reads log data from its standard input, optionally filters log messages, and writes the data to one or more automatically rotated logs.
Recent log files can automatically be processed by an arbitrary processor program when they are rotated, and svlogd can be told to alert selected log messages to standard error, and through udp.
svlogd runs until it sees end-of-file on standard input or is sent a TERM signal, see below.
A log directory log contains some number of old log files, and the current log file current. Old log files have a file name starting with @ followed by a precise timestamp (see the daemontools' tai64n program), indicating when current was rotated and renamed to this file.
A log directory additionally contains the lock file lock, maybe state and newstate, and optionally the file config. svlogd creates necessary files if they don't exist.
If svlogd has trouble opening a log directory, it prints a warning, and ignores this log directory. If svlogd is unable to open all log directories given at the command line, it exits with an error. This can happen on start-up or after receiving a HUP signal.
svlogd appends selected log messages to the current log file. If current has size bytes or more (or there is a new-line within the last len of size bytes), or is older than a specified amount of time, current is rotated:
svlogd closes current, changes permission of current to 0755, renames current to @timestamp.s, and starts with a new empty current. If svlogd sees num or more old log files in the log directory, it removes the oldest one. Note that this doesn't decrease the number of log files if there are already more than num log files, this must be done manually, e.g. for keeping 10 log files:
ls -1 \@* |sort |sed -ne '10,$p' |xargs rm
If svlogd is told to process recent log files, it saves current to @timestamp.u, feeds @timestamp.u through ``sh -c "processor"'' and writes the output to @timestamp.t. If the processor finishes successfully, @timestamp.t is renamed to @timestamp.s, and @timestamp.u is deleted; otherwise @timestamp.t is deleted and the processor is started again. svlogd also saves any output that the processor writes to file descriptor 5, and makes that output available on file descriptor 4 when running processor on the next log file rotation.
A processor is run in the background. If svlogd sees a previously started processor still running when trying to start a new one for the same log, it blocks until the currently running processor has finished successfully. Only the HUP signal works in that situation. Note that this may block any program feeding its log data to svlogd.
On startup, and after receiving a HUP signal, svlogd checks for each log directory log if the configuration file log/config exists, and if so, reads the file line by line and adjusts configuration for log as follows:
If the line is empty, or starts with a ``#'', it is ignored. A line of the form
If a line starts with a -, +, e, or E, svlogd matches the first len characters of each log message against pattern and acts accordingly:
Initially each line is selected to be written to log/current. Deselected log messages are discarded from log. Initially each line is deselected to be written to standard err. Log messages selected for standard error are written to standard error.
svlogd matches a log message against the string pattern as follows:
pattern is applied to the log message one character by one, starting with the first. A character not a star (``*'') and not a plus (``+'') matches itself. A plus matches the next character in pattern in the log message one or more times. A star before the end of pattern matches any string in the log message that does not include the next character in pattern. A star at the end of pattern matches any string.
Timestamps optionally added by svlogd are not considered part of the log message.
An svlogd pattern is not a regular expression. For example consider a log message like this
2005-12-18_09:13:50.97618 tcpsvd: info: pid 1977 from 10.4.1.14
The following pattern doesn't match
-*pid*
because the first star matches up to the first p in tcpsvd, and then the match fails because i is not s. To match this log message, you can use a pattern like this instead
-*: *: pid *
If svlogd is sent a HUP signal, it closes and reopens all logs, and updates their configuration according to log/config. If svlogd has trouble opening a log directory, it prints a warning, and discards this log directory. If svlogd is unable to open all log directories given at the command line, it exits with an error.
If svlogd is sent a TERM signal, or if it sees end-of-file on standard input, it stops reading standard input, processes the data in the buffer, waits for all processor subprocesses to finish if any, and exits 0 as soon as possible.
If svlogd is sent an ALRM signal, it forces log file rotation for all logs with a non empty current log file.
sv(8), runsv(8), chpst(8), runit(8), runit-init(8), runsvdir(8), runsvchdir(8)
http://smarden.org/runit/
Gerrit Pape <pape@smarden.org>