Added logging functions

* Logging is always initialized if importing the whole package
* Support switching to DEBUG mode
* Support changing the log dir (and optionally log name)
This commit is contained in:
2Shirt 2019-07-07 22:09:22 -06:00
parent 4cc54011b7
commit acd92b3e50
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
4 changed files with 97 additions and 6 deletions

View file

@ -8,11 +8,13 @@ from wk import exe
from wk import hw
from wk import io
from wk import kit
from wk import log
from wk import net
from wk import os
from wk import std
from wk import sw
# Check env
if sys.version_info < (3, 5):
# Unsupported
@ -27,6 +29,9 @@ if sys.version_info < (3, 7):
**sys.version_info,
))
# Init
log.start()
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,4 +1,4 @@
'''WizardKit: cfg module init'''
from wk.cfg import logging
from wk.cfg import log
from wk.cfg import main

View file

@ -1,16 +1,14 @@
'''WizardKit: Config - Logging'''
'''WizardKit: Config - Log'''
# vim: sts=2 sw=2 ts=2
import logging
DEBUG = {
'level': logging.DEBUG,
'level': 'DEBUG',
'format': '[%(asctime)s %(levelname)s] [%(name)s.%(funcName)s] %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S %z',
}
DEFAULT = {
'level': logging.INFO,
'level': 'INFO',
'format': '[%(asctime)s %(levelname)s] %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S %z',
}

88
scripts/wk/log.py Normal file
View file

@ -0,0 +1,88 @@
'''WizardKit: Log Functions'''
# vim: sts=2 sw=2 ts=2
import logging
import os
import pathlib
import shutil
import time
from . import cfg
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Functions
def enable_debug_mode():
"""Configures logging for better debugging."""
root_logger = logging.getLogger()
for handler in root_logger.handlers:
formatter = logging.Formatter(
datefmt=cfg.log.DEBUG['datefmt'],
fmt=cfg.log.DEBUG['format'],
)
handler.setFormatter(formatter)
root_logger.setLevel('DEBUG')
def update_log_path(dest_dir, dest_filename=''):
"""Copies current log file to new dir and updates the root logger."""
dest = pathlib.Path(dest_dir)
dest = dest.expanduser()
root_logger = logging.getLogger()
cur_handler = root_logger.handlers[0]
# Safety checks
if len(root_logger.handlers) > 1:
raise NotImplementedError('update_log_path() only supports a single handler.')
if not isinstance(cur_handler, logging.FileHandler):
raise NotImplementedError('update_log_path() only supports FileHandlers.')
# Set source
source = pathlib.Path(cur_handler.baseFilename)
source = source.resolve()
# Copy original log to new location
if dest_filename:
dest = dest.joinpath(dest_filename)
else:
dest = dest.joinpath(source.name)
dest = dest.resolve()
os.makedirs(dest.parent, exist_ok=True)
shutil.copy(source, dest)
# Create new cur_handler (preserving formatter settings)
new_handler = logging.FileHandler(dest, mode='a')
new_handler.setFormatter(cur_handler.formatter)
# Replace current handler
root_logger.removeHandler(cur_handler)
root_logger.addHandler(new_handler)
def start(config=None):
"""Configure and start logging using safe defaults."""
log_dir = '{}/Logs/'.format(os.path.expanduser('~'))
log_path = '{}/{}_{}.log'.format(
log_dir,
cfg.main.KIT_NAME_FULL,
time.strftime('%Y-%m-%d_%H%M%z'),
)
root_logger = logging.getLogger()
# Safety checks
if not config:
config = cfg.log.DEFAULT
if root_logger.hasHandlers():
raise UserWarning('Logging already started.')
# Create log_dir
os.makedirs(log_dir, exist_ok=True)
# Config logger
logging.basicConfig(filename=log_path, **config)
if __name__ == '__main__':
print("This file is not meant to be called directly.")