How to catch the ConnectionRefusedError when using HTTPHandler in Python logging module?

74 Views Asked by At

Python logging module is not raising exception when target url is not reachable while using http type handler.

logger.py file

import logging
class MyLogger:

    def __init__(self):
        global loggers_dict
        loggers_dict = {}

    def get_me_a_logger(self, _name, _level, _log_file, _addHttpHandler: bool = False, _webServerIP='127.0.0.1', _webServerPort: str = '8000'):
        global loggers_dict
        if loggers_dict.get(_name):
            return loggers_dict.get(_name)
        else:
            logger = logging.getLogger(_name)

            # create a file handler
            LogFileHandler = WatchedFileHandler(filename=_log_file, mode='a')
            if _addHttpHandler:
                httpHandler = HTTPHandler(host=f'{_webServerIP}:{_webServerPort}',
                                          url=f'http://{_webServerIP}:{_webServerPort}/logserver',
                                          method='POST',
                                          secure=False,
                                          credentials=None,
                                          context=None)

            if 'CRITICAL' in _level:
                logger.setLevel(logging.CRITICAL)
                LogFileHandler.setLevel(logging.CRITICAL)
                if _addHttpHandler:
                    httpHandler.setLevel(logging.CRITICAL)
            elif 'ERROR' in _level:
                logger.setLevel(logging.ERROR)
                LogFileHandler.setLevel(logging.ERROR)
                if _addHttpHandler:
                    httpHandler.setLevel(logging.ERROR)
            elif 'WARNING' in _level:
                logger.setLevel(logging.WARNING)
                LogFileHandler.setLevel(logging.WARNING)
                if _addHttpHandler:
                    httpHandler.setLevel(logging.WARNING)
            elif 'INFO' in _level:
                logger.setLevel(logging.INFO)
                LogFileHandler.setLevel(logging.INFO)
                if _addHttpHandler:
                    httpHandler.setLevel(logging.INFO)
            elif 'DEBUG' in _level:
                logger.setLevel(logging.DEBUG)
                LogFileHandler.setLevel(logging.DEBUG)
                if _addHttpHandler:
                    httpHandler.setLevel(logging.DEBUG)
            # create a logging format
            setLogFormat = logging.Formatter('%(asctime)s; %(process)d; %(name)s; %(module)s; %(levelname)s; %(funcName)s; %(lineno)d; %(message)s')
            LogFileHandler.setFormatter(setLogFormat)
            if _addHttpHandler:
                httpHandler.setFormatter(setLogFormat)
            # add the file handler to the logger
            logger.addHandler(LogFileHandler)
            if _addHttpHandler:
                logger.addHandler(httpHandler)
            loggers_dict[_name] = logger
            return logger

main.py file:


import logger
localLogger = logging.get_me_a_logger('my_logger_XYZ', logging_level = 'INFO',                            log_file, True, http_logging_ip, http_logging_port)

try: 
    localLogger.info('This is test message')
except Exception:
    print('There is some exception')
else:
    print('all good')

Note: Everything goes well when I have a web server active and running i.e. url end point i used while adding HTTPhandler (url=f'http://{_webServerIP}:{_webServerPort}/logserver') is available.

If this is not the case, i get following on console output:

--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib64/python3.9/logging/handlers.py", line 1251, in emit
    h.endheaders()
  File "/usr/lib64/python3.9/http/client.py", line 1280, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib64/python3.9/http/client.py", line 1040, in _send_output
    self.send(msg)
  File "/usr/lib64/python3.9/http/client.py", line 980, in send
    self.connect()
  File "/usr/lib64/python3.9/http/client.py", line 946, in connect
    self.sock = self._create_connection(
  File "/usr/lib64/python3.9/socket.py", line 844, in create_connection
    raise err
  File "/usr/lib64/python3.9/socket.py", line 832, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
Call stack:
  File "/root/main.py", line 394, in <module>
    if start_logging():
  File "/root/main.py", line 158, in start_logging
    localLogger.info('This is test message')
Message: "'This is test message'"
Arguments: ()

I am trying to catch the 'ConnectionRefusedError: [Errno 111] Connection refused' and unable to do so. If i am able to catch this exception, i can remove the HTTPHandler from my logger and move forward with watchedfilehandler only.

any help?

0

There are 0 best solutions below