Files
finit/doc/config/logging.md
T
Joachim Wiberg c584795202 doc: fix back-references and stale claims left by the conversion
Reference sections kept pointing at the line-based format they no longer
document.  `sysv` and `task` sent the reader to Services for "<COND>",
the cgroups chapter opened by listing three legacy directives and then
explained further down that only two of them exist here, and the logging
chapter still gave "log:prio:facility.level,tag:ident" as the full
syntax.

Some claims were wrong independent of the format:

  - a sysv is a supervised daemon, grouped with service in
    SVC_TYPE_DAEMON, not a variation on task
  - restart-max has no upper bound of 255, or any other
  - the built-in rescue fallback runs in 12345789, not 12345
  - conditional loading quotes system/10-hotplug.conf, not
    system/hotplug.conf
  - the key spells conflicts, not conflict
  - the built-in getty no longer wants TERM last, it is a key

`if` takes either a service name or, in angle brackets, a condition,
decided in svc_ifthen().  Only the examples showed this, so it is now
said.

Terminology follows the split index.md already draws: a block is the new
format, a stanza the line-based one.

src/rescue.conf was still line-based, missed because it sits in src/
rather than system/ or contrib/.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2026-07-30 15:23:35 +02:00

2.8 KiB

General Logging

Syntax: log { size = 200k count = 5 }

Log rotation for run/task/services that redirect output to a log file with their own log block. Global setting, applies to all services.

The size can be given as bytes, without a specifier, or in k, M, or G, e.g. size = 10M, or size = 3G. A value of size = 0 disables log rotation. The default is 200k.

The count value is recommended to be between 1-5, with a default 5. Setting count to 0 means the logfile will be truncated when the MAX size limit is reached.

Redirecting Output

The run, task, and service blocks take a log block of their own, redirecting stderr and stdout of the application to a file or syslog using the native logit tool. This is useful for programs that do not support syslog on their own, which is sometimes the case when running in the foreground.

An empty block means syslog with the defaults, and three keys adjust it:

Setting Description
file Write to this path instead of syslog
priority Syslog facility.level, default daemon.info
identity Syslog tag, default the basename of the command

/dev/console and /dev/null are spelled as the paths they are:

service foo { log { }                       command = "foo" }  # syslog
service foo { log { file = "/var/log/foo" } command = "foo" }  # a file
service foo { log { file = "/dev/console" } command = "foo" }  # console
service foo { log { file = "/dev/null" }    command = "foo" }  # discard

Note

A log block at file scope is a different setting -- that one is the global rotation above, and it takes only size and count.

Log rotation is controlled using the global log setting.

Example:

service ntpd {
    description = "NTP daemon"
    log {
        priority = "user.warn"
        identity = "ntpd"
    }
    command = "/sbin/ntpd pool.ntp.org"
}

Output Buffering

When using the log block, Finit redirects the service's stdout and stderr to a pipe connected to a logger process. Programs detect this as non-interactive output (i.e., isatty() returns false) and typically switch from line-buffered to fully-buffered mode.

Most well-behaved daemons explicitly flush their output or use syslog directly, so this is rarely an issue. However, if a service's log messages appear delayed or batched, you can force line-buffered output by wrapping the command with stdbuf:

service myservice {
    description = "My service"
    log { }
    command = "/usr/bin/stdbuf -oL /path/to/command"
}

The -oL option forces line-buffered output, and -o0 forces unbuffered output. See stdbuf(1) for details.

Note

Using stdbuf is rarely necessary. Only use it if you observe actual buffering issues with a specific service.