bazarr/bazarr/logger.py

171 lines
5.2 KiB
Python
Raw Normal View History

2018-11-28 12:31:16 +00:00
# coding=utf-8
2018-10-25 10:06:33 +00:00
import os
import logging
import re
2018-11-28 12:31:16 +00:00
import types
2018-10-25 10:06:33 +00:00
from logging.handlers import TimedRotatingFileHandler
2018-11-28 11:45:39 +00:00
from get_args import args
2018-10-25 10:06:33 +00:00
2018-11-10 18:53:27 +00:00
logger = logging.getLogger()
2018-10-25 10:06:33 +00:00
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
2019-01-15 16:25:13 +00:00
2018-10-25 10:06:33 +00:00
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)
2019-01-15 16:25:13 +00:00
2018-10-25 10:06:33 +00:00
def formatException(self, record):
return ''
2018-11-15 13:39:55 +00:00
def configure_logging(debug=False):
if not debug:
log_level = "INFO"
else:
log_level = "DEBUG"
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
logger.handlers = []
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
logger.setLevel(log_level)
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
# Console logging
ch = logging.StreamHandler()
cf = (debug and logging.Formatter or NoExceptionFormatter)(
'%(asctime)-15s - %(name)-32s (%(thread)x) : %(levelname)s (%(module)s:%(lineno)d) - %(message)s')
2018-11-10 18:53:27 +00:00
ch.setFormatter(cf)
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
ch.setLevel(log_level)
# ch.addFilter(MyFilter())
logger.addHandler(ch)
2019-01-15 16:25:13 +00:00
2018-11-15 13:39:55 +00:00
# File Logging
2018-10-25 10:06:33 +00:00
global fh
2018-11-28 11:45:39 +00:00
fh = TimedRotatingFileHandler(os.path.join(args.config_dir, 'log/bazarr.log'), when="midnight", interval=1,
2018-10-25 10:06:33 +00:00
backupCount=7)
f = OneLineExceptionFormatter('%(asctime)s|%(levelname)-8s|%(name)-32s|%(message)s|',
'%d/%m/%Y %H:%M:%S')
fh.setFormatter(f)
fh.addFilter(BlacklistFilter())
2018-11-10 18:53:27 +00:00
fh.addFilter(PublicIPFilter())
2019-01-15 16:25:13 +00:00
2018-11-15 13:39:55 +00:00
if debug:
2018-10-25 11:56:02 +00:00
logging.getLogger("apscheduler").setLevel(logging.DEBUG)
2018-10-25 10:06:33 +00:00
logging.getLogger("subliminal").setLevel(logging.DEBUG)
2018-11-28 11:45:39 +00:00
logging.getLogger("subliminal_patch").setLevel(logging.DEBUG)
logging.getLogger("subzero").setLevel(logging.DEBUG)
2018-10-25 11:56:02 +00:00
logging.getLogger("git").setLevel(logging.DEBUG)
logging.getLogger("apprise").setLevel(logging.DEBUG)
2018-10-25 10:06:33 +00:00
else:
2018-10-25 11:56:02 +00:00
logging.getLogger("apscheduler").setLevel(logging.WARNING)
2018-10-25 10:06:33 +00:00
logging.getLogger("subliminal").setLevel(logging.CRITICAL)
logging.getLogger("subliminal_patch").setLevel(logging.CRITICAL)
logging.getLogger("subzero").setLevel(logging.ERROR)
2018-10-25 11:56:02 +00:00
logging.getLogger("enzyme").setLevel(logging.CRITICAL)
2018-10-25 10:06:33 +00:00
logging.getLogger("guessit").setLevel(logging.WARNING)
logging.getLogger("rebulk").setLevel(logging.WARNING)
logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL)
2018-11-30 02:24:48 +00:00
logging.getLogger("geventwebsocket.handler").setLevel(logging.WARNING)
2018-11-10 18:53:27 +00:00
fh.setLevel(log_level)
logger.addHandler(fh)
2018-11-10 18:53:27 +00:00
class MyFilter(logging.Filter):
def __init__(self):
2018-11-28 12:31:16 +00:00
super(MyFilter, self).__init__()
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
def filter(self, record):
if record.name != 'root':
2018-11-28 12:31:16 +00:00
return 0
return 1
2018-10-25 10:06:33 +00:00
class ArgsFilteringFilter(logging.Filter):
def filter_args(self, record, func):
if isinstance(record.args, (types.ListType, types.TupleType)):
final_args = []
for arg in record.args:
if not isinstance(arg, basestring):
final_args.append(arg)
continue
2019-01-15 16:25:13 +00:00
final_args.append(func(arg))
record.args = type(record.args)(final_args)
elif isinstance(record.args, dict):
for key, arg in record.args.items():
if not isinstance(arg, basestring):
continue
2019-01-15 16:25:13 +00:00
record.args[key] = func(arg)
class BlacklistFilter(ArgsFilteringFilter):
2018-10-25 10:06:33 +00:00
"""
Log filter for blacklisted tokens and passwords
"""
2018-11-28 13:03:28 +00:00
APIKEY_RE = re.compile(r'apikey(?:=|%3D)([a-zA-Z0-9]+)')
2019-01-15 16:25:13 +00:00
2018-10-25 10:06:33 +00:00
def __init__(self):
2018-11-28 11:45:39 +00:00
super(BlacklistFilter, self).__init__()
2019-01-15 16:25:13 +00:00
2018-10-25 10:06:33 +00:00
def filter(self, record):
2018-11-28 12:31:16 +00:00
def mask_apikeys(s):
2018-11-28 13:03:28 +00:00
apikeys = self.APIKEY_RE.findall(s)
2018-11-28 12:31:16 +00:00
for apikey in apikeys:
s = s.replace(apikey, 8 * '*' + apikey[-2:])
2018-11-28 12:31:16 +00:00
return s
2019-01-15 16:25:13 +00:00
2018-10-25 10:06:33 +00:00
try:
2018-11-28 13:03:28 +00:00
record.msg = mask_apikeys(record.msg)
self.filter_args(record, mask_apikeys)
2018-10-25 10:06:33 +00:00
except:
pass
2018-11-28 12:31:16 +00:00
return 1
2018-10-25 10:06:33 +00:00
class PublicIPFilter(ArgsFilteringFilter):
2018-11-10 18:53:27 +00:00
"""
Log filter for public IP addresses
"""
2018-11-28 13:03:28 +00:00
IPV4_RE = re.compile(r'[0-9]+(?:\.[0-9]+){3}(?!\d*-[a-z0-9]{6})')
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
def __init__(self):
2018-11-28 11:45:39 +00:00
super(PublicIPFilter, self).__init__()
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
def filter(self, record):
2018-11-28 12:31:16 +00:00
def mask_ipv4(s):
2018-11-28 13:03:28 +00:00
ipv4 = self.IPV4_RE.findall(s)
2018-11-28 12:31:16 +00:00
for ip in ipv4:
s = s.replace(ip, ip.partition('.')[0] + '.***.***.***')
return s
2019-01-15 16:25:13 +00:00
2018-11-10 18:53:27 +00:00
try:
# Currently only checking for ipv4 addresses
2018-11-28 13:03:28 +00:00
record.msg = mask_ipv4(record.msg)
self.filter_args(record, mask_ipv4)
2018-11-10 18:53:27 +00:00
except:
pass
2019-01-15 16:25:13 +00:00
2018-11-28 12:31:16 +00:00
return 1
2018-11-10 18:53:27 +00:00
2018-10-25 10:06:33 +00:00
def empty_log():
2018-12-15 00:36:28 +00:00
fh.doRollover()