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)
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))
import sys
import tempfile
import warnings
+import time
from tornado.escape import utf8
from tornado.log import LogFormatter, define_logging_options, enable_pretty_logging
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."""