Add option to rotate log file daily.

Adds a command line option to rotate the log daily at midnight and
retain up to the specified amount of days.
This commit is contained in:
Andrew Thigpen 2015-09-04 17:22:42 -05:00
parent 6519e589b5
commit 2e636f598e
2 changed files with 21 additions and 9 deletions

View File

@ -90,6 +90,11 @@ def get_arguments():
metavar='path_to_pid_file', metavar='path_to_pid_file',
default=None, default=None,
help='Path to PID file useful for running as daemon') 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": if os.name != "nt":
parser.add_argument( parser.add_argument(
'--daemon', '--daemon',
@ -171,13 +176,14 @@ def main():
} }
hass = bootstrap.from_config_dict( hass = bootstrap.from_config_dict(
config, config_dir=config_dir, daemon=args.daemon, 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: else:
config_file = ensure_config_file(config_dir) config_file = ensure_config_file(config_dir)
print('Config directory:', config_dir) print('Config directory:', config_dir)
hass = bootstrap.from_config_file( hass = bootstrap.from_config_file(
config_file, daemon=args.daemon, verbose=args.verbose, 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: if args.open_ui:
def open_browser(event): def open_browser(event):

View File

@ -12,6 +12,7 @@ start by calling homeassistant.start_home_assistant(bus)
import os import os
import sys import sys
import logging import logging
import logging.handlers
from collections import defaultdict from collections import defaultdict
import homeassistant.core as core 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 # pylint: disable=too-many-branches, too-many-statements, too-many-arguments
def from_config_dict(config, hass=None, config_dir=None, enable_log=True, 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. 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, {})) process_ha_core_config(hass, config.get(core.DOMAIN, {}))
if enable_log: if enable_log:
enable_logging(hass, verbose, daemon) enable_logging(hass, verbose, daemon, log_rotate_days)
hass.config.skip_pip = skip_pip hass.config.skip_pip = skip_pip
if 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, 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 Reads the configuration file and tries to start all the required
functionality. Will add functionality to 'hass' parameter if given, 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 hass.config.config_dir = config_dir
mount_local_lib_path(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) 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) 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. """ """ Setup the logging for home assistant. """
if not daemon: if not daemon:
logging.basicConfig(level=logging.INFO) 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 \ 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)): (not err_path_exists and os.access(hass.config.config_dir, os.W_OK)):
err_handler = logging.FileHandler( if log_rotate_days:
err_log_path, mode='w', delay=True) 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.setLevel(logging.INFO if verbose else logging.WARNING)
err_handler.setFormatter( err_handler.setFormatter(