diff --git a/homeassistant/__main__.py b/homeassistant/__main__.py index 0dd78e9e400..2641961f5c3 100644 --- a/homeassistant/__main__.py +++ b/homeassistant/__main__.py @@ -90,6 +90,11 @@ def get_arguments(): metavar='path_to_pid_file', default=None, help='Path to PID file useful for running as daemon') + parser.add_argument( + '--log-rotate-days', + type=int, + default=None, + help='Enables daily log rotation and keeps up to the specified days') if os.name != "nt": parser.add_argument( '--daemon', @@ -171,13 +176,14 @@ def main(): } hass = bootstrap.from_config_dict( config, config_dir=config_dir, daemon=args.daemon, - verbose=args.verbose, skip_pip=args.skip_pip) + verbose=args.verbose, skip_pip=args.skip_pip, + log_rotate_days=args.log_rotate_days) else: config_file = ensure_config_file(config_dir) print('Config directory:', config_dir) hass = bootstrap.from_config_file( config_file, daemon=args.daemon, verbose=args.verbose, - skip_pip=args.skip_pip) + skip_pip=args.skip_pip, log_rotate_days=args.log_rotate_days) if args.open_ui: def open_browser(event): diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index f8a5b58cb2a..ca74f086632 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -12,6 +12,7 @@ start by calling homeassistant.start_home_assistant(bus) import os import sys import logging +import logging.handlers from collections import defaultdict import homeassistant.core as core @@ -151,7 +152,8 @@ def mount_local_lib_path(config_dir): # pylint: disable=too-many-branches, too-many-statements, too-many-arguments def from_config_dict(config, hass=None, config_dir=None, enable_log=True, - verbose=False, daemon=False, skip_pip=False): + verbose=False, daemon=False, skip_pip=False, + log_rotate_days=None): """ Tries to configure Home Assistant from a config dict. @@ -167,7 +169,7 @@ def from_config_dict(config, hass=None, config_dir=None, enable_log=True, process_ha_core_config(hass, config.get(core.DOMAIN, {})) if enable_log: - enable_logging(hass, verbose, daemon) + enable_logging(hass, verbose, daemon, log_rotate_days) hass.config.skip_pip = skip_pip if skip_pip: @@ -202,7 +204,7 @@ def from_config_dict(config, hass=None, config_dir=None, enable_log=True, def from_config_file(config_path, hass=None, verbose=False, daemon=False, - skip_pip=True): + skip_pip=True, log_rotate_days=None): """ Reads the configuration file and tries to start all the required functionality. Will add functionality to 'hass' parameter if given, @@ -216,7 +218,7 @@ def from_config_file(config_path, hass=None, verbose=False, daemon=False, hass.config.config_dir = config_dir mount_local_lib_path(config_dir) - enable_logging(hass, verbose, daemon) + enable_logging(hass, verbose, daemon, log_rotate_days) config_dict = config_util.load_config_file(config_path) @@ -224,7 +226,7 @@ def from_config_file(config_path, hass=None, verbose=False, daemon=False, skip_pip=skip_pip) -def enable_logging(hass, verbose=False, daemon=False): +def enable_logging(hass, verbose=False, daemon=False, log_rotate_days=None): """ Setup the logging for home assistant. """ if not daemon: logging.basicConfig(level=logging.INFO) @@ -257,8 +259,12 @@ def enable_logging(hass, verbose=False, daemon=False): if (err_path_exists and os.access(err_log_path, os.W_OK)) or \ (not err_path_exists and os.access(hass.config.config_dir, os.W_OK)): - err_handler = logging.FileHandler( - err_log_path, mode='w', delay=True) + if log_rotate_days: + err_handler = logging.handlers.TimedRotatingFileHandler( + err_log_path, when='midnight', backupCount=log_rotate_days) + else: + err_handler = logging.FileHandler( + err_log_path, mode='w', delay=True) err_handler.setLevel(logging.INFO if verbose else logging.WARNING) err_handler.setFormatter(