xref: /aosp_15_r20/external/chromium-trace/catapult/devil/devil/utils/logging_common.py (revision 1fa4b3da657c0e9ad43c0220bacf9731820715a5)
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