System logger
slogger2 [-C dev_console_buffer_size] [-c out_buffer_size,error_buffer_size] [-D slogger2_asinfo_name[:dump_file]] [-d slogger2_asinfo_name[:dump_file]] [-g gid1,gid2,...] [-l log_save_path] [-P pps_path] [-S] [-s size] [-U string] [-v[v]...]
QNX Neutrino
Path | Buffer |
---|---|
/dev/slog2/critical | error |
/dev/slog2/error | error |
/dev/slog2/warning | out |
/dev/slog2/info | out |
/dev/slog2/debug | out |
This option creates one log file that's shared by all processes that use slogger2 APIs. Each log line is prefixed with the process ID of the client, in square brackets.
The slogger2_asinfo_name argument is the name of the address space memory region in the system page (syspage) that's been set aside for this purpose.
If the pre-reset state of the logs is determined to be intact, it's saved in /dev/shmem/dump_file. The default value of dump_file is slog2phys.
The -d option tries to use physical memory backing only if you pass the SLOG2_ALLOC_TYPE_PHYSICAL flag to slog2_register().
The -D option tries to use physical memory backing for every buffer set. To override this behavior, pass the SLOG2_ALLOC_TYPE_SHMEM flag to slog2_register().
If physical memory is depleted and can't be reclaimed from previous dead processes, then the buffer set is created as a regular shared memory object.
This is mainly intended as a debugging feature.
The default behavior of slogger2 once a client disconnects is to postpone the immediate cleanup of resources associated with the respective buffer set(s) until a later time. The present implementation relies on a queue of disconnected clients.
The slogger2 APIs filter which logs actually get appended into any of the logging buffers in the buffer set, based on the verbosity level of the buffer set and the severity level passed to the vslog2*() and slog2*() logging APIs. The requirements for this interface are:
The slogger2 manager then creates (or opens) a PPS object called pps_path/verbose. You can then change the verbosity level from the command line by typing:
echo buffer_set_name::verbosity_level >> pps_path/verbose
The verbosity_level is the numeric value corresponding to the severity levels defined in <sys/slog2.h>.
This option is intended for debug use only; if you use it, slogger2 must retain all root process abilities.
In the second form, the primary group is the one specified for user_name in /etc/passwd.
The slogger2 daemon is the central manager of a system-logging framework. Its primary goals are to:
The components of the system logger include:
The central slogger2 process manages a region of shared RAM where all slog2 buffers are located. This gives slog2 the performance benefit of writing to RAM (instead of to flash or disk) without losing logs in the case of process crashes. When a process ends, its logs remain in RAM, but slogger2 removes them when it needs to reuse that memory. However, if the power source is disconnected, any log contents in RAM will be lost.
Individual slog2 instances are allocated from this memory region by slogger2 and are provided to the client process, via slog2_register(), in the form of a shared memory file in /dev/shmem/slogger2/. The libslog2 library uses shmem_open() to access each instance.
Within each slog2 instance there may be up to four buffers defined by the client process. These buffers can be any combination of 4 KB pages. The primary intent for these buffers is to enable high-rate logging into one buffer, while preserving a longer history of low-rate logging in another.
The central slogger2 process is responsible for cleaning up the slog2 instances, including calling the shmem_unlink() function to remove the shared memory file.
Each log line is assigned one of the following severity levels (listed here in decreasing order):
The verbosity level controls which log lines are written in the slog2 buffer; if the severity level is greater than the verbosity level, the line is written in the buffer.
Filtering controls which log items are displayed to the user; the log contents aren't affected. You could filter the log by using (for example) grep, slog2info, or a custom log viewer.
You can redirect a program's standard output (stdout) and standard error (stderr) streams to slog2 buffers. The slogger2 service manages two device paths, /dev/slog2/stdout and /dev/slog2/stderr, and when a process writes to them, the service stores the bytes written, along with other information such as the process ID, in slog2 buffers.
The advantage of using this redirection feature over the -c option is that a given program's logging information can be viewed separately from that of other programs. With -c, the same buffer set contains output from all processes using slogger2.
my_program >/dev/slog2/stdout[/[buffer_set_name],stdout_page_count] 2>/dev/slog2/stderr[/[buffer_set_name],stdout_page_count[,stderr_page_count]]
my_program >/dev/slog2/stdout 2>/dev/slog2/stderr
my_program >/dev/slog2/stdout/alt_name,1,32 2>/dev/slog2/stderr/alt_name,1,32
The default behavior (if no options are provided) is equivalent to writing to /dev/slog2/stdout/7 and /dev/slog2/stderr/7,1. This is to make /dev/slog2/stdout/7 become /dev/slog2/stdout/7,1 to align with the need for the same syntax in both. In this example, 7 pages are used for stdout and 1 page for stderr.
/dev/slog2/stderr/7,1is the same as
/dev/slog2/stderr/0,0and the same as
/dev/slog2/stderr/,0
LD_PRELOAD=libslog2shim.so my_program
buffer_set_name: my_program num_buffers: 1 verbosity level: SLOG2_DEBUG num_pages: 8 buffer_name: SLOGGER_LEGACY
_SLOG_SETCODE(major, minor)Thus, the opcode is actually made up of two 16-bit values. The slogger2 process and the libslog2shim.so library drop the first (or major) value and keep only the second (or minor) value. This second value gets put in the log message.
The two-buffer setting is meaningful only if SLOG2_DEFAULT_PAGES is also nonzero.
If you don't load the shim library, any slogger messages issued by your programs are still handled by slogger2. This is because slogger2 exposes the /dev/slog device path that the legacy slogger APIs write their messages to. The slogger2 process understands the format of messages received this way, but just like when the shim library is used, it also drops the major value from the opcode and keeps only the minor value.
The advantage of using the shim library is that each log written to the logging buffer is handled locally within the process, without any message passing overhead. With the /dev/slog method, the logging buffer is maintained by slogger2 and each log written by a process is passed as a message to slogger2, which in turn appends the log to a buffer that it maintains on behalf of the client process. Almost all advantages related to logging with slogger2 are lost with the /dev/slog approach. The only advantage to this other approach is simplicity; it minimizes the effort required to get a legacy code base working, while retaining the same efficiency as slogger.