diff --git a/electrumx/lib/env_base.py b/electrumx/lib/env_base.py index df50113..7468426 100644 --- a/electrumx/lib/env_base.py +++ b/electrumx/lib/env_base.py @@ -8,9 +8,10 @@ '''Class for server environment configuration and defaults.''' -import logging from os import environ +from electrumx.lib.util import class_logger + class EnvBase(object): '''Wraps environment configuration.''' @@ -19,8 +20,7 @@ class EnvBase(object): pass def __init__(self): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = class_logger(__name__, self.__class__.__name__) self.allow_root = self.boolean('ALLOW_ROOT', False) self.host = self.default('HOST', 'localhost') self.rpc_host = self.default('RPC_HOST', 'localhost') diff --git a/electrumx/lib/server_base.py b/electrumx/lib/server_base.py index 654165d..43bcc2a 100644 --- a/electrumx/lib/server_base.py +++ b/electrumx/lib/server_base.py @@ -6,13 +6,14 @@ # and warranty status of this software. import asyncio -import logging import os import signal import sys import time from functools import partial +from electrumx.lib.util import class_logger + class ServerBase(object): '''Base class server implementation. @@ -36,8 +37,7 @@ class ServerBase(object): '''Save the environment, perform basic sanity checks, and set the event loop policy. ''' - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = class_logger(__name__, self.__class__.__name__) self.env = env # Sanity checks diff --git a/electrumx/lib/util.py b/electrumx/lib/util.py index 43a8a44..c41dc4c 100644 --- a/electrumx/lib/util.py +++ b/electrumx/lib/util.py @@ -38,6 +38,7 @@ from struct import pack, Struct # Logging utilities + class ConnectionLogger(logging.LoggerAdapter): '''Prepends a connection identifier to a logging message.''' def process(self, msg, kwargs): @@ -53,12 +54,19 @@ class CompactFormatter(logging.Formatter): def make_logger(name, *, handler, level): + '''Return the root ElectrumX logger.''' logger = logging.getLogger(name) logger.addHandler(handler) logger.setLevel(logging.INFO) logger.propagate = False return logger + +def class_logger(path, classname): + '''Return a hierarchical logger for a class.''' + return logging.getLogger(path).getChild(classname) + + # Method decorator. To be used for calculations that will always # deliver the same result. The method cannot take any arguments # and should be accessed as an attribute. diff --git a/electrumx/server/block_processor.py b/electrumx/server/block_processor.py index 7aaf019..5983ee3 100644 --- a/electrumx/server/block_processor.py +++ b/electrumx/server/block_processor.py @@ -11,14 +11,13 @@ import array import asyncio -import logging from struct import pack, unpack import time from functools import partial from electrumx.server.daemon import DaemonError from electrumx.lib.hash import hash_to_str, HASHX_LEN -from electrumx.lib.util import chunks, formatted_time +from electrumx.lib.util import chunks, formatted_time, class_logger import electrumx.server.db @@ -26,8 +25,7 @@ class Prefetcher(object): '''Prefetches blocks (in the forward direction only).''' def __init__(self, bp): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = class_logger(__name__, self.__class__.__name__) self.bp = bp self.caught_up = False # Access to fetched_height should be protected by the semaphore diff --git a/electrumx/server/daemon.py b/electrumx/server/daemon.py index 767df89..0c39c88 100644 --- a/electrumx/server/daemon.py +++ b/electrumx/server/daemon.py @@ -10,7 +10,6 @@ daemon.''' import asyncio import json -import logging import time from calendar import timegm from struct import pack @@ -18,7 +17,7 @@ from time import strptime import aiohttp -from electrumx.lib.util import int_to_varint, hex_to_bytes +from electrumx.lib.util import int_to_varint, hex_to_bytes, class_logger from electrumx.lib.hash import hex_str_to_hash from aiorpcx import JSONRPC @@ -37,8 +36,7 @@ class Daemon(object): '''Raised when the daemon returns an error in its results.''' def __init__(self, env): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = class_logger(__name__, self.__class__.__name__) self.coin = env.coin self.set_urls(env.coin.daemon_urls(env.daemon_url)) self._height = None diff --git a/electrumx/server/db.py b/electrumx/server/db.py index 1fed44f..256e607 100644 --- a/electrumx/server/db.py +++ b/electrumx/server/db.py @@ -11,7 +11,6 @@ import array import ast -import logging import os from struct import pack, unpack from bisect import bisect_right @@ -42,8 +41,7 @@ class DB(object): '''Raised on general DB errors generally indicating corruption.''' def __init__(self, env): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = util.class_logger(__name__, self.__class__.__name__) self.env = env self.coin = env.coin diff --git a/electrumx/server/history.py b/electrumx/server/history.py index 011840d..2b7b282 100644 --- a/electrumx/server/history.py +++ b/electrumx/server/history.py @@ -13,7 +13,6 @@ import ast import bisect from collections import defaultdict from functools import partial -import logging from struct import pack, unpack import electrumx.lib.util as util @@ -25,8 +24,7 @@ class History(object): DB_VERSIONS = [0] def __init__(self): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = util.class_logger(__name__, self.__class__.__name__) # For history compaction self.max_hist_row_entries = 12500 self.unflushed = defaultdict(partial(array.array, 'I')) diff --git a/electrumx/server/mempool.py b/electrumx/server/mempool.py index 5bfa374..2987bc5 100644 --- a/electrumx/server/mempool.py +++ b/electrumx/server/mempool.py @@ -9,11 +9,11 @@ import asyncio import itertools -import logging import time from collections import defaultdict from electrumx.lib.hash import hash_to_str, hex_str_to_hash +from electrumx.lib.util import class_logger from electrumx.server.daemon import DaemonError from electrumx.server.db import UTXO @@ -33,8 +33,7 @@ class MemPool(object): ''' def __init__(self, bp, controller): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = class_logger(__name__, self.__class__.__name__) self.daemon = bp.daemon self.controller = controller self.coin = bp.coin diff --git a/electrumx/server/peers.py b/electrumx/server/peers.py index 93b041e..5849bc3 100644 --- a/electrumx/server/peers.py +++ b/electrumx/server/peers.py @@ -8,7 +8,6 @@ '''Peer management.''' import asyncio -import logging import random import socket import ssl @@ -19,7 +18,7 @@ from functools import partial from aiorpcx import ClientSession, RPCError, SOCKSProxy, ConnectionError from electrumx.lib.peer import Peer -from electrumx.lib.util import ConnectionLogger +from electrumx.lib.util import ConnectionLogger, class_logger PEER_GOOD, PEER_STALE, PEER_NEVER, PEER_BAD = range(4) @@ -224,8 +223,7 @@ class PeerManager(object): Issues a 'peers.subscribe' RPC to them and tells them our data. ''' def __init__(self, env, controller): - self.logger = logging.getLogger(__name__)\ - .getChild(self.__class__.__name__) + self.logger = class_logger(__name__, self.__class__.__name__) # Initialise the Peer class Peer.DEFAULT_PORTS = env.coin.PEER_DEFAULT_PORTS self.env = env