pylogd is a python interface to logd. It pushes log messages or statistics to logd over a UDP socket.
pylogd ships various utilities to deal with logd, python logging handlers, and a Stats
object which makes it trivial to record statistics.
To log to logd using the python logging module, create a new handler with your logd server's host and port and then set it up as your default logging handler:
from pylogd.handlers import PylogdHandler
handler = PylogdHandler('mylogpath.log', '127.0.0.1', 8126)
logger = logging.getLogger()
logger.setHandler(handler)
Now, subsequent calls to logger.(error|warn|etc)
will log to your logd server. If you do this on the root logger (getLogger('base')
), it will apply to all subsequently created loggers.
To delete a log, use pylogd.delete_log
with the host and port of logd:
from pylogd import delete_log
delete_log('mylogpath.log', host='127.0.0.1', 8126)
To use stats, create a stats handle:
from pylogd.stats import Logd
stats = Logd('127.0.0.1', 8126)
You can also supply an optional prefix which will be prepended to all of your stats, so that multiple applications can use the same logd/graphite server without having to repeate their per-app key for every stats call.
Once you have a Logd object, you can increment & decrment counters (with an optional sample rate):
stats.increment('my.counter')
stats.change_by('my.counter', 10)
stats.decrement('my.counter', 0.05) # only update 5% of the time
You can also set the value of a meter:
stats.set('my.meter', 30)
stats.set('my.meter', 30, 0.25) # only set 25% of the time
There's a basic time interface as well as a convenient timer interface:
stats.time('my.timer', 11.43) # time manually
# automatically start & stop a timer
stats.timer.start('my.timer')
do_some_timed_operation()
stats.timer.stop('my.timer')
# time this function with a 10% sample rate
@stats.timed('my.long_operation', 0.1)
def long_operation():
pass
# accumulate time done doing various similar tasks
stats.timer.start_accumulator('timers.mysql')
do_some_mysql_stuff()
stats.timer.stop_accumulator('timers.mysql')
non_mysql_things()
stats.timer.start_accumulator('timers.mysql')
do_some_more_mysql_stuff()
stats.timer.stop_accumulator('timers.mysql')
# send this timing information to logd
stats.timer.flush_accumulator('timers.mysql')
For twisted users, use pylogd.twisted
(included) instead of pylogd
, and note that log messages and stats will not go to logd until the reactor has been started.