1# Copyright 2017 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import logging 6import sys 7import time 8 9 10def AddLoggingArguments(parser): 11 """Adds standard logging flags to the parser. 12 13 After parsing args, remember to invoke InitializeLogging() with the parsed 14 args, to configure the log level. 15 """ 16 group = parser.add_mutually_exclusive_group() 17 group.add_argument( 18 '-v', 19 '--verbose', 20 action='count', 21 default=0, 22 help='Log more. Use multiple times for even more logging.') 23 group.add_argument( 24 '-q', 25 '--quiet', 26 action='count', 27 default=0, 28 help=('Log less (suppress output). Use multiple times for even less ' 29 'output.')) 30 31 32def InitializeLogging(args, handler=None): 33 """Initialized the log level based on commandline flags. 34 35 This expects to be given an "args" object with the options defined by 36 AddLoggingArguments(). 37 """ 38 if args.quiet >= 2: 39 log_level = logging.CRITICAL 40 elif args.quiet == 1: 41 log_level = logging.ERROR 42 elif args.verbose == 0: 43 log_level = logging.WARNING 44 elif args.verbose == 1: 45 log_level = logging.INFO 46 else: 47 log_level = logging.DEBUG 48 logger = logging.getLogger() 49 logger.setLevel(log_level) 50 if not handler: 51 handler = logging.StreamHandler(sys.stdout) 52 handler.setFormatter(CustomFormatter()) 53 logger.addHandler(handler) 54 55 56class CustomFormatter(logging.Formatter): 57 """Custom log formatter.""" 58 59 # override 60 def __init__(self, fmt='%(threadName)-4s %(message)s'): 61 # Can't use super() because in older Python versions logging.Formatter does 62 # not inherit from object. 63 logging.Formatter.__init__(self, fmt=fmt) 64 self._creation_time = time.time() 65 66 # override 67 def format(self, record): 68 # Can't use super() because in older Python versions logging.Formatter does 69 # not inherit from object. 70 msg = logging.Formatter.format(self, record) 71 if 'MainThread' in msg[:19]: 72 msg = msg.replace('MainThread', 'Main', 1) 73 timediff = time.time() - self._creation_time 74 return '%s %8.3fs %s' % (record.levelname[0], timediff, msg) 75