From 127b1090111b3aa0f6d4de8e7b7fed89bb5aa3a2 Mon Sep 17 00:00:00 2001 From: evilhero Date: Sun, 8 Apr 2018 14:21:01 -0400 Subject: [PATCH] FIX:(#1912)(#1905) Logging would fail to initialize properly on non-English systems --- Mylar.py | 31 ++++--------- data/interfaces/default/config.html | 3 +- data/interfaces/default/logs.html | 6 ++- mylar/__init__.py | 15 +++---- mylar/config.py | 15 ++++++- mylar/logger.py | 70 ++++++++++++++++------------- mylar/webserve.py | 24 +++++++--- 7 files changed, 89 insertions(+), 75 deletions(-) diff --git a/Mylar.py b/Mylar.py index b564d756..196eab36 100755 --- a/Mylar.py +++ b/Mylar.py @@ -62,17 +62,10 @@ def main(): if not mylar.SYS_ENCODING or mylar.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'): mylar.SYS_ENCODING = 'UTF-8' - #setup logger for non-english - try: - language = locale.getdefaultlocale()[0][:2] - except: - language = 'en' - - mylar.LOG_LANG = language - if language != 'en': - print 'language detected as non-English. Forcing specific logging module - errors WILL NOT be captured in the logs' + if not logger.LOG_LANG.startswith('en'): + print 'language detected as non-English (%s). Forcing specific logging module - errors WILL NOT be captured in the logs' % logger.LOG_LANG else: - print 'log language set to %s' % mylar.LOG_LANG + print 'log language set to %s' % logger.LOG_LANG # Set up and gather command line arguments parser = argparse.ArgumentParser(description='Automated Comic Book Downloader') @@ -109,22 +102,14 @@ def main(): mylar.MAINTENANCE = False if args.verbose: - mylar.VERBOSE = True - #print 'Verbose/Debugging mode enabled...' - #mylar.LOG_LEVEL = 2 + print 'Verbose/Debugging mode enabled...' + mylar.LOG_LEVEL = 2 elif args.quiet: mylar.QUIET = True - #print 'Quiet mode enabled...' - #mylar.LOG_LEVEL = 0 + print 'Quiet logging mode enabled...' + mylar.LOG_LEVEL = 0 else: - #print 'Normal logging mode enabled...' - #mylar.LOG_LEVEL = 1 - mylar.VERBOSE = False - - # Do an intial setup of the logger. - if mylar.LOG_LANG == 'en': - logger.initLogger(console=not mylar.QUIET, log_dir=False, init=True, verbose=mylar.VERBOSE) - #logger.mylar_log.initLogger(loglevel=mylar.LOG_LEVEL) + mylar.LOG_LEVEL = 1 if args.daemon: if sys.platform == 'win32': diff --git a/data/interfaces/default/config.html b/data/interfaces/default/config.html index cbd10fe4..c29f42fc 100755 --- a/data/interfaces/default/config.html +++ b/data/interfaces/default/config.html @@ -40,7 +40,8 @@ Configuration Options

-

+
+

MYLAR PROGRAM OPTIONS

diff --git a/data/interfaces/default/logs.html b/data/interfaces/default/logs.html index 31c6a724..87ab0155 100755 --- a/data/interfaces/default/logs.html +++ b/data/interfaces/default/logs.html @@ -8,9 +8,11 @@
diff --git a/mylar/__init__.py b/mylar/__init__.py index 499103b3..69f2237a 100644 --- a/mylar/__init__.py +++ b/mylar/__init__.py @@ -40,7 +40,6 @@ import cherrypy from mylar import logger, versioncheckit, rsscheckit, searchit, weeklypullit, PostProcessor, updater, helpers -from mylar import versioncheck, logger import mylar.config #these are the globals that are runtime-based (ie. not config-valued at all) @@ -52,13 +51,15 @@ MAINTENANCE = False LOG_DIR = None LOGTYPE = 'log' LOG_LANG = 'en' +LOG_CHARSET = 'UTF-8' +LOG_LEVEL = 1 LOGLIST = [] ARGS = None SIGNAL = None SYS_ENCODING = None OS_DETECT = platform.system() USER_AGENT = None -VERBOSE = False +#VERBOSE = False DAEMON = False PIDFILE= None CREATEPID = False @@ -159,23 +160,17 @@ def initialize(config_file): IMPORTBUTTON, IMPORT_FILES, IMPORT_TOTALFILES, IMPORT_CID_COUNT, IMPORT_PARSED_COUNT, IMPORT_FAILURE_COUNT, CHECKENABLED, CVURL, DEMURL, WWTURL, \ USE_SABNZBD, USE_NZBGET, USE_BLACKHOLE, USE_RTORRENT, USE_UTORRENT, USE_QBITTORRENT, USE_DELUGE, USE_TRANSMISSION, USE_WATCHDIR, SAB_PARAMS, \ PROG_DIR, DATA_DIR, CMTAGGER_PATH, DOWNLOAD_APIKEY, LOCAL_IP, STATIC_COMICRN_VERSION, STATIC_APC_VERSION, KEYS_32P, AUTHKEY_32P, FEED_32P, FEEDINFO_32P, \ - MONITOR_STATUS, SEARCH_STATUS, RSS_STATUS, WEEKLY_STATUS, VERSION_STATUS, UPDATER_STATUS, DBUPDATE_INTERVAL, LOG_LEVEL, LOG_LANG, APILOCK, \ + MONITOR_STATUS, SEARCH_STATUS, RSS_STATUS, WEEKLY_STATUS, VERSION_STATUS, UPDATER_STATUS, DBUPDATE_INTERVAL, LOG_LANG, LOG_CHARSET, APILOCK, LOG_LEVEL, \ SCHED_RSS_LAST, SCHED_WEEKLY_LAST, SCHED_MONITOR_LAST, SCHED_SEARCH_LAST, SCHED_VERSION_LAST, SCHED_DBUPDATE_LAST, COMICINFO cc = mylar.config.Config(config_file) - CONFIG = cc.read() + CONFIG = cc.read(startup=True) assert CONFIG is not None if _INITIALIZED: return False - # Start the logger, silence console logging if we need to - if mylar.LOG_LANG == 'en': - logger.initLogger(console=not QUIET, log_dir=CONFIG.LOG_DIR, verbose=VERBOSE) - else: - logger.mylar_log.initLogger(loglevel=mylar.LOG_LEVEL) - # Also sets INSTALL_TYPE variable to 'win', 'git' or 'source' CURRENT_VERSION, CONFIG.GIT_BRANCH = versioncheck.getVersion() diff --git a/mylar/config.py b/mylar/config.py index 76129fa0..65043207 100644 --- a/mylar/config.py +++ b/mylar/config.py @@ -115,7 +115,7 @@ _CONFIG_DEFINITIONS = OrderedDict({ 'LOG_DIR' : (str, 'Logs', None), 'MAX_LOGSIZE' : (int, 'Logs', 10000000), 'MAX_LOGFILES': (int, 'Logs', 5), - 'LOG_LEVEL': (int, 'Logs', 0), + 'LOG_LEVEL': (int, 'Logs', 1), 'GIT_PATH' : (str, 'Git', None), 'GIT_USER' : (str, 'Git', 'evilhero'), @@ -479,7 +479,7 @@ class Config(object): elif k == 'MINIMAL_INI': config.set(v[1], k.lower(), str(self.MINIMAL_INI)) - def read(self): + def read(self, startup=False): self.config_vals() setattr(self, 'EXTRA_NEWZNABS', self.get_extra_newznabs()) setattr(self, 'EXTRA_TORZNABS', self.get_extra_torznabs()) @@ -498,6 +498,16 @@ class Config(object): self.writeconfig() else: self.provider_sequence() + + if startup is True: + # Start the logger, silence console logging if we need to + if logger.LOG_LANG.startswith('en'): + logger.initLogger(console=not mylar.QUIET, log_dir=self.LOG_DIR, max_logsize=self.MAX_LOGSIZE, max_logfiles=self.MAX_LOGFILES, loglevel=mylar.LOG_LEVEL) + else: + if self.LOG_LEVEL != mylar.LOG_LEVEL: + print('Logging level over-ridden by startup value. Changing from %s to %s' % (self.LOG_LEVEL, mylar.LOG_LEVEL)) + logger.mylar_log.initLogger(loglevel=mylar.LOG_LEVEL, log_dir=self.LOG_DIR, max_logsize=self.MAX_LOGSIZE, max_logfiles=self.MAX_LOGFILES) + self.configure() return self @@ -695,6 +705,7 @@ class Config(object): logger.warn("Error writing configuration file: %s", e) def configure(self, update=False): + try: if not any([self.SAB_HOST is None, self.SAB_HOST == '', 'http://' in self.SAB_HOST[:7], 'https://' in self.SAB_HOST[:8]]): self.SAB_HOST = 'http://' + self.SAB_HOST diff --git a/mylar/logger.py b/mylar/logger.py index 86dcc8e2..e86f9fff 100644 --- a/mylar/logger.py +++ b/mylar/logger.py @@ -15,24 +15,30 @@ import os import sys -import logging +import inspect import traceback import threading import platform +import locale import mylar - -from logging import getLogger, WARN, ERROR, INFO, DEBUG, StreamHandler, Formatter, Handler - from mylar import helpers +import logging +from logging import getLogger, WARN, ERROR, INFO, DEBUG, StreamHandler, Formatter, Handler +from lib.six import PY2 +#setup logger for non-english (this doesnt carry thru, so check here too) try: - if mylar.LOG_LANG == 'en': - pass + localeinfo = locale.getdefaultlocale() + language = localeinfo[0] + charset = localeinfo[1] except: - mylar.LOG_LANG = 'en' + language = 'en' + charset = 'UTF-8' +LOG_LANG = language +LOG_CHARSET = charset -if mylar.LOG_LANG != 'en': +if not LOG_LANG.startswith('en'): # Simple rotating log handler that uses RotatingFileHandler class RotatingLogger(object): @@ -55,7 +61,7 @@ if mylar.LOG_LANG != 'en': sys.__excepthook__(exc_type, exc_value, None) return - def initLogger(self, loglevel=1): + def initLogger(self, loglevel=1, log_dir=None, max_logsize=None, max_logfiles=None): import sys sys.excepthook = RotatingLogger.handle_exception @@ -66,7 +72,7 @@ if mylar.LOG_LANG != 'en': lg = logging.getLogger('mylar') lg.setLevel(logging.DEBUG) - self.filename = os.path.join(mylar.CONFIG.LOG_DIR, self.filename) + self.filename = os.path.join(log_dir, self.filename) #concurrentLogHandler/0.8.7 (to deal with windows locks) #since this only happens on windows boxes, if it's nix/mac use the default logger. @@ -87,8 +93,8 @@ if mylar.LOG_LANG != 'en': filehandler = RFHandler( self.filename, - maxBytes=mylar.CONFIG.MAX_LOGSIZE, - backupCount=mylar.CONFIG.MAX_LOGFILES) + maxBytes=max_logsize, + backupCount=max_logfiles) filehandler.setLevel(logging.DEBUG) @@ -130,7 +136,7 @@ if mylar.LOG_LANG != 'en': message = safe_unicode(message) message = message.encode(mylar.SYS_ENCODING) if level != 'DEBUG' or mylar.LOG_LEVEL >= 2: - mylar.LOGLIST.insert(0, (helpers.now(), message, threadname)) + mylar.LOGLIST.insert(0, (helpers.now(), message, level, threadname)) if len(mylar.LOGLIST) > 2500: del mylar.LOGLIST[-1] @@ -189,8 +195,7 @@ else: message = message.replace("\n", "
") mylar.LOGLIST.insert(0, (helpers.now(), message, record.levelname, record.threadName)) - - def initLogger(console=False, log_dir=False, init=False, verbose=False): + def initLogger(console=False, log_dir=False, init=False, loglevel=1, max_logsize=None, max_logfiles=5): #concurrentLogHandler/0.8.7 (to deal with windows locks) #since this only happens on windows boxes, if it's nix/mac use the default logger. if platform.system() == 'Windows': @@ -208,13 +213,11 @@ else: mylar.LOGTYPE = 'log' from logging.handlers import RotatingFileHandler as RFHandler - if init is True: - max_size = 1000000 #1 MB + if all([init is True, max_logsize is None]): + max_logsize = 1000000 #1 MB else: - if mylar.CONFIG.MAX_LOGSIZE: - max_size = mylar.CONFIG.MAX_LOGSIZE - else: - max_size = 1000000 # 1 MB + if max_logsize is None: + max_logsize = 1000000 # 1 MB """ Setup logging for Mylar. It uses the logger instance with the name @@ -245,16 +248,13 @@ else: # Configure the logger to accept all messages logger.propagate = False - #1 is WARN level, 2 is ERROR if init is True: - logger.setLevel(logging.DEBUG if verbose else logging.INFO) + logger.setLevel(logging.INFO) else: - if mylar.CONFIG.LOG_LEVEL == 1: - logger.setLevel(logging.DEBUG if verbose else logging.WARN) - elif mylar.CONFIG.LOG_LEVEL == 2: - logger.setLevel(logging.DEBUG if verbose else logging.ERROR) - else: - logger.setLevel(logging.DEBUG if verbose else logging.INFO) + if loglevel == 1: #normal + logger.setLevel(logging.INFO) + elif loglevel >= 2: #verbose + logger.setLevel(logging.DEBUG) # Add list logger loglist_handler = LogListHandler() @@ -265,8 +265,11 @@ else: if log_dir: filename = os.path.join(log_dir, 'mylar.log') file_formatter = Formatter('%(asctime)s - %(levelname)-7s :: %(name)s.%(funcName)s.%(lineno)s : %(threadName)s : %(message)s', '%d-%b-%Y %H:%M:%S') - file_handler = RFHandler(filename, "a", maxBytes=max_size, backupCount=mylar.CONFIG.MAX_LOGFILES) - file_handler.setLevel(logging.DEBUG) + file_handler = RFHandler(filename, "a", maxBytes=max_logsize, backupCount=max_logfiles) + if loglevel == 1: #normal + file_handler.setLevel(logging.INFO) + elif loglevel >= 2: #verbose + file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) @@ -276,7 +279,10 @@ else: console_formatter = logging.Formatter('%(asctime)s - %(levelname)s :: %(name)s.%(funcName)s.%(lineno)s : %(threadName)s : %(message)s', '%d-%b-%Y %H:%M:%S') console_handler = logging.StreamHandler() console_handler.setFormatter(console_formatter) - console_handler.setLevel(logging.DEBUG) + if loglevel == 1: #normal + console_handler.setLevel(logging.INFO) + elif loglevel >= 2: #verbose + console_handler.setLevel(logging.DEBUG) logger.addHandler(console_handler) diff --git a/mylar/webserve.py b/mylar/webserve.py index 74256988..648ba48f 100644 --- a/mylar/webserve.py +++ b/mylar/webserve.py @@ -3552,11 +3552,24 @@ class WebInterface(object): clearLogs.exposed = True def toggleVerbose(self): - mylar.VERBOSE = not mylar.VERBOSE - logger.initLogger(console=not mylar.QUIET, - log_dir=mylar.CONFIG.LOG_DIR, verbose=mylar.VERBOSE) - logger.info("Verbose toggled, set to %s", mylar.VERBOSE) - logger.debug("If you read this message, debug logging is available") + if mylar.LOG_LEVEL != 2: + mylar.LOG_LEVEL = 2 + else: + mylar.LOG_LEVEL = 1 + if logger.LOG_LANG.startswith('en'): + logger.initLogger(console=not mylar.QUIET, log_dir=mylar.CONFIG.LOG_DIR, max_logsize=mylar.CONFIG.MAX_LOGSIZE, max_logfiles=mylar.CONFIG.MAX_LOGFILES, loglevel=mylar.LOG_LEVEL) + else: + logger.mylar_log.stopLogger() + logger.mylar_log.initLogger(loglevel=mylar.LOG_LEVEL, log_dir=mylar.CONFIG.LOG_DIR, max_logsize=mylar.CONFIG.MAX_LOGSIZE, max_logfiles=mylar.CONFIG.MAX_LOGFILES) + #mylar.VERBOSE = not mylar.VERBOSE + #logger.initLogger(console=not mylar.QUIET, + # log_dir=mylar.CONFIG.LOG_DIR, verbose=mylar.VERBOSE) + if mylar.LOG_LEVEL == 2: + logger.info("Verbose (DEBUG) logging is enabled") + logger.debug("If you can read this message, debug logging is now working") + else: + logger.info("normal (INFO) logging is now enabled") + raise cherrypy.HTTPRedirect("logs") toggleVerbose.exposed = True @@ -4602,6 +4615,7 @@ class WebInterface(object): "prog_dir": mylar.PROG_DIR, "cache_dir": mylar.CONFIG.CACHE_DIR, "config_file": mylar.CONFIG_FILE, + "lang": '%s.%s' % (logger.LOG_LANG,logger.LOG_CHARSET), "branch_history": 'None', # "branch_history" : br_hist, "log_dir": mylar.CONFIG.LOG_DIR,