From: Ping Date: Wed, 5 Aug 2015 07:15:31 +0000 (+0800) Subject: add timed rotating mode for logging into separated files in tornado.log X-Git-Tag: v4.3.0b1~51^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=22a8c6efcf7d8d0fc8016344e99e4762da86b786;p=thirdparty%2Ftornado.git add timed rotating mode for logging into separated files in tornado.log --- diff --git a/tornado/log.py b/tornado/log.py index c68dec46b..b72c5ba85 100644 --- a/tornado/log.py +++ b/tornado/log.py @@ -190,10 +190,19 @@ def enable_pretty_logging(options=None, logger=None): logger = logging.getLogger() logger.setLevel(getattr(logging, options.logging.upper())) if options.log_file_prefix: - channel = logging.handlers.RotatingFileHandler( - filename=options.log_file_prefix, - maxBytes=options.log_file_max_size, - backupCount=options.log_file_num_backups) + if options.rotating_mode == 'sized': + channel = logging.handlers.RotatingFileHandler( + filename=options.log_file_prefix, + maxBytes=options.log_file_max_size, + backupCount=options.log_file_num_backups) + elif options.rotating_mode == 'timed': + channel = logging.handlers.TimedRotatingFileHandler( + filename=options.log_file_prefix, + when=options.log_file_rotating_when, + interval=options.log_file_rotating_interval, + backupCount=options.log_file_num_backups) + else: + channel = logging.NullHandler() channel.setFormatter(LogFormatter(color=False)) logger.addHandler(channel) @@ -235,4 +244,13 @@ def define_logging_options(options=None): options.define("log_file_num_backups", type=int, default=10, help="number of log files to keep") + options.define("log_file_rotating_when", type=str, default='midnight', + help=("specify the type of TimedRotatingFileHandler interval " + "other options:('S', 'M', 'H', 'D', 'W0'-'W6')")) + options.define("log_file_rotating_interval", type=int, default=1, + help="The interval value of timed rotating") + + options.define("rotating_mode", type=str, default='sized', + help="The mode of rotating files(timed or sized)") + options.add_parse_callback(lambda: enable_pretty_logging(options)) diff --git a/tornado/test/log_test.py b/tornado/test/log_test.py index 102d3d42f..58582522f 100644 --- a/tornado/test/log_test.py +++ b/tornado/test/log_test.py @@ -24,6 +24,7 @@ import subprocess import sys import tempfile import warnings +import time from tornado.escape import utf8 from tornado.log import LogFormatter, define_logging_options, enable_pretty_logging @@ -160,6 +161,37 @@ class EnablePrettyLoggingTest(unittest.TestCase): os.unlink(filename) os.rmdir(tmpdir) + def test_log_file_with_timed_rotating(self): + tmpdir = tempfile.mkdtemp() + try: + self.options.log_file_prefix = tmpdir + '/test_log' + self.options.rotating_mode = 'timed' + self.options.log_file_rotating_when = 'S' + self.options.log_file_rotating_interval = 1 + enable_pretty_logging(options=self.options, logger=self.logger) + self.logger.error('hello1 from TimedRotatingFileHandler') + time.sleep(1.01) + self.logger.error('hello2 from TimedRotatingFileHandler') + filenames = glob.glob(tmpdir + '/test_log*') + self.assertEqual(2, len(filenames)) + new_file = tmpdir + '/test_log' + old_file = glob.glob(tmpdir + '/test_log.*')[0] + with open(old_file) as f: + self.assertRegexpMatches( + f.read(), + r'^\[E [^]]*\] hello1 from TimedRotatingFileHandler$') + with open(new_file) as f: + self.assertRegexpMatches( + f.read(), + r'^\[E [^]]*\] hello2 from TimedRotatingFileHandler$') + finally: + for handler in self.logger.handlers: + handler.flush() + handler.close() + for filename in glob.glob(tmpdir + '/test_log*'): + os.unlink(filename) + os.rmdir(tmpdir) + class LoggingOptionTest(unittest.TestCase): """Test the ability to enable and disable Tornado's logging hooks."""