class SocketLogger(BaseLogger): """Send log messages over a socket. Yes, there is a SocketHandler in the logging package, but it is a dumb-ss about forcing every message to be pickled and unpickled -- much easier to just write the messages in a stream over a socket. """ def __init__(self, host=None, port=None, mutex=None): """Connect to server. :param host: Server host, see TCPClient `host` param :param port: Server port, see TCPClient `port` param :param mutex: Mutex to use for thread-safety, may be None :raise: See TCPClient, also ValueError if port is not an int """ kwd = {} if host: kwd['host'] = str(host) if port: kwd['port'] = int(port) self._client = TCPClient(**kwd) self._level = Level.INFO self._fmt = LogWriter(fmt=get_log_format()) self._mtx = mutex if mutex else NullMutex() def set_level(self, level): self._level = level def log(self, level, name, kvp): if level > self._level or self._client is None: return kvp[Keyword.NAME] = name kvp[Keyword.LEVEL] = self._level kvp[Keyword.TIME] = time.time() self._mtx.acquire() try: s = self._fmt.format(kvp) self._client.send(s) finally: self._mtx.release() def close(self): """Close the logger. """ if self._client is None: return self._mtx.acquire() try: del self._client self._client = None finally: self._mtx.release()
def __init__(self, host=None, port=None, mutex=None): """Connect to server. :param host: Server host, see TCPClient `host` param :param port: Server port, see TCPClient `port` param :param mutex: Mutex to use for thread-safety, may be None :raise: See TCPClient, also ValueError if port is not an int """ kwd = {} if host: kwd['host'] = str(host) if port: kwd['port'] = int(port) self._client = TCPClient(**kwd) self._level = Level.INFO self._fmt = LogWriter(fmt=get_log_format()) self._mtx = mutex if mutex else NullMutex()