1# Copyright (c) 2013 The Chromium OS 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.
4import logging
5import time
6
7import common
8
9from autotest_lib.client.common_lib import logging_config
10
11
12class DroneLoggingConfig(logging_config.LoggingConfig):
13    """This class sets up logging for the Drone Machines.
14
15    Drone_utility is kicked off on each tick, so this logging config sets up
16    the log file to timestamp by day and will create a daily log file.
17    """
18
19
20    @classmethod
21    def get_timestamped_log_name(cls, base_name):
22        """Generate a log file name based off of Today's Date.
23
24        Normally the other processes in the infrastructure (like the scheduler)
25        are kicked off once for long periods of time. However drone_utility is
26        kicked off once per tick. Therefore get_timestamped_log_name is
27        overloaded so the returned log name just includes the current date.
28
29        @param base_name: String to start the log's filename with.
30
31        @returns String of the base_name suffixed with a timestamp of today's
32                 date.
33        """
34        return '%s.log.%s' % (base_name, time.strftime('%Y-%m-%d'))
35
36
37    def configure_logging(self, log_dir=None, logfile_name=None):
38        """Configure logging for the Drones.
39
40        If log_dir and logfile_name are not provided, it will request a
41        timestamped log name with prefix 'drone'. Both the stdout and stderr
42        logging handlers are disabled because drone_utility's output is parsed
43        by the caller.
44
45        This function is called by client/common_lib/logging_manager.py which
46        manages a logging_config. For example if any modules want to adjust
47        logging (enabling and/or disabling loggers) after drone_utility has
48        started they will do so through the logging_manager.
49
50        @param log_dir: Directory to store the log in. If none will use
51                        /usr/local/autotest/logs
52        @param logfile_name: Name of the log file. If none it will be in the
53                             format of 'drone.log.YEAR-MONTH-DAY'
54
55        """
56        # Disable the default stdout/stderr handlers.
57        self._clear_all_handlers()
58        if log_dir is None:
59            log_dir = self.get_server_log_dir()
60        if not logfile_name:
61            logfile_name = self.get_timestamped_log_name('drone')
62
63        for level in (logging.DEBUG, logging.INFO, logging.WARNING,
64                      logging.ERROR, logging.CRITICAL):
65            self.add_file_handler(logfile_name, level, log_dir=log_dir)