Skip to content

Commit

Permalink
Merge pull request #166 from martimunicoy/logger_improvements
Browse files Browse the repository at this point in the history
Add handler managers to logger
  • Loading branch information
martimunicoy authored Jun 13, 2022
2 parents c2917e7 + 5dc753f commit 5c041ed
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 10 deletions.
6 changes: 3 additions & 3 deletions examples/alchemistry/ethylene_to_chlorofom.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
Expand All @@ -481,9 +481,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
"version": "3.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
}
55 changes: 55 additions & 0 deletions peleffy/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,61 @@ def test_get_logger_level(self):
level = logger.get_level()
assert level == 'CRITICAL', 'Unexpected Logger level'

def test_stdout_handler(self):
"""
It tests the stdout handler of peleffy's logger.
"""
import io
import logging
from contextlib import redirect_stdout
from peleffy.utils import Logger

# Force a hard reset of logging library and the logger it manages
from importlib import reload
logging.shutdown()
reload(logging)

logger = Logger()

with io.StringIO() as buf:
with redirect_stdout(buf):
logger.set_stdout_handler()

logger.debug('This message must not be printed')
logger.info('This message must be printed')

output = buf.getvalue()

assert output.strip() == 'This message must be printed', \
'Unexpected logger message'

def test_file_handler(self):
"""
It tests the file handler of peleffy's logger.
"""
import logging
from peleffy.utils import Logger
from peleffy.utils import temporary_cd

# Force a hard reset of logging library and the logger it manages
from importlib import reload
logging.shutdown()
reload(logging)

logger = Logger()

with tempfile.TemporaryDirectory() as tmpdir:
with temporary_cd(tmpdir):
logger.set_file_handler('log.txt')

logger.debug('This message must not be printed')
logger.info('This message must be printed')

with open('log.txt') as f:
output = '\n'.join(f.readlines())

assert output.strip() == 'This message must be printed', \
'Unexpected logger message'

class TestOutputPathHandler(object):
"""
Expand Down
73 changes: 66 additions & 7 deletions peleffy/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,16 +411,74 @@ def __init__(self):
if 'peleffy_log' not in logging.root.manager.loggerDict:
self._logger = logging.getLogger('peleffy_log')
self._logger.setLevel(self.DEFAULT_LEVEL)

# Add stream handler
self.set_stdout_handler()
else:
self._logger = logging.getLogger('peleffy_log')

# If no handler is found add stream handler
if not len(self._logger.handlers):
ch = logging.StreamHandler()
ch.setLevel(self.DEFAULT_LEVEL)
formatter = logging.Formatter('%(message)s')
ch.setFormatter(formatter)
self._logger.addHandler(ch)
def set_stdout_handler(self):
"""
It unsets current Logger's handlers and sets the stream handler
that points to the standard output.
"""
import sys
import logging

# Unset current file handlers
self._unset_handlers()

# Initialize stream handler
stream_handler = logging.StreamHandler(sys.stdout)

# Assign logger's level
level = self.get_level()
stream_handler.setLevel(level)

# Set up logger's format
stream_handler.setFormatter(logging.Formatter('%(message)s'))

# Add handler
self._logger.addHandler(stream_handler)

def set_file_handler(self, log_file):
"""
It unsets current Logger's handlers and sets the file handler
that points to the supplied path.
Parameters
----------
log_file : str
Path where to save logger's output
"""
import os
import logging

# Unset current file handlers
self._unset_handlers()

# Initialize file handler
if not os.path.isfile(log_file):
file_handler = logging.FileHandler(log_file, mode="w+")
else:
file_handler = logging.FileHandler(log_file, mode="a")

# Assign logger's level
level = self.get_level()
file_handler.setLevel(level)

# Set up logger's format
file_handler.setFormatter(logging.Formatter('%(message)s'))

# Add handler
self._logger.addHandler(file_handler)

def _unset_handlers(self):
"""
It removes any handler of this Logger.
"""
for handler in self._logger.handlers:
self._logger.removeHandler(handler)

def set_level(self, level):
"""
Expand All @@ -433,6 +491,7 @@ def set_level(self, level):
CRITICAL]
"""
import logging
logging.basicConfig()

if level.upper() == 'DEBUG':
logging_level = logging.DEBUG
Expand Down

0 comments on commit 5c041ed

Please sign in to comment.