diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 12d27ed3..a99d9ddc 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -1,5 +1,6 @@ import asyncore import logging +import logging.handlers import multiprocessing import optparse import os @@ -16,7 +17,7 @@ logger = logging.getLogger('mopidy.main') def main(): options = _parse_options() - _setup_logging(options.verbosity_level) + _setup_logging(options.verbosity_level, options.debug) get_or_create_folder('~/.mopidy/') core_queue = multiprocessing.Queue() get_class(settings.SERVER)(core_queue) @@ -32,17 +33,35 @@ def _parse_options(): parser.add_option('-v', '--verbose', action='store_const', const=2, dest='verbosity_level', help='more output (debug level)') + parser.add_option('--dump', + action='store_true', dest='dump', + help='dump debug log to file') return parser.parse_args()[0] -def _setup_logging(verbosity_level): +def _setup_logging(verbosity_level, debug): if verbosity_level == 0: level = logging.WARNING elif verbosity_level == 2: level = logging.DEBUG else: level = logging.INFO + logging.basicConfig(format=settings.CONSOLE_LOG_FORMAT, level=level) + if not debug: + return + + root = logging.getLogger('') + root.setLevel(logging.DEBUG) + + formatter = logging.Formatter(settings.DUMP_LOG_FORMAT) + + handler = logging.handlers.RotatingFileHandler( + settings.DUMP_LOG_FILENAME, maxBytes=102400, backupCount=3) + handler.setFormatter(formatter) + + root.addHandler(handler) + if __name__ == '__main__': try: main() diff --git a/mopidy/mpd/server.py b/mopidy/mpd/server.py index bd37c998..80eca5f9 100644 --- a/mopidy/mpd/server.py +++ b/mopidy/mpd/server.py @@ -68,7 +68,8 @@ class MpdSession(asynchat.async_chat): data = ''.join(self.input_buffer).strip() self.input_buffer = [] request = data.decode(ENCODING) - logger.debug(u'Input: %s', indent(request)) + host, port = self.client_address + logger.debug(u'Input (%s:%s): %s', host, port, indent(request)) self.handle_request(request) def handle_request(self, request): @@ -87,7 +88,8 @@ class MpdSession(asynchat.async_chat): self.send_response(LINE_TERMINATOR.join(response)) def send_response(self, output): - logger.debug(u'Output: %s', indent(output)) + host, port = self.client_address + logger.debug(u'Output (%s:%s): %s', host, port, indent(output)) output = u'%s%s' % (output, LINE_TERMINATOR) data = output.encode(ENCODING) self.push(data) diff --git a/mopidy/settings.py b/mopidy/settings.py index 886e7189..b1e2e7b2 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -29,6 +29,14 @@ BACKENDS = ( CONSOLE_LOG_FORMAT = u'%(levelname)-8s %(asctime)s' + \ ' [%(process)d:%(threadName)s] %(name)s\n %(message)s' +#: The log format used for dump logs. Default:: +#: DUMP_LOG_FILENAME = CONSOLE_LOG_FORMAT +DUMP_LOG_FORMAT = CONSOLE_LOG_FORMAT + +#: The file to dump debug log data to. Default:: +#: DUMP_LOG_FILENAME = u'dump.log' +DUMP_LOG_FILENAME = u'dump.log' + #: Protocol frontend to use. Default:: #: #: FRONTEND = u'mopidy.mpd.frontend.MpdFrontend'