slog2_register()
Register and allocate a new slog2 buffer set
Synopsis:
#include <sys/slog2.h>
int slog2_register( slog2_buffer_set_config_t *config,
slog2_buffer_t *handles,
uint32_t flags );
Arguments:
- config
- A pointer to a slog2 buffer configuration object; see below.
- handles
- An array that the function fills with opaque handles for the buffers it allocates. The number of entries must be at least the value of the num_buffers member of the config structure.
- flags
- Options for buffer management (see
flags
below).
Library:
libslog2
Use the -l slog2 option to qcc to link against this library.
Description:
The slog2_register() function registers a new instance of a slog2 buffer set. Each buffer set contains one or more buffers; specify the size of each buffer as a multiple of 4 KB pages. The maximum number of buffers is specified by SLOG2_MAX_BUFFERS.
Use slog2_reset() to unregister the buffer set.
flags
Use the flags argument to specify options for buffer management. It is a bitwise OR of zero or more of the following bits:
- SLOG2_ALLOC_TYPE_PHYSICAL
- Back buffer sets against a known range of physical memory to make it possible for them to be recovered after a warm reset. Applies only when slogger2 is started with either -d or -D.
- SLOG2_ALLOC_TYPE_SHMEM
- Don't back buffer sets against a known range of physical memory. Overrides the default behavior when slogger2 is started with either -d or -D.
- SLOG2_DISCARD_NEWLINE
- Discard newline (\n) characters.
- SLOG2_HINT_SKIP_BUFFER_0, SLOG2_HINT_SKIP_BUFFER_1, SLOG2_HINT_SKIP_BUFFER_2, SLOG2_HINT_SKIP_BUFFER_3
- A hint to ignore buffer 0 through 3, respectively, when parsing. To force the parsing of these hidden/skipped buffers, invoke slog2info with the -v option.
- SLOG2_LIMIT_RETRIES
- Limit the number of times that slogger2 retries to obtain a buffer. Use the max_retries member of the slog2_buffer_set_config_t structure to specify the limit.
- SLOG2_QUIET
- Don't emit error information on stderr for the buffer set that's being configured.
- SLOG2_TRY_REUSE_BUFFER_SET
- Before registering a new buffer set, try to find and reuse an existing buffer set in this process having an identical buffer set configuration.
slog2_buffer_config_t and slog2_buffer_set_config_t structures
The slog2_buffer_config_t structure contains the configuration data for a single slog2 buffer:
typedef struct
{
const char *buffer_name;
int num_pages;
} slog2_buffer_config_t;
The fields include:
- buffer_name
- The name you want to use for the buffer.
- num_pages
- The number of 4 KB pages this buffer contains.
Note:This is not necessarily the number of system pages because some architectures support larger page sizes (e.g., 64 KB on AArch64). So this field doesn't necessarily equate to the number of MMU-managed pages. On systems where the system page size is not 4 KB, think of this field as 4 KB
blocks
.
The slog2_buffer_set_config_t structure contains the configuration data for a slog2 buffer set. Each buffer set contains one or more buffers; the maximum number of buffers is specified by SLOG2_MAX_BUFFERS.
typedef struct
{
int num_buffers;
const char *buffer_set_name;
uint8_t verbosity_level;
slog2_buffer_config_t buffer_config[ SLOG2_MAX_BUFFERS ];
uint32_t max_retries;
} slog2_buffer_set_config_t;
- num_buffers
- The number of buffers to configure.
- buffer_set_name
- The process name, or other descriptor. We recommend that you use the name of your process for this.
- verbosity_level
- The minimum severity to log; one of:
- SLOG2_SHUTDOWN — shut down the system now (e.g., for OEM use).
- SLOG2_CRITICAL — unexpected unrecoverable error (e.g., hard disk error).
- SLOG2_ERROR — unexpected recoverable error (e.g., you need to reset a hardware controller).
- SLOG2_WARNING — expected error (e.g., parity error on a serial port).
- SLOG2_NOTICE — warning (e.g., out of paper).
- SLOG2_INFO — information (e.g., printing page 3).
- SLOG2_DEBUG1 — debug messages (e.g., normal detail).
- SLOG2_DEBUG2 — debug messages (e.g., fine detail).
All buffers in the set have the same level of verbosity.
- buffer_config
- An array of slog2_buffer_config_t structures that define the buffers.
- max_retries
- The number of times that slogger2 retries to obtain a buffer if you
specify SLOG2_LIMIT_RETRIES in the flags argument. A
value of UINT32_MAX or
(uint32_t)-1
means no limit.If the number of retries is exceeded, calls to slog2c, slog2f, slog2fa, vslog2f, and vslog2fa fail with an error of EBUSY.
Returns:
- 0
- Success.
- -1
- An error occurred (errno is set). The handle data isn't guaranteed.
Errors:
- EACCES
- Permission to create the shared memory object was denied.
- EAGAIN
- The shared memory mapping couldn't be locked in memory because of a lack of resources.
- EBADF
- The slogger2 channel no longer exists.
- EFAULT
- A fault occurred while the function was communicating with slogger2.
- EINTR
- The function was interrupted by a signal while connecting to slogger2, communicating with slogger2, or opening a shared memory object.
- EINVAL
- A parameter or a value in the configuration data structure was invalid.
- EMFILE
- All file descriptors available to the process were already open when the function was connecting to slogger2 or opening a shared memory object.
- ENAMETOOLONG
- There's a shared memory name collision, and it cannot be resolved.
- ENFILE
- One of the following occurred:
- Too many files were open in the system when the function was connecting to slogger2 or opening a shared memory object.
- The number of mapped regions reached the limit when the function was mapping shared memory.
- ENOENT
- The slogger2 file doesn't exist (slogger2 is probably not running), or the shared memory file hasn't been created.
- ENOMEM
- One of the following occurred:
- An instance of slog2 couldn't be created.
- The shared memory mapping couldn't be locked into memory because there wasn't enough memory.
- slogger2 couldn't allocate memory for itself.
- The shared memory object couldn't be resized.
- ENOSPC
- Not enough space to create the shared memory object.
- EPERM
- The process lacks permission to map the shared memory object, or slogger2 couldn't change permissions on a shared memory object.
- ESRCH
- slogger2 died while the function was waiting for a reply from it.
- ESRVRFAULT
- A fault occurred in slogger2's address space while the function was communicating with it.
Examples:
#include <stdio.h>
#include <stdlib.h>
#include <sys/slog2.h>
/* Pull in the executable name. */
extern char *__progname;
int main(int argc, char **argv)
{
slog2_buffer_set_config_t buffer_config;
slog2_buffer_t buffer_handle[2];
/* A local variable used to demonstrate the slog2fa() API call below. */
int some_number = 5108;
/* You should use the name of your process to name the buffer set. */
buffer_config.buffer_set_name = __progname;
/* These two buffers are configured below. */
buffer_config.num_buffers = 2;
/* Request an initial verbosity level. */
buffer_config.verbosity_level = SLOG2_INFO;
/* Configure the first buffer, using 7 x 4 KB pages. This larger
buffer will be used for very chatty logging. Our goal is to have
30-60 seconds of history at any given time, so we will want to
log at a rate of around one log line with a string of 16 bytes
long every 150 milliseconds.
*/
buffer_config.buffer_config[0].buffer_name = "hi_rate_logging";
buffer_config.buffer_config[0].num_pages = 7;
/* Configure the second buffer, which we will use for high-level
info logging that is very infrequent, but we want a longer history
(hours or maybe even over a day or two). This buffer uses 1 x 4 KB.
*/
buffer_config.buffer_config[1].buffer_name = "lo_rate_logging";
buffer_config.buffer_config[1].num_pages = 1;
/* Register the buffer set. */
if( -1 == slog2_register( &buffer_config, buffer_handle, 0 ) ) {
fprintf( stderr, "Error registering slogger2 buffer!\n" );
return -1;
}
/* slog2f()
- is the SLOWEST (though most convenient) of the slog2 APIs
- CANNOT be used with interrupts off because va_args handling
could use interrupts
*/
slog2f( buffer_handle[0], 0, SLOG2_INFO,
"Writing a formatted string into the buffer: %s", argv[0] );
/* slog2c()
- is the FASTEST slog2 API
- is interrupt safe
*/
slog2c( buffer_handle[0], 0, SLOG2_INFO,
"Writing a constant string into the buffer." );
/* slog2fa()
- provides a VERY FAST and INTERRUPT SAFE alternative to slog2f()
- uses special formatting macros to ensure that va_args does
NOT trigger interrupt use
*/
slog2fa( buffer_handle[0], 0, SLOG2_WARNING, "string:%s, some_number:%d",
SLOG2_FA_STRING( "Hello world" ),
SLOG2_FA_SIGNED( some_number ),
SLOG2_FA_END );
/* Write something to the 'lo rate' buffer (i.e., buffer 1). */
slog2c( buffer_handle[1], 0, SLOG2_NOTICE,
"This string will be logged." );
/* The verbosity level will prevent this from being written to the
slog2 buffer (severity > verbosity_level). */
slog2c( buffer_handle[0], 0, SLOG2_DEBUG1,
"This string should not be logged." );
return 0;
}
The example of slog2_parse_static_buffer() parses the logs produced by this program.
Classification:
Safety: | |
---|---|
Cancellation point | No |
Signal handler | Yes |
Thread | Yes |