]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
add timed rotating mode for logging into separated files in tornado.log
authorPing <yuanta11@gmail.com>
Wed, 5 Aug 2015 07:15:31 +0000 (15:15 +0800)
committerPing <yuanta11@gmail.com>
Sun, 6 Sep 2015 06:57:02 +0000 (14:57 +0800)
tornado/log.py
tornado/test/log_test.py

index c68dec46bad5f1331fb121d6f3c0d43047e50484..b72c5ba85e515ced52c3d277f70138f07738ef1b 100644 (file)
@@ -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))
index 102d3d42f9a0aa08fde7c765cfeb8a6847c7b11a..58582522f9ba8bee36765dde58b2ccfcb5144219 100644 (file)
@@ -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."""