queuelogger: Add support for background log writing

Writing to the debug log can cause an unbounded delay due to disk IO.
This is particularly so on embedded machines such as the Raspberry Pi
that run on SD cards.  These log writing delays can cause problems for
the main processing threads.

The new "queuelogger" code forwards all the main thread log messages
to a queue, and a background thread writes the log messages from the
queue to the destination file.  This eliminates the IO delay from the
main threads.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2016-11-11 20:22:39 -05:00
parent afecf7ce36
commit 1dee1ba64e
3 changed files with 58 additions and 6 deletions

View file

@ -5,7 +5,7 @@
#
# This file may be distributed under the terms of the GNU GPLv3 license.
import sys, optparse, ConfigParser, logging, time, threading
import gcode, toolhead, util, mcu, fan, heater, extruder, reactor
import gcode, toolhead, util, mcu, fan, heater, extruder, reactor, queuelogger
class ConfigWrapper:
def __init__(self, printer, section):
@ -132,7 +132,7 @@ def main():
opts.error("Incorrect number of arguments")
conffile = args[0]
debuginput = debugoutput = None
debuginput = debugoutput = bglogger = None
debuglevel = logging.INFO
if options.verbose:
@ -142,8 +142,7 @@ def main():
if options.outputfile:
debugoutput = open(options.outputfile, 'wb')
if options.logfile:
logoutput = open(options.logfile, 'wb')
logging.basicConfig(stream=logoutput, level=debuglevel)
bglogger = queuelogger.setup_bg_logging(options.logfile, debuglevel)
else:
logging.basicConfig(level=debuglevel)
logging.info("Starting Klippy...")
@ -159,5 +158,8 @@ def main():
store_dictionary(options.write_dictionary, printer)
printer.run()
if bglogger is not None:
bglogger.stop()
if __name__ == '__main__':
main()