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.

