-
Notifications
You must be signed in to change notification settings - Fork 80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add logging final version #893
Changes from 34 commits
fe75f9c
08550d6
ea42f95
f54641c
10dee45
e0aa707
d5493f1
0d1ec65
8ee6308
04fee16
b5203cf
06c9d80
b29e4ef
abddbd7
c25396c
bd9ba0d
57f02c9
78af3fa
f1a3dfc
7d6f25e
a2b834d
fd434b2
783cbad
8736c11
cf740e8
18921a9
ba795fe
935d4a3
af46472
36da4d2
d357fff
3051b4b
ca076df
50668b9
e129be1
05fa733
e5bfd23
f857e65
ca64876
f425289
1364c22
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
version: 1 | ||
formatters: | ||
detailed: | ||
format: "%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(funcName)s:%(lineno)d - %(message)s" | ||
datefmt: "%Y-%m-%d %H:%M:%S" | ||
log_colors: | ||
DEBUG: "white" | ||
INFO: "green" | ||
WARNING: "yellow" | ||
ERROR: "red" | ||
CRITICAL: "bold_red" | ||
simple: | ||
(): colorlog.ColoredFormatter | ||
format: "%(log_color)s%(asctime)s - %(levelname)s - %(message)s" | ||
datefmt: "%Y-%m-%d %H:%M:%S" | ||
filters: | ||
warnings_filter: | ||
(): logging.Filter | ||
name: "py.warnings" | ||
info_only_filter: | ||
(): GANDLF.utils.gandlf_logger.InfoOnlyFilter | ||
handlers: | ||
stdoutHandler: # only display info level | ||
class: logging.StreamHandler | ||
level: INFO | ||
formatter: simple | ||
filters: [info_only_filter] | ||
stream: ext://sys.stdout | ||
stderrHandler: # display warning and above messages | ||
class: logging.StreamHandler | ||
level: WARNING | ||
formatter: detailed | ||
stream: ext://sys.stderr | ||
rotatingFileHandler: | ||
class: logging.handlers.RotatingFileHandler | ||
level: DEBUG | ||
formatter: detailed | ||
maxBytes: 10485760 | ||
benmalef marked this conversation as resolved.
Show resolved
Hide resolved
|
||
backupCount: 2 | ||
loggers: # you can add your customized logger | ||
debug_logger: | ||
level: DEBUG | ||
handlers: [stdoutHandler, rotatingFileHandler, stderrHandler] | ||
propagate: no | ||
root: | ||
level: DEBUG | ||
handlers: [stdoutHandler, rotatingFileHandler, stderrHandler] |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -68,3 +68,4 @@ | |
) | ||
|
||
from .data_splitter import split_data | ||
from .gandlf_logger import gandlf_logger_setup, InfoOnlyFilter |
sarthakpati marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,87 @@ | ||||||||||||||||||||||||||||||||||||||
import logging | ||||||||||||||||||||||||||||||||||||||
import yaml | ||||||||||||||||||||||||||||||||||||||
from pathlib import Path | ||||||||||||||||||||||||||||||||||||||
from importlib import resources | ||||||||||||||||||||||||||||||||||||||
import colorlog | ||||||||||||||||||||||||||||||||||||||
import tempfile | ||||||||||||||||||||||||||||||||||||||
from GANDLF.utils import get_unique_timestamp | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
def _flush_to_console(): | ||||||||||||||||||||||||||||||||||||||
formatter = colorlog.ColoredFormatter( | ||||||||||||||||||||||||||||||||||||||
"%(log_color)s%(asctime)s - %(levelname)s - %(message)s", | ||||||||||||||||||||||||||||||||||||||
datefmt="%Y-%m-%d %H:%M:%S", | ||||||||||||||||||||||||||||||||||||||
log_colors={ | ||||||||||||||||||||||||||||||||||||||
"DEBUG": "blue", | ||||||||||||||||||||||||||||||||||||||
"INFO": "green", | ||||||||||||||||||||||||||||||||||||||
"WARNING": "yellow", | ||||||||||||||||||||||||||||||||||||||
"ERROR": "red", | ||||||||||||||||||||||||||||||||||||||
"CRITICAL": "bold_red", | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||
console_handler = logging.StreamHandler() | ||||||||||||||||||||||||||||||||||||||
console_handler.setFormatter(formatter) | ||||||||||||||||||||||||||||||||||||||
logging.root.setLevel(logging.DEBUG) | ||||||||||||||||||||||||||||||||||||||
logging.root.addHandler(console_handler) | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes if we don't want to flush to the console, the function is no longer needed. |
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
def _create_tmp_log_file(): | ||||||||||||||||||||||||||||||||||||||
tmp_dir = Path(tempfile.gettempdir()) | ||||||||||||||||||||||||||||||||||||||
log_dir = Path.joinpath(tmp_dir, ".gandlf") | ||||||||||||||||||||||||||||||||||||||
log_dir.mkdir(parents=True, exist_ok=True) | ||||||||||||||||||||||||||||||||||||||
log_file = Path.joinpath(log_dir, get_unique_timestamp() + ".log") | ||||||||||||||||||||||||||||||||||||||
_create_log_file(log_file) | ||||||||||||||||||||||||||||||||||||||
return log_file | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
def _create_log_file(log_file): | ||||||||||||||||||||||||||||||||||||||
log_file = Path(log_file) | ||||||||||||||||||||||||||||||||||||||
log_file.write_text("Starting GaNDLF logging session \n") | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
def _save_logs_in_file(log_file, config_path): | ||||||||||||||||||||||||||||||||||||||
with resources.open_text("GANDLF", config_path) as file: | ||||||||||||||||||||||||||||||||||||||
config_dict = yaml.safe_load(file) | ||||||||||||||||||||||||||||||||||||||
config_dict["handlers"]["rotatingFileHandler"]["filename"] = str(log_file) | ||||||||||||||||||||||||||||||||||||||
logging.config.dictConfig(config_dict) | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
def gandlf_logger_setup(log_file=None, config_path="logging_config.yaml"): | ||||||||||||||||||||||||||||||||||||||
benmalef marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||
It sets up the logger. Reads from logging_config. | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||
log_file (str): dir path for saving the logs, defaults to `None`, at which time logs are flushed to console. | ||||||||||||||||||||||||||||||||||||||
config_path (str): file path for the configuration | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
logging.captureWarnings(True) | ||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||
if log_file is None: # create tmp file | ||||||||||||||||||||||||||||||||||||||
log_tmp_file = _create_tmp_log_file() | ||||||||||||||||||||||||||||||||||||||
_save_logs_in_file(log_tmp_file, config_path) | ||||||||||||||||||||||||||||||||||||||
logging.info(f"The logs are saved in {log_tmp_file}") | ||||||||||||||||||||||||||||||||||||||
else: # create the log file | ||||||||||||||||||||||||||||||||||||||
_create_log_file(log_file) | ||||||||||||||||||||||||||||||||||||||
_save_logs_in_file(log_file, config_path) | ||||||||||||||||||||||||||||||||||||||
except Exception as e: | ||||||||||||||||||||||||||||||||||||||
_flush_to_console() | ||||||||||||||||||||||||||||||||||||||
logging.error(f"log_file:{e}") | ||||||||||||||||||||||||||||||||||||||
logging.warning("The logs will be flushed to console") | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would suggest the following execution order for clarity (also,
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, this code is cleaner. Thanks for the refactor.! |
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
class InfoOnlyFilter(logging.Filter): | ||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||
Display only INFO messages. | ||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
def filter(self, record): | ||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||
Determines if the specified record is to be logged. | ||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||
record (logging.LogRecord): The log record to be evaluated. | ||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||
bool: True if the log record should be processed, False otherwise. | ||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||
return record.levelno == logging.INFO |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's remove redundant old loglevel stuff here