xref: /aosp_15_r20/external/autotest/site_utils/loglib.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright 2018 The Chromium Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Li"""Shared logging functions for autotest drone services
6*9c5db199SXin Li
7*9c5db199SXin Liautotest/site_utils/ is home to various upstart jobs and cron jobs that run on
8*9c5db199SXin Liautotest drones. All these jobs currently configure logging in different ways.
9*9c5db199SXin LiWorse, many of these scripts don't use logging at all, instead print()ing to
10*9c5db199SXin Listdout and use external log file management.
11*9c5db199SXin Li
12*9c5db199SXin LiThis library provides a single consistent way to manage log configuration and
13*9c5db199SXin Lilog directories for these scripts.
14*9c5db199SXin Li"""
15*9c5db199SXin Li
16*9c5db199SXin Lifrom __future__ import absolute_import
17*9c5db199SXin Lifrom __future__ import division
18*9c5db199SXin Lifrom __future__ import print_function
19*9c5db199SXin Li
20*9c5db199SXin Liimport logging
21*9c5db199SXin Liimport logging.config
22*9c5db199SXin Liimport os
23*9c5db199SXin Li
24*9c5db199SXin Li
25*9c5db199SXin Lidef add_logging_options(parser):
26*9c5db199SXin Li    """Add logging configuration options to argument parser.
27*9c5db199SXin Li
28*9c5db199SXin Li    @param parser: ArgumentParser instance.
29*9c5db199SXin Li    """
30*9c5db199SXin Li    parser.add_argument(
31*9c5db199SXin Li            '--log-dir',
32*9c5db199SXin Li            default=None,
33*9c5db199SXin Li            help='(existing) directory to drop log files in.'
34*9c5db199SXin Li                 ' By default, logs to stderr.',
35*9c5db199SXin Li    )
36*9c5db199SXin Li
37*9c5db199SXin Li
38*9c5db199SXin Lidef configure_logging_with_args(parser, args):
39*9c5db199SXin Li    """Convenience function for calling configure_logging().
40*9c5db199SXin Li
41*9c5db199SXin Li    @param parser: ArgumentParser instance.
42*9c5db199SXin Li    @param args: Return value from ArgumentParser.parse_args().
43*9c5db199SXin Li    """
44*9c5db199SXin Li    configure_logging(parser.prog, args.log_dir)
45*9c5db199SXin Li
46*9c5db199SXin Li
47*9c5db199SXin Lidef configure_logging(name, log_dir=None):
48*9c5db199SXin Li    """Configure logging globally.
49*9c5db199SXin Li
50*9c5db199SXin Li    @param name: Name to prepend to log messages.
51*9c5db199SXin Li                 This should be the name of the program.
52*9c5db199SXin Li    @param log_dir: Path to the (existing) direcotry to create log files in.
53*9c5db199SXin Li                    If None, logs to stderr.
54*9c5db199SXin Li    """
55*9c5db199SXin Li    if log_dir is None:
56*9c5db199SXin Li        handlers = {
57*9c5db199SXin Li                'default': {
58*9c5db199SXin Li                        'class': 'logging.StreamHandler',
59*9c5db199SXin Li                        'formatter': 'default' ,
60*9c5db199SXin Li                }
61*9c5db199SXin Li        }
62*9c5db199SXin Li    else:
63*9c5db199SXin Li        handlers = {
64*9c5db199SXin Li                'default': {
65*9c5db199SXin Li                        'class': 'logging.handlers.TimedRotatingFileHandler',
66*9c5db199SXin Li                        'formatter': 'default' ,
67*9c5db199SXin Li                        'filename': os.path.join(log_dir, '%s.log' % name),
68*9c5db199SXin Li                        'when': 'midnight',
69*9c5db199SXin Li                        'backupCount': 14,
70*9c5db199SXin Li                }
71*9c5db199SXin Li        }
72*9c5db199SXin Li
73*9c5db199SXin Li
74*9c5db199SXin Li    logging.config.dictConfig({
75*9c5db199SXin Li            'version': 1,
76*9c5db199SXin Li            'handlers': handlers,
77*9c5db199SXin Li            'formatters': {
78*9c5db199SXin Li                    'default': {
79*9c5db199SXin Li                            'format': ('{name}: '
80*9c5db199SXin Li                                        '%(asctime)s:%(levelname)s'
81*9c5db199SXin Li                                        ':%(module)s:%(funcName)s:%(lineno)d'
82*9c5db199SXin Li                                        ': %(message)s'
83*9c5db199SXin Li                                        .format(name=name)),
84*9c5db199SXin Li                    },
85*9c5db199SXin Li            },
86*9c5db199SXin Li            'root': {
87*9c5db199SXin Li                    'level': 'INFO',
88*9c5db199SXin Li                    'handlers': ['default'],
89*9c5db199SXin Li            },
90*9c5db199SXin Li            'disable_existing_loggers': False,
91*9c5db199SXin Li    })
92