Source code for cellpy.log
"""Set up logger instance"""
import datetime
import json
import logging
import logging.config
import os
import pathlib
import shutil
import tempfile
import warnings
from cellpy import prms
logging.raiseExceptions = False
[docs]
def setup_logging(
default_level=None,
default_json_path=None,
env_key="LOG_CFG",
custom_log_dir=None,
reset_big_log=False,
max_size=5_000_000,
testing=False,
):
"""Setup logging configuration.
Args:
default_level: default log-level to screen (std.out).
default_json_path: path to config file for setting up logging.
env_key (str): use this environment prm to try to get default_json_path.
custom_log_dir: path for saving logs.
reset_big_log (bool): reset log if too big (max_size).
max_size (int): if reset_log, this is the max limit.
testing (bool): set as True if testing, and you don't want to create any .log files
"""
if default_level is None:
default_level = "CRITICAL"
if not default_json_path:
default_json_path = os.path.join(
os.path.dirname(os.path.realpath(__file__)), "logging.json"
)
path = default_json_path
value = os.getenv(env_key, None)
if value:
path = value
# loading logging configs
if os.path.exists(path):
with open(path, "rt") as f:
config = json.load(f)
if testing:
log_dir = tempfile.mkdtemp()
elif custom_log_dir:
log_dir = custom_log_dir
else:
log_dir = os.path.abspath(prms.Paths.filelogdir)
if not os.path.isdir(log_dir):
warning_txt = (
"\nCould not set custom log-dir - "
"non-existing directory"
f"\nDir: {log_dir}"
"\nUsing current directory instead: "
f"{os.getcwd()}"
)
logging.warning(warning_txt)
log_dir = os.getcwd()
for file_handler in [
"error_file_handler",
"info_file_handler",
"debug_file_handler",
]:
try:
file_name = config["handlers"][file_handler]["filename"]
logging.debug("Setting file handlers for logging.")
logging.debug(f"Filename: {file_name}")
logging.debug(f"Full path: {os.path.join(log_dir,file_name)}")
# print(f"Filename: {file_name}")
# print(f"Full path: {os.path.join(log_dir,file_name)}")
config["handlers"][file_handler]["filename"] = os.path.join(
log_dir, file_name
)
if reset_big_log:
full_log_file_path = pathlib.Path(log_dir) / file_name
if full_log_file_path.is_file():
file_size = full_log_file_path.lstat().st_size
if file_size > max_size:
d_str = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M")
new_file_name = "_".join([d_str, file_name])
new_full_log_file_path = (
pathlib.Path(log_dir) / new_file_name
)
shutil.copy(full_log_file_path, new_full_log_file_path)
else:
logging.debug(
"Could not reset big log: could not find the file"
)
except Exception as e:
warnings.warn(f"\nCould not set custom log-dir{e}")
if default_level:
w_txt = "\nCould not set custom default level for logger"
if default_level not in [
"INFO",
"DEBUG",
"CRITICAL",
logging.INFO,
logging.DEBUG,
logging.CRITICAL,
]:
_txt = "\nonly 'INFO', 'DEBUG' and 'CRITICAL' is supported"
_txt += " as default_level"
warnings.warn(w_txt + _txt)
else:
try:
config["handlers"]["console"]["level"] = default_level
if default_level in ["DEBUG", logging.DEBUG]:
config["handlers"]["console"]["formatter"] = "stamped"
except Exception as e:
warnings.warn(w_txt + "\n" + str(e))
logging.config.dictConfig(config)
else:
if not default_level:
default_level = logging.CRITICAL
logging.basicConfig(level=default_level)
if __name__ == "__main__":
setup_logging()