WARNING: The libmultilog API is under development and subject to change. Do not expect the API to stay the same. libmultilog is a library that aims to replace logging in device-mapper, lvm2, and eventually, anything else that needs a generic logging mechanism with potential for non-blocking syslog operation. libmultilog evolved from a simple circular buffer syslog logger that was written for dmeventd. The fact that syslog can block required a non-blocking proxy between the process/thread doing the writing and the process/thread actually writing to syslog. This is the threaded_syslog type in libmultilog. libmultilog has six exported symbols: multilog multilog_add_type multilog_clear_logging multilog_del_type multilog_custom multilog_init_verbose currently, normal use will be to call multilog_add_type() to register with one of the four standard types: standard, logfile, std_syslog, and threaded_syslog. standard logs to stderr/stdout logfile logs to a specified file std_syslog logs to syslog in a (potentially) blocking fashion threaded_syslog uses a circular buffer to write to syslog as described above. multilog_init_verbose is used to set the default logging level for any of the four above logging types - it is not used by custom types described below. Custom logging functions need to handle default levels and such themselves. There is a fifth type called 'custom' that allows the user of libmultilog to register its own logging function. After adding type 'custom' with multilog_add_type, the caller must also call multilog_custom to register the logging function, a destructor for when the custom logging is unregistered, and a data pointer that all log calls will get.