| | |
- LogContainer
- Logger
- SysLogger
class LogContainer |
| |
A class for consolidating calls to multiple sub-objects
SUMMARY:
If you want a program to log to multiple destinations, it might
be convenient to use log containers. A log container is an
object which can hold several sub-log-objects (including other
log containers). When you log to a log container it passes the
message on (with optional tests) to each of the log objects it
contains.
USAGE:
The basic usage is very simple. LogContainer's simply pass on
logs to the contained Logger, SysLogger, or LogContainer
objects.
from logger import Logger, LogContainer
log_1 = Logger(threshold=1, file_object=sys.stdout)
log_2 = Logger(threshold=2, preprefix='LOG2')
log = LogContainer([log_1, log_2])
log(1, 'message') # printed by log_1 and log_2
log(2, 'message') # only printed by log_2
A more common example would be something like this:
from logger import Logger, LogContainer
system = Logger(threshold=1, file_object=logfile)
debug = Logger(threshold=5, file_object=sys.stdout)
log = LogContainer([system, debug])
log(3, 'sent to system and debug, but only debug will print it')
log(0, 'very important, both will print it')
In this mode, log containers are just shorthand for calling all
contained objects with the same priority and message.
When a log object is held in a container, it can still be used
directly. For example, you can still do
debug(3, ['this will not be sent to the system log, even if its',
' threshold is set very high'])
(Yes, you can send lists of strings and they will be formatted
on different lines. The log methods are pretty smart.)
There are more examples in the SysLogger docs.
ATTRIBUTES:
(all of these are settable as keyword args to __init__)
ATTRIBUTES DEFAULT DESCRIPTION
----------------------------------------------------------
list = [] list of contained objects
threshold = None meaning depends on test - by default
threshold has no effect
default = 1 default priority to log at |
| |
- __call__ = log(self, priority, message=None)
- __init__(self, list=[], threshold=None, default=1)
- _use_default(self, priority, message)
- Substitute default priority if none was provided
- add(self, log_obj)
- Add a log object to the container.
- log(self, priority, message=None)
- Log a message to all contained log objects, depending on
the results of test()
- test(self, priority, message, threshold, log_obj)
- Test which log objects should be passed a given message.
This method is used to determine if a given message (and
priority) should be passed on to a given log_obj. The
container's threshold is also provided.
This method always returns 1, and is the default, meaning that
all messages will get passed to all objects. It is intended
to be overridden if you want more complex behavior. To
override with your own function, just do something like:
def hell_no(p, m, t, object): return 0
container.test = hell_no
- test_limit_priority(self, priority, message, threshold, log_obj)
- Only pass on messages with sufficient priority compared to
the master threshold.
container = LogContainer([system, debug], threshold = 2)
container.test = container.test_limit_priority
- test_limit_threshold(self, priority, message, threshold, log_obj)
- Only pass on messages to log objects whose threshold is
(numerically) lower than the master threshold.
container = LogContainer([system, debug], threshold = 2)
container.test = container.test_limit_threshold
- write(self, priority, message=None)
|
class Logger |
| |
A class for file-object logging
USAGE:
from logger import Logger
log_obj = Logger(THRESHOLD) # create the instance
log_obj.log(3, 'message') # log a message with priority 3
log_obj(3, 'message') # same thing
log_obj(3, ['message']) # same thing
log_obj.test(3) # boolean - would a message of
# this priority be printed?
# a raw write call after the priority test, for writing
# arbitrary text -- (this will not be followed by \n)
log_obj.write(3, 'thing\nto\nwrite')
# generate the prefix used for priority 3
pr = log_obj.gen_prefix(3)
# see the examples in the test section for more
BASIC OPTIONS:
There are a couple of basic options that are commonly needed.
These are attribues of instances of class Logger.
preprefix
Text that will be printed at the start of each line of
output (for log()ged, not write()en messages). This might
be your program's name, for example.
log.preprefix = 'myprog'
If preprefix is callable, then it will be called for each
log and the returned value will be used. This is useful for
printing the current time.
import time
def printtime():
return time.strftime('%m/%d/%y %H:%M:%S ',
time.localtime(time.time()))
log.preprefix = printtime
file_object
This is the file object to which output is directed. If it
is None, then the logs are quietly dropped.
There are other options described in the next section, but these
are the most commonly used.
ATTRIBUTES:
(all of these are settable as keyword args to __init__)
ATTRIBUTES DEFAULT DESCRIPTION
----------------------------------------------------------
threshold = 0 how verbose the program should be
file_object = sys.stderr file object to which output goes
prefix = '' prefix string - repeated for more
important logs
prefix_depth = 5 times prefix is repeated for logs
of priority 0. Basically, set this
one larger than your highest log
priority.
preprefix = '' string printed before the prefix
if callable, returned string will
be used (useful for printing time)
postprefix = '' string printed after the prefix
default = 1 default priority to log at |
| |
- __call__ = log(self, priority, message=None)
- __init__(self, threshold=0, file_object=<open file '<stderr>', mode 'w'>, prefix='', prefix_depth=5, preprefix='', postprefix='', default=1)
- _use_default(self, priority, message)
- Substitute default priority if none was provided
- gen_prefix(self, priority)
- Return the full prefix (including pre and post) for the
given priority.
If you use prefix and use a more complicated priority and
verbosity (non-numerical), then you should either give the
chosen object a __int__ method, or override this function.
- log(self, priority, message=None)
- Print a log message. This prepends the prefix to each line
and does some basic formatting.
- test(self, priority)
- Return true if a log of the given priority would be printed.
This can be overridden to do any test you like. Specifically,
priority and threshold need not be integers. They can be
arbitrary objects. You need only override this method, and
possibly gen_prefix.
- write(self, priority, message=None)
- Print a log message. In this case, 'message' must be a string
as it will be passed directly to the file object's write method.
|
class SysLogger |
| |
A class for file-object logging
USAGE:
For the most part, SysLogger instances are used just like Logger
instances. Notable exceptions:
* prefixes aren't used (at least not as they are for Logger)
* map_priority is pretty important because it controls
conversion between Logger priorities and syslog priorities
* although priority/threshold/test works the same, there is
also maskpri and your syslog config which will limit what
gets logged. Keep this in mind if you see strange behavior.
The most sensible use of this class will be will a LogContainer.
You can create one Logger instance for writing to (say) stderr,
a second for writing to a verbose log file, and a SysLogger
instance for writing important things to syslog so your automated
log-readers can see them. Then you put them all in a log container
for convenient access. That would go something like this:
from logger import Logger, SysLogger, LogContainer
fo = open(file_log, 'w')
file_logger = Logger(4, file_object=fo) # print 4 and lower
console_logger = Logger(1) # print 1 and lower
syslog_logger = SysLogger(0) # print 0 and lower
log = LogContainer([file_logger, console_logger, syslog_logger])
log(3, 'some debugging message') # printed to file only
log(1, 'some warning message') # printed to file and console
log(0, 'some error message') # printed to all (ERR level)
log(-1, 'major problem') # printed to all (CRIT level)
ATTRIBUTES:
(all of these are settable as keyword args to __init__)
ARGUMENT DEFAULT DESCRIPTION
----------------------------------------------------------
threshold = 0 identical to Logger threshold
ident = None string prepended to each log, if None,
it will be taken from the program name
as it appears in sys.argv[0]
logopt = 0 syslog log options
facility = 'LOG_USER' syslog facility (it can be a string)
maskpri = 0 syslog priority bitmask
default = 1 default priority to log at |
| |
- __call__ = log(self, priority, message=None)
- __init__(self, threshold=0, ident=None, logopt=0, facility='LOG_USER', maskpri=0, default=1)
- _use_default(self, priority, message)
- Substitute default priority if none was provided
- log(self, priority, message=None)
- Print a log message with some simple formatting.
- map_priority(self, priority)
- Take a logger priority and return a syslog priority
Here are the syslog priorities (from syslog.h):
LOG_EMERG 0 /* system is unusable */
LOG_ALERT 1 /* action must be taken immediately */
LOG_CRIT 2 /* critical conditions */
LOG_ERR 3 /* error conditions */
LOG_WARNING 4 /* warning conditions */
LOG_NOTICE 5 /* normal but significant condition */
LOG_INFO 6 /* informational */
LOG_DEBUG 7 /* debug-level messages */
The syslog priority is simply equal to the logger priority plus 3.
0 -> 0 + 3 = 3
-5 -> -5 + 3 = -2 (which will be treated as 0)
You can override this very simply. Just do:
def log_everything_emerg(priority): return 0
log_obj.map_priority = log_everything_emerg
The return value of this function does not need to be an integer or
within the allowed syslog range (0 to 7). It will be converted to
an int and forced into this range if it lies outside it.
- setlogmask(self, maskpri)
- a (very) thin wrapper over the syslog setlogmask function
- test(self, priority)
- Return true if a log of the given priority would be printed.
This can be overridden to do any test you like. Specifically,
threshold and threshold need not be integers. They can be
arbitrary objects. If you override this and use non-integer
priorities, you will also need to override map_priority.
- write(self, priority, message=None)
- Print a log message.
| |