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