From c21c2869f70b2aed1d33675a4e46b7358e3d719f Mon Sep 17 00:00:00 2001 From: Halali Date: Thu, 25 Oct 2018 12:06:33 +0200 Subject: [PATCH 1/6] Initial commit --- bazarr/logger.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ bazarr/main.py | 39 +------------------ views/logs.tpl | 14 ++++--- 3 files changed, 107 insertions(+), 43 deletions(-) create mode 100644 bazarr/logger.py diff --git a/bazarr/logger.py b/bazarr/logger.py new file mode 100644 index 000000000..d44cfdaf2 --- /dev/null +++ b/bazarr/logger.py @@ -0,0 +1,97 @@ +import os +import sys +import logging +import re + +from logging.handlers import TimedRotatingFileHandler +from get_argv import config_dir +from get_settings import get_general_settings + +log_level = get_general_settings()[4] +if log_level is None: + log_level = "INFO" + + +class OneLineExceptionFormatter(logging.Formatter): + def formatException(self, exc_info): + """ + Format an exception so that it prints on a single line. + """ + result = super(OneLineExceptionFormatter, self).formatException(exc_info) + return repr(result) # or format into one line however you want to + + def format(self, record): + s = super(OneLineExceptionFormatter, self).format(record) + if record.exc_text: + s = s.replace('\n', '') + '|' + return s + + +class NoExceptionFormatter(logging.Formatter): + def format(self, record): + record.exc_text = '' # ensure formatException gets called + return super(NoExceptionFormatter, self).format(record) + + def formatException(self, record): + return '' + + +def configure_logging(): + log = logging.getLogger() + log.handlers = [] + + global fh + fh = TimedRotatingFileHandler(os.path.join(config_dir, 'log/bazarr.log'), when="midnight", interval=1, + backupCount=7) + f = OneLineExceptionFormatter('%(asctime)s|%(levelname)-8s|%(name)-32s|%(message)s|', + '%d/%m/%Y %H:%M:%S') + fh.setFormatter(f) + fh.addFilter(BlacklistFilter()) + logging.getLogger("enzyme").setLevel(logging.CRITICAL) + logging.getLogger("apscheduler").setLevel(logging.WARNING) + if log_level == 'debug': + logging.getLogger("subliminal").setLevel(logging.DEBUG) + else: + logging.getLogger("subliminal").setLevel(logging.CRITICAL) + logging.getLogger("guessit").setLevel(logging.WARNING) + logging.getLogger("rebulk").setLevel(logging.WARNING) + logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL) + log.setLevel(log_level) + log.addHandler(fh) + + ch = logging.StreamHandler() + cf = NoExceptionFormatter('%(asctime)s - %(levelname)s :: %(message)s', + '%Y-%m-%d %H:%M:%S') + ch.setFormatter(cf) + ch.setLevel(logging.INFO) + log.addHandler(ch) + + +class BlacklistFilter(logging.Filter): + """ + Log filter for blacklisted tokens and passwords + """ + def __init__(self): + pass + + def filter(self, record): + try: + apikeys = re.findall(r'apikey(?:=|%3D)([a-zA-Z0-9]+)', record.msg) + for apikey in apikeys: + record.msg = record.msg.replace(apikey, 8 * '*' + apikey[-2:]) + + args = [] + for arg in record.args: + apikeys = re.findall(r'apikey(?:=|%3D)([a-zA-Z0-9]+)', arg) if isinstance(arg, basestring) else [] + for apikey in apikeys: + arg = arg.replace(apikey, 8 * '*' + apikey[-2:]) + args.append(arg) + record.args = tuple(args) + except: + pass + return True + + +def empty_log(): + fh.doRollover() + diff --git a/bazarr/main.py b/bazarr/main.py index 8d37e45e0..a922b5f9a 100644 --- a/bazarr/main.py +++ b/bazarr/main.py @@ -21,42 +21,7 @@ from update_db import * from get_settings import get_general_settings, get_proxy_settings import logging -from logging.handlers import TimedRotatingFileHandler - -log_level = get_general_settings()[4] -if log_level is None: - log_level = "INFO" - -class OneLineExceptionFormatter(logging.Formatter): - def formatException(self, exc_info): - """ - Format an exception so that it prints on a single line. - """ - result = super(OneLineExceptionFormatter, self).formatException(exc_info) - return repr(result) # or format into one line however you want to - - def format(self, record): - s = super(OneLineExceptionFormatter, self).format(record) - if record.exc_text: - s = s.replace('\n', '') + '|' - return s - -def configure_logging(): - global fh - fh = TimedRotatingFileHandler(os.path.join(config_dir, 'log/bazarr.log'), when="midnight", interval=1, backupCount=7) - f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|', - '%d/%m/%Y %H:%M:%S') - fh.setFormatter(f) - logging.getLogger("enzyme").setLevel(logging.CRITICAL) - logging.getLogger("apscheduler").setLevel(logging.WARNING) - logging.getLogger("subliminal").setLevel(logging.CRITICAL) - logging.getLogger("guessit").setLevel(logging.WARNING) - logging.getLogger("rebulk").setLevel(logging.WARNING) - logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL) - root = logging.getLogger() - root.setLevel(log_level) - root.addHandler(fh) - +from logger import configure_logging, empty_log configure_logging() import requests @@ -449,7 +414,7 @@ def emptylog(): authorize() ref = request.environ['HTTP_REFERER'] - fh.doRollover() + empty_log() logging.info('BAZARR Log file emptied') redirect(ref) diff --git a/views/logs.tpl b/views/logs.tpl index ea8fe473f..b8ec92f0a 100644 --- a/views/logs.tpl +++ b/views/logs.tpl @@ -34,25 +34,27 @@ %line = log.split('|') \\ %try: -{{line[2]}}\\ +{{line[3]}}\\ %except: \\ %end From 1b8efc890a4c7cfa8525e01692f890208badd801 Mon Sep 17 00:00:00 2001 From: Halali Date: Thu, 25 Oct 2018 13:56:02 +0200 Subject: [PATCH 2/6] Change debug logging level settings --- bazarr/logger.py | 9 +++++++-- bazarr/main.py | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/bazarr/logger.py b/bazarr/logger.py index d44cfdaf2..9173fedd9 100644 --- a/bazarr/logger.py +++ b/bazarr/logger.py @@ -47,12 +47,17 @@ def configure_logging(): '%d/%m/%Y %H:%M:%S') fh.setFormatter(f) fh.addFilter(BlacklistFilter()) - logging.getLogger("enzyme").setLevel(logging.CRITICAL) - logging.getLogger("apscheduler").setLevel(logging.WARNING) + if log_level == 'debug': + logging.getLogger("apscheduler").setLevel(logging.DEBUG) logging.getLogger("subliminal").setLevel(logging.DEBUG) + logging.getLogger("git").setLevel(logging.DEBUG) + logging.getLogger("apprise").setLevel(logging.DEBUG) else: + logging.getLogger("apscheduler").setLevel(logging.WARNING) logging.getLogger("subliminal").setLevel(logging.CRITICAL) + + logging.getLogger("enzyme").setLevel(logging.CRITICAL) logging.getLogger("guessit").setLevel(logging.WARNING) logging.getLogger("rebulk").setLevel(logging.WARNING) logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL) diff --git a/bazarr/main.py b/bazarr/main.py index a922b5f9a..ba8d62636 100644 --- a/bazarr/main.py +++ b/bazarr/main.py @@ -188,7 +188,7 @@ def restart(): except Exception as e: logging.error('BAZARR Cannot create bazarr.restart file.') else: - print 'Bazarr is being restarted...' + # print 'Bazarr is being restarted...' logging.info('Bazarr is being restarted...') restart_file.write('') restart_file.close() @@ -1895,7 +1895,7 @@ warnings.simplefilter("ignore", DeprecationWarning) server = CherryPyWSGIServer((str(ip), int(port)), app) try: logging.info('BAZARR is started and waiting for request on http://' + str(ip) + ':' + str(port) + str(base_url)) - print 'Bazarr is started and waiting for request on http://' + str(ip) + ':' + str(port) + str(base_url) + # print 'Bazarr is started and waiting for request on http://' + str(ip) + ':' + str(port) + str(base_url) server.start() except KeyboardInterrupt: shutdown() From 5ff8baa19cfc1ac7e426184931e22bb7a6884bef Mon Sep 17 00:00:00 2001 From: Halali Date: Tue, 30 Oct 2018 19:06:30 +0100 Subject: [PATCH 3/6] Change Log_level settings to Debug checkbox --- bazarr/get_settings.py | 12 ++++++------ bazarr/init.py | 7 +++++++ bazarr/logger.py | 19 ++++++++++++++----- bazarr/main.py | 10 +++++++--- views/settings.tpl | 20 +++++++++++--------- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/bazarr/get_settings.py b/bazarr/get_settings.py index ebe291686..038cbb583 100644 --- a/bazarr/get_settings.py +++ b/bazarr/get_settings.py @@ -39,10 +39,10 @@ def get_general_settings(): else: path_mappings = '[]' - if cfg.has_option('general', 'log_level'): - log_level = cfg.get('general', 'log_level') + if cfg.has_option('general', 'debug'): + debug = cfg.getboolean('general', 'debug') else: - log_level = 'INFO' + debug = False if cfg.has_option('general', 'branch'): branch = cfg.get('general', 'branch') @@ -154,7 +154,7 @@ def get_general_settings(): port = '6767' base_url = '/' path_mappings = '[]' - log_level = 'INFO' + debug = False branch = 'master' auto_update = True single_language = False @@ -177,7 +177,7 @@ def get_general_settings(): only_monitored = False adaptive_searching = False - return [ip, port, base_url, path_mappings, log_level, branch, auto_update, single_language, minimum_score, use_scenename, use_postprocessing, postprocessing_cmd, use_sonarr, use_radarr, path_mappings_movie, serie_default_enabled, serie_default_language, serie_default_hi, movie_default_enabled,movie_default_language, movie_default_hi, page_size, minimum_score_movie, use_embedded_subs, only_monitored, adaptive_searching] + return [ip, port, base_url, path_mappings, debug, branch, auto_update, single_language, minimum_score, use_scenename, use_postprocessing, postprocessing_cmd, use_sonarr, use_radarr, path_mappings_movie, serie_default_enabled, serie_default_language, serie_default_hi, movie_default_enabled,movie_default_language, movie_default_hi, page_size, minimum_score_movie, use_embedded_subs, only_monitored, adaptive_searching] def get_auth_settings(): @@ -450,7 +450,7 @@ ip = result[0] port = result[1] base_url = result[2] path_mappings = ast.literal_eval(result[3]) -log_level = result[4] +debug = result[4] branch = result[5] automatic = result[6] single_language = result[7] diff --git a/bazarr/init.py b/bazarr/init.py index 8078a48a1..633b9347b 100644 --- a/bazarr/init.py +++ b/bazarr/init.py @@ -66,6 +66,13 @@ if cfg.has_section('auth'): cfg.remove_option('auth', 'enabled') with open(config_file, 'w+') as configfile: cfg.write(configfile) + +if cfg.has_section('general'): + if cfg.has_option('general', 'log_level'): + cfg.remove_option('general', 'log_level') + cfg.set('general', 'debug', 'False') + with open(config_file, 'w+') as configfile: + cfg.write(configfile) from cork import Cork import time diff --git a/bazarr/logger.py b/bazarr/logger.py index 9173fedd9..c558d554f 100644 --- a/bazarr/logger.py +++ b/bazarr/logger.py @@ -7,10 +7,11 @@ from logging.handlers import TimedRotatingFileHandler from get_argv import config_dir from get_settings import get_general_settings -log_level = get_general_settings()[4] -if log_level is None: +debug = get_general_settings()[4] +if debug is False: log_level = "INFO" - +else: + log_level = "DEBUG" class OneLineExceptionFormatter(logging.Formatter): def formatException(self, exc_info): @@ -48,7 +49,7 @@ def configure_logging(): fh.setFormatter(f) fh.addFilter(BlacklistFilter()) - if log_level == 'debug': + if debug is True: logging.getLogger("apscheduler").setLevel(logging.DEBUG) logging.getLogger("subliminal").setLevel(logging.DEBUG) logging.getLogger("git").setLevel(logging.DEBUG) @@ -63,11 +64,19 @@ def configure_logging(): logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL) log.setLevel(log_level) log.addHandler(fh) - + + # Console logging ch = logging.StreamHandler() cf = NoExceptionFormatter('%(asctime)s - %(levelname)s :: %(message)s', '%Y-%m-%d %H:%M:%S') ch.setFormatter(cf) + + logging.getLogger("apscheduler").setLevel(logging.WARNING) + logging.getLogger("subliminal").setLevel(logging.CRITICAL) + logging.getLogger("enzyme").setLevel(logging.CRITICAL) + logging.getLogger("guessit").setLevel(logging.WARNING) + logging.getLogger("rebulk").setLevel(logging.WARNING) + logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL) ch.setLevel(logging.INFO) log.addHandler(ch) diff --git a/bazarr/main.py b/bazarr/main.py index ba8d62636..782748fc3 100644 --- a/bazarr/main.py +++ b/bazarr/main.py @@ -1029,7 +1029,11 @@ def save_settings(): settings_general_baseurl = request.forms.get('settings_general_baseurl') if settings_general_baseurl.endswith('/') is False: settings_general_baseurl += '/' - settings_general_loglevel = request.forms.get('settings_general_loglevel') + settings_general_debug = request.forms.get('settings_general_debug') + if settings_general_debug is None: + settings_general_debug = 'False' + else: + settings_general_debug = 'True' settings_general_sourcepath = request.forms.getall('settings_general_sourcepath') settings_general_destpath = request.forms.getall('settings_general_destpath') settings_general_pathmapping = [] @@ -1092,7 +1096,7 @@ def save_settings(): settings_general = get_general_settings() before = (unicode(settings_general[0]), int(settings_general[1]), unicode(settings_general[2]), unicode(settings_general[4]), unicode(settings_general[3]), unicode(settings_general[12]), unicode(settings_general[13]), unicode(settings_general[14])) - after = (unicode(settings_general_ip), int(settings_general_port), unicode(settings_general_baseurl), unicode(settings_general_loglevel), unicode(settings_general_pathmapping), unicode(settings_general_use_sonarr), unicode(settings_general_use_radarr), unicode(settings_general_pathmapping_movie)) + after = (unicode(settings_general_ip), int(settings_general_port), unicode(settings_general_baseurl), unicode(settings_general_debug), unicode(settings_general_pathmapping), unicode(settings_general_use_sonarr), unicode(settings_general_use_radarr), unicode(settings_general_pathmapping_movie)) from six import text_type cfg = ConfigParser() @@ -1104,7 +1108,7 @@ def save_settings(): cfg.set('general', 'port', text_type(settings_general_port)) cfg.set('general', 'base_url', text_type(settings_general_baseurl)) cfg.set('general', 'path_mappings', text_type(settings_general_pathmapping)) - cfg.set('general', 'log_level', text_type(settings_general_loglevel)) + cfg.set('general', 'debug', text_type(settings_general_debug)) cfg.set('general', 'branch', text_type(settings_general_branch)) cfg.set('general', 'auto_update', text_type(settings_general_automatic)) cfg.set('general', 'single_language', text_type(settings_general_single_language)) diff --git a/views/settings.tpl b/views/settings.tpl index b698ce56b..fac299492 100644 --- a/views/settings.tpl +++ b/views/settings.tpl @@ -135,17 +135,13 @@
- +
- +
+ + +
- -