Skip to content
Snippets Groups Projects
Commit 057cb66a authored by Karim Ahmed's avatar Karim Ahmed
Browse files

store info logs separately as well instead of console and refactor for pep8

parent 273b23f6
No related branches found
No related tags found
No related merge requests found
import logging import logging
import os
import sys import sys
import traceback import traceback
import warnings import warnings
import os
import IPython
class ContextFilter(logging.Filter): class ContextFilter(logging.Filter):
...@@ -18,7 +20,8 @@ formatter = logging.Formatter( ...@@ -18,7 +20,8 @@ formatter = logging.Formatter(
'[Notebook: %(notebook)s] - [Directory: %(directory)s] - %(message)s' '[Notebook: %(notebook)s] - [Directory: %(directory)s] - %(message)s'
) )
# Retrieve notebook name and current working directory from environment variables # Retrieve notebook name and current working directory from
# environment variables
NOTEBOOK_NAME = os.getenv('CAL_NOTEBOOK_NAME', 'Unknown notebook') NOTEBOOK_NAME = os.getenv('CAL_NOTEBOOK_NAME', 'Unknown notebook')
CURRENT_WORKING_DIR = os.getenv('CAL_WORKING_DIR', 'Unknown directory') CURRENT_WORKING_DIR = os.getenv('CAL_WORKING_DIR', 'Unknown directory')
...@@ -37,22 +40,23 @@ warning_handler.setLevel(logging.WARNING) ...@@ -37,22 +40,23 @@ warning_handler.setLevel(logging.WARNING)
warning_handler.addFilter(lambda record: record.levelno < logging.ERROR) warning_handler.addFilter(lambda record: record.levelno < logging.ERROR)
warning_handler.setFormatter(formatter) warning_handler.setFormatter(formatter)
# Create console handler for info and debug # In case any info is logged and for logged data
# No formatter used for console handler on purpose. # by other packages like calibration_client.
# console is slurm.out & the notebook output cells. info_handler = logging.FileHandler('info.log')
console_handler = logging.StreamHandler() info_handler.setLevel(logging.DEBUG)
console_handler.setLevel(logging.DEBUG) info_handler.setFormatter(formatter)
# Add the custom filter to handlers # Add the custom filter to handlers
context_filter = ContextFilter() context_filter = ContextFilter()
error_handler.addFilter(context_filter) error_handler.addFilter(context_filter)
warning_handler.addFilter(context_filter) warning_handler.addFilter(context_filter)
console_handler.addFilter(context_filter) info_handler.addFilter(context_filter)
# Add handlers to logger # Add handlers to logger
logger.addHandler(error_handler) logger.addHandler(error_handler)
logger.addHandler(warning_handler) logger.addHandler(warning_handler)
logger.addHandler(console_handler) logger.addHandler(info_handler)
handling_error = False handling_error = False
...@@ -61,7 +65,8 @@ def safe_handle_error(exc_type, exc_value, exc_traceback): ...@@ -61,7 +65,8 @@ def safe_handle_error(exc_type, exc_value, exc_traceback):
global handling_error global handling_error
if handling_error: # Avoid infinite loop of errors. if handling_error: # Avoid infinite loop of errors.
sys.stderr.write("Recursive error detected!\n") sys.stderr.write("Recursive error detected!\n")
traceback.print_exception(exc_type, exc_value, exc_traceback, file=sys.stderr) traceback.print_exception(
exc_type, exc_value, exc_traceback, file=sys.stderr)
return return
handling_error = True handling_error = True
...@@ -70,13 +75,17 @@ def safe_handle_error(exc_type, exc_value, exc_traceback): ...@@ -70,13 +75,17 @@ def safe_handle_error(exc_type, exc_value, exc_traceback):
logger.error( logger.error(
"An error occurred. Exception type: %s, Message: %s", "An error occurred. Exception type: %s, Message: %s",
exc_type.__name__, str(exc_value), exc_type.__name__, str(exc_value),
extra={'notebook': NOTEBOOK_NAME, 'directory': CURRENT_WORKING_DIR}, extra={
'notebook': NOTEBOOK_NAME,
'directory': CURRENT_WORKING_DIR
},
exc_info=(exc_type, exc_value, exc_traceback) exc_info=(exc_type, exc_value, exc_traceback)
) )
except Exception as log_error: except Exception as log_error:
sys.stderr.write(f"Logging failed: {log_error}\n") sys.stderr.write(f"Logging failed: {log_error}\n")
traceback.print_exception(exc_type, exc_value, exc_traceback, file=sys.stderr) traceback.print_exception(
exc_type, exc_value, exc_traceback, file=sys.stderr)
finally: finally:
handling_error = False handling_error = False
...@@ -97,6 +106,9 @@ def handle_warning(message, category, filename, lineno, file=None, line=None): ...@@ -97,6 +106,9 @@ def handle_warning(message, category, filename, lineno, file=None, line=None):
sys.excepthook = safe_handle_error sys.excepthook = safe_handle_error
warnings.showwarning = handle_warning warnings.showwarning = handle_warning
# Override IPython's exception handling # Override IPython's exception handling
import IPython def custom_showtraceback(self, *args, **kwargs):
IPython.core.interactiveshell.InteractiveShell.showtraceback = lambda self, *args, **kwargs: safe_handle_error(*sys.exc_info()) return safe_handle_error(*sys.exc_info())
\ No newline at end of file
IPython.core.interactiveshell.InteractiveShell.showtraceback = custom_showtraceback # noqa
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment