From 9b3f7e133baace5d721b4d34b880f93a57b3d5f0 Mon Sep 17 00:00:00 2001 From: Jack Robison Date: Tue, 15 Oct 2019 12:11:10 -0400 Subject: [PATCH] wallet server error logging with loggly enabled by `LOGGLY_TOKEN` env variable --- lbry/lbry/extras/cli.py | 8 ++++---- torba/torba/loggly_handler.py | 31 +++++++++++++------------------ torba/torba/server/env.py | 1 + torba/torba/server/server.py | 3 +++ 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/lbry/lbry/extras/cli.py b/lbry/lbry/extras/cli.py index 46078f285..b285ecf05 100644 --- a/lbry/lbry/extras/cli.py +++ b/lbry/lbry/extras/cli.py @@ -12,11 +12,13 @@ import aiohttp from aiohttp.web import GracefulExit from docopt import docopt +from torba.loggly_handler import get_loggly_handler from lbry import __version__ as lbrynet_version -from lbry.extras.daemon.loggly_handler import get_loggly_handler from lbry.conf import Config, CLIConfig from lbry.extras.daemon.Daemon import Daemon +LOGGLY_TOKEN = 'BQEzZmMzLJHgAGxkBF00LGD0YGuyATVgAmqxAQEuAQZ2BQH4' + log = logging.getLogger('lbry') @@ -248,9 +250,7 @@ def setup_logging(logger: logging.Logger, args: argparse.Namespace, conf: Config logger.getChild('lbry').setLevel(logging.DEBUG) if conf.share_usage_data: - loggly_handler = get_loggly_handler() - loggly_handler.setLevel(logging.ERROR) - logger.getChild('lbry').addHandler(loggly_handler) + logger.getChild('lbry').addHandler(get_loggly_handler(f'lbrynet-{lbrynet_version}', LOGGLY_TOKEN)) def run_daemon(args: argparse.Namespace, conf: Config): diff --git a/torba/torba/loggly_handler.py b/torba/torba/loggly_handler.py index 896507f0a..b35a46048 100644 --- a/torba/torba/loggly_handler.py +++ b/torba/torba/loggly_handler.py @@ -1,22 +1,24 @@ import asyncio -from aiohttp.client_exceptions import ClientError import json +import codecs +import base64 import logging.handlers -import traceback import aiohttp -from lbry import utils, __version__ +from aiohttp.client_exceptions import ClientError -LOGGLY_TOKEN = 'BQEzZmMzLJHgAGxkBF00LGD0YGuyATVgAmqxAQEuAQZ2BQH4' +def deobfuscate(obfustacated): + return base64.b64decode(codecs.encode(obfustacated, 'rot_13')(obfustacated)).decode() class JsonFormatter(logging.Formatter): """Format log records using json serialization""" def __init__(self, **kwargs): + super().__init__() self.attributes = kwargs - def format(self, record): + def format(self, record: logging.LogRecord): data = { 'loggerName': record.name, 'asciTime': self.formatTime(record), @@ -34,23 +36,15 @@ class JsonFormatter(logging.Formatter): class HTTPSLogglyHandler(logging.Handler): - def __init__(self, loggly_token: str, fqdn=False, localname=None, facility=None, cookies=None): + def __init__(self, loggly_token: str, tag: str, fqdn=False, localname=None, facility=None, cookies=None): super().__init__() self.fqdn = fqdn self.localname = localname self.facility = facility self.cookies = cookies or {} - self.url = "https://logs-01.loggly.com/inputs/{token}/tag/{tag}".format( - token=utils.deobfuscate(loggly_token), tag='lbrynet-' + __version__ - ) + self.url = f"https://logs-01.loggly.com/inputs/{deobfuscate(loggly_token)}/tag/{tag}" self._loop = asyncio.get_event_loop() - self._session = aiohttp.ClientSession() - - def get_full_message(self, record): - if record.exc_info: - return '\n'.join(traceback.format_exception(*record.exc_info)) - else: - return record.getMessage() + self._session = aiohttp.ClientSession(loop=self._loop) async def _emit(self, record, retry=True): data = self.format(record).encode() @@ -76,7 +70,8 @@ class HTTPSLogglyHandler(logging.Handler): pass -def get_loggly_handler(): - handler = HTTPSLogglyHandler(LOGGLY_TOKEN) +def get_loggly_handler(tag: str, token: str, level=logging.ERROR) -> HTTPSLogglyHandler: + handler = HTTPSLogglyHandler(token, tag) handler.setFormatter(JsonFormatter()) + handler.setLevel(level) return handler diff --git a/torba/torba/server/env.py b/torba/torba/server/env.py index c406da84a..6734ddf28 100644 --- a/torba/torba/server/env.py +++ b/torba/torba/server/env.py @@ -29,6 +29,7 @@ class Env: pass def __init__(self, coin=None): + self.loggly_token = self.default('LOGGLY_TOKEN', '') self.logger = class_logger(__name__, self.__class__.__name__) self.allow_root = self.boolean('ALLOW_ROOT', False) self.host = self.default('HOST', 'localhost') diff --git a/torba/torba/server/server.py b/torba/torba/server/server.py index 691b84055..4281dd648 100644 --- a/torba/torba/server/server.py +++ b/torba/torba/server/server.py @@ -4,6 +4,7 @@ import asyncio from concurrent.futures.thread import ThreadPoolExecutor import torba +from torba.loggly_handler import get_loggly_handler from torba.server.mempool import MemPool, MemPoolAPI @@ -67,6 +68,8 @@ class Server: def __init__(self, env): self.env = env self.log = logging.getLogger(__name__).getChild(self.__class__.__name__) + if self.env.loggly_token: + self.log.addHandler(get_loggly_handler('wallet-server', self.env.loggly_token)) self.shutdown_event = asyncio.Event() self.cancellable_tasks = []