.Dd $Mdocdate: November 25 2022 $ .Dt LOG 3 .Os Telodendria Project .Sh NAME .Nm Log .Nd A simple logging framework for logging to files, standard output, or the system log. .Sh SYNOPSIS .In Log.h .Ft LogConfig * .Fn LogConfigCreate "void" .Ft void .Fn LogConfigFree "LogConfig *" .Ft void .Fn LogConfigLevelSet "LogConfig *" "int" .Ft void .Fn LogConfigIndent "LogConfig *" .Ft void .Fn LogConfigUnindent "LogConfig *" .Ft void .Fn LogConfigIndentSet "LogConfig *" "size_t" .Ft void .Fn LogConfigOutputSet "LogConfig *" "FILE *" .Ft void .Fn LogConfigFlagSet "LogConfig *" "int" .Ft void .Fn LogConfigFlagClear "LogConfig *" "int" .Ft void .Fn LogConfigTimeStampFormatSet "LogConfig *" "char *" .Ft void .Fn Log "LogConfig *" "int" "const char *" "..." .Sh DESCRIPTION .Pp A heavily-modifed version of Shlog, a simple C logging library facility that allows for colorful outputs, timestamps, and custom log levels. This library differs from Shlog in that the naming conventions have been updated to be consistent with Telodendria, and system log support has been added. .Pp Shlog was originally a learning project. It worked well and produced elegant logging output, so it was chosen to be the main logging mechanism of Telodendria. The original Shlog project is now dead; Shlog lives on now only as Telodendria's logging mechanism. .Pp One of the design choices made in this library, which unfortunately makes code using it a little more verbose, is that multiple logging configurations can exist in a program. No global variables are used, and all functions are thread-safe. .Pp .Fn LogConfigCreate creates a new log configuration with sane defaults that can be used immediately. Note that every call to .Fn Log requires a valid configuration pointer. .Fn LogConfigFree frees all memory associated with that configuration, invalidating it. Passing an invalid configuration pointer into any of the functions defined here result in undefined behavior. The .Fn LogConfig*Set functions manipulate the data pointed to by the pointer returned by .Fn LogConfigCreate . .Pp .Fn LogConfigLevelSet sets the current log level on the specified log configuration. This indicates that only messages at or above this level should be logged; all other messages are silently discarded by the .Fn Log function. The passed log level should be one of the log levels defined by .Xr syslog 3 . Refer to that page for a complete list of acceptable log levels, and note that passing in an invalid or unknown log level will result in undefined behavior. .Pp .Fn LogConfigIndent causes the output of .Fn Log to be indented two more spaces than it was previously. This can be helpful when generating stack traces, or otherwise producing hierarchical output. After calling this function, all future messages using the given config will be indented two more spaces than they were before. This is just a wrapper function around .Fn LogConfigIndentSet , which allows the caller to specify an arbitrary indentation in spaces. .Fn LogConfigUnindent does the exact opposite of .Fn LogConfigIndent ; it subtracts two spaces from the indentation level, unless there is no indent, then it does nothing. .Pp .Fn LogConfigOutputSet sets the file stream that logging output should be written to. This defaults to standard output, but it can be standard error, or some other file stream. Passing a NULL value for the file pointer sets the log output to standard output. Note that the output file stream is only used if FLAG_OUTPUT_SYSLOG is not set. .Pp .Fn LogConfigFlagSet and .Fn LogConfigFlagClear are used for setting a number of boolean options on a log configuration. They utilize bitwise operators, so multiple options can be set or cleared with a single function call using bitwise OR operators. The flags defined as preprocessor macros, and are as follows: .Bl -tag -width Ds .It LOG_FLAG_COLOR When set, enable color-coded output on TTYs. Note that colors are implemented as ANSI escape sequences, and are not written to file streams that are not actually connected to a TTY, to prevent those sequences from being written to a file. .Xr isatty 3 is checked before writing ANSI sequences. .It LOG_FLAG_SYSLOG When enabled, log output to the syslog using .Xr syslog 3 , instead of logging to the file set by .Fn LogConfigOutputSet . This flag always overrides the file stream set by that function, regardless of when it was set. .El .Pp .Fn LogConfigTimeStampFormatSet allows a custom timestamp to be prepended to each message if the output is not going to the system log. Consult your system's documentation for .Xr strftime 3 . A value of NULL disables outputting a timestamp before messages. .Pp The .Fn Log function actually writes a log message to a console, file, system log, or other supported output device using the given configuration. This function is thread-safe; it locks a mutex before writing a message, and then unlocks it after the message was written. Each log configuration has its own mutex, so this function can be used with mutiple active log configurations. .Pp This function only logs messages if their level is above or equal to the currently configured log level, making it easy to turn some messages on or off. The function has the same usage as .Xr printf 3 . .Sh RETURN VALUES .Pp .Fn LogConfigCreate returns a pointer to a configuration structure on the heap, or NULL if there was an error allocating memory for it. The returned structure is opaque to the caller; the .Fn LogConfig* functions should be used to manipulate it. .Pp All other functions do not return anything. They are simply assumed to always succeed. If any arguments are NULL, then the functions do nothing, unless otherwise specifically noted.