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?