support use both loggers

This commit is contained in:
lilydjwg 2018-04-13 23:30:05 +08:00
parent 85288583e1
commit 07fe08c639
2 changed files with 38 additions and 25 deletions

View file

@ -7,6 +7,7 @@ import sys
import configparser
import asyncio
import logging
import structlog
from .lib import nicelogger
@ -22,9 +23,12 @@ def add_common_arguments(parser):
parser.add_argument('-l', '--logging',
choices=('debug', 'info', 'warning', 'error'), default='info',
help='logging level (default: info)')
parser.add_argument('--logger', choices=['pretty', 'json'],
default='pretty',
parser.add_argument('--logger', default='pretty',
choices=['pretty', 'json', 'both'],
help='select which logger to use')
parser.add_argument('--json-log-fd',
type=lambda fd: os.fdopen(int(fd), mode='w'),
help='specify fd to send json logs to. stderr by default')
parser.add_argument('-V', '--version', action='store_true',
help='show version and exit')
parser.add_argument('file', metavar='FILE', nargs='?', type=open,
@ -32,27 +36,34 @@ def add_common_arguments(parser):
def process_common_arguments(args):
'''return True if should stop'''
if args.logger == 'pretty':
processors = [
slogconf.exc_info,
]
logger_factory = None
if args.logger in ['pretty', 'both']:
slogconf.fix_logging()
nicelogger.enable_pretty_logging(
getattr(logging, args.logging.upper()))
structlog.configure(
processors=[
slogconf.exc_info,
slogconf.stdlib_renderer,
],
processors.append(slogconf.stdlib_renderer)
if args.logger == 'pretty':
logger_factory=structlog.PrintLoggerFactory(
file=open(os.devnull, 'w')),
)
else:
structlog.configure(
processors=[
slogconf.exc_info,
structlog.processors.format_exc_info,
slogconf.json_renderer,
],
logger_factory=structlog.PrintLoggerFactory(file=sys.stderr),
)
file=open(os.devnull, 'w'),
)
if args.logger in ['json', 'both']:
processors.extend([
structlog.processors.format_exc_info,
slogconf.json_renderer,
])
if logger_factory is None:
logfile = args.json_log_fd or sys.stderr
logger_factory = structlog.PrintLoggerFactory(file=logfile)
structlog.configure(
processors = processors,
logger_factory = logger_factory,
)
if args.version:
progname = os.path.basename(sys.argv[0])

View file

@ -35,17 +35,19 @@ def exc_info(logger, level, event):
return event
def stdlib_renderer(logger, level, event):
event = _console_msg(event)
logger = logging.getLogger(event.get('logger_name'))
msg = event.pop('msg', event['event'])
exc_info = event.pop('exc_info', None)
# return event unchanged for further processing
std_event = _console_msg(event.copy())
logger = logging.getLogger(std_event.get('logger_name'))
msg = std_event.pop('msg', std_event['event'])
exc_info = std_event.pop('exc_info', None)
getattr(logger, level)(
msg, exc_info = exc_info, extra=event,
msg, exc_info = exc_info, extra=std_event,
)
return ''
return event
_renderer = structlog.processors.JSONRenderer(ensure_ascii=False)
def json_renderer(logger, level, event):
event['level'] = level
return _renderer(logger, level, event)
class _Logger(logging.Logger):