Simple logging in Common Lisp
slog
is a simple logging framework for Common Lisp based on the observation that conditions can represent log events.
slog
is based on an two observations about the Common Lisp condition system:
- conditions do not have to represent errors, or warnings, but can just be a way of a program saying ‘look, something interesting happened’;
- handlers can decline to handle a condition, and in particular handlers are invoked before the stack is unwound.
Well, saying ‘look, something interesting happened’ is really quite similar to what logging systems do, and slog
is built on this idea.
slog
is the simple logging system: it provides a framework on which logging can be built but does not itself provide a vast category of log severities &c. Such a thing could be built on top of slog
, which aims to provide mechanism, not policy.
slog
provides a couple of conditions representing log entries, which are designed to be subclassed in real life. Log entries are created using a slog
function (this is why slog
is called slog
: log
is already taken) which simply signals an appropriate condition. Handlers are set up by a logging
form (this should really be called slogging
but it is not), which associates conditions with handlers. There is fairly flexible file handling for logging to files, and in particular you can refer to file names which all get associated with the approprate stream, streams get closed automagically (and you can manually close them, when they will be reopened if need be), and the underlying mechanism for writing entries is exposed by a slog-to
generic function which could be extended. Log entry formats can be controlled in various ways.
In addition slog
tries to associate log entries with ‘precision time’, which is CL’s universal time expanded to the precision of a millisecond, or of internal time if it is less precise than a millisecond. Setting this up means that slog
takes a second or so to load.
Once again: slog
is a framework: it has no dealings with log severities, catagories, or anything like that. All that is meant to be provided on top of what slog
provides.
Documentation is here, source code is here. It will be available from Quicklisp in due course.