Cheng Tang | e757ffe | 2012-09-26 09:34:21 +0800 | [diff] [blame] | 1 | # -*- coding: utf-8 -*-
|
| 2 | """
|
| 3 | Created on 2012-6-12
|
| 4 |
|
| 5 | @author: cheng.tang
|
| 6 | """
|
| 7 |
|
| 8 | import logging
|
| 9 | import time
|
| 10 | import logging.handlers
|
| 11 |
|
| 12 |
|
| 13 | class _LogFormatter(logging.Formatter):
|
| 14 | def __init__(self, *args, **kwargs):
|
| 15 | logging.Formatter.__init__(self, *args, **kwargs)
|
| 16 |
|
| 17 | def format(self, record):
|
| 18 | try:
|
| 19 | record.message = record.getMessage()
|
| 20 | except Exception, e:
|
| 21 | record.message = "Bad message (%r): %r" % (e, record.__dict__)
|
| 22 | #record.asctime = time.strftime(
|
| 23 | # "%y%m%d %H:%M:%S", self.converter(record.created))
|
| 24 | record.asctime = time.strftime(
|
| 25 | "%m%d %H:%M:%S", self.converter(record.created))
|
| 26 | #prefix = '[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]' % \
|
| 27 | # record.__dict__
|
| 28 | prefix = '[%(levelname)1.1s %(asctime)s]' % record.__dict__
|
| 29 |
|
| 30 | formatted = prefix + " " + record.message
|
| 31 | if record.exc_info:
|
| 32 | if not record.exc_text:
|
| 33 | record.exc_text = self.formatException(record.exc_info)
|
| 34 | if record.exc_text:
|
| 35 | formatted = formatted.rstrip() + "\n" + record.exc_text
|
| 36 | return formatted.replace("\n", "\n ")
|
| 37 |
|
| 38 |
|
| 39 | def _enable_pretty_logging(**kwargs):
|
| 40 | """Turns on formatted logging output as configured.
|
| 41 | This is called automatically by `parse_command_line`.
|
| 42 | """
|
| 43 | log_file_prefix = kwargs.get('log_file_prefix', None)
|
| 44 | log_to_socket = kwargs.get('log_to_socket', None)
|
| 45 | root_logger = logging.getLogger()
|
| 46 | if log_file_prefix:
|
| 47 | # 10M
|
| 48 | log_file_max_size = kwargs.get('log_file_max_size', 1024 * 1024 * 10)
|
| 49 | log_file_num_backups = kwargs.get('log_file_num_backups', 5)
|
| 50 | #channel = ConcurrentRotatingFileHandler(
|
| 51 | channel = logging.handlers.RotatingFileHandler(
|
| 52 | mode="a",
|
| 53 | filename=log_file_prefix,
|
| 54 | maxBytes=log_file_max_size,
|
| 55 | backupCount=log_file_num_backups)
|
| 56 | channel.setFormatter(_LogFormatter())
|
| 57 | root_logger.addHandler(channel)
|
| 58 |
|
| 59 | if log_to_socket:
|
| 60 | channel = logging.handlers.SocketHandler('localhost',
|
| 61 | logging.handlers.DEFAULT_TCP_LOGGING_PORT)
|
| 62 | channel.setFormatter(_LogFormatter())
|
| 63 | root_logger.addHandler(channel)
|
| 64 |
|
| 65 | if kwargs.get('log_to_std', 'true') == 'true':
|
| 66 | channel = logging.StreamHandler()
|
| 67 | channel.setFormatter(_LogFormatter())
|
| 68 | root_logger.addHandler(channel)
|
| 69 |
|
| 70 |
|
| 71 | def setup_logger(**kwargs):
|
| 72 | level = kwargs.get('log_level', 'info')
|
| 73 | level_str = dict(info=logging.INFO, debug=logging.DEBUG,
|
| 74 | error=logging.ERROR)
|
| 75 | logging.getLogger().setLevel(level_str.get(level, logging.INFO))
|
| 76 | _enable_pretty_logging(**kwargs)
|