# Copyright French Alternative Energies and Atomic Energy Commission
# Contributors: valjean developers
# valjean-support@cea.fr
#
# This software is a computer program whose purpose is to analyze and
# post-process numerical simulation results.
#
# This software is governed by the CeCILL license under French law and abiding
# by the rules of distribution of free software. You can use, modify and/ or
# redistribute the software under the terms of the CeCILL license as circulated
# by CEA, CNRS and INRIA at the following URL: http://www.cecill.info.
#
# As a counterpart to the access to the source code and rights to copy, modify
# and redistribute granted by the license, users are provided only with a
# limited warranty and the software's author, the holder of the economic
# rights, and the successive licensors have only limited liability.
#
# In this respect, the user's attention is drawn to the risks associated with
# loading, using, modifying and/or developing or reproducing the software by
# the user in light of its specific status of free software, that may mean that
# it is complicated to manipulate, and that also therefore means that it is
# reserved for developers and experienced professionals having in-depth
# computer knowledge. Users are therefore encouraged to load and test the
# software's suitability as regards their requirements in conditions enabling
# the security of their systems and/or data to be ensured and, more generally,
# to use and operate it in the same conditions as regards security.
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license and that you accept its terms.
'''Top-level module for the valjean package.'''
import logging
import sys
from contextlib import contextmanager
from pkg_resources import get_distribution, DistributionNotFound
try:
__version__ = get_distribution(__name__).version
except DistributionNotFound:
__version__ = 'unknown'
logging.NOTE = 15
logging.addLevelName(logging.NOTE, "NOTE")
[docs]def note(self, message, *args, **kwargs):
"""New results level function"""
if self.isEnabledFor(logging.NOTE):
# pylint: disable=protected-access
self._log(logging.NOTE, message, args, **kwargs)
logging.Logger.note = note
def _configure_logger(logger, level=logging.INFO):
_formatter = ValjeanFormatter(LOG_CONSOLE_FORMAT)
_handler = logging.StreamHandler(sys.stdout)
_handler.setFormatter(_formatter)
_handler.setLevel(level)
logger.addHandler(_handler)
logger.setLevel(level)
LOGGER = logging.getLogger(__name__)
LOG_CONSOLE_FORMAT = '%(levelname)9.9s %(module)12.12s: %(message)s'
LOG_FILE_FORMAT = ('%(levelname)9.9s (%(module)10.10s/%(funcName)12.12s) '
'%(asctime)19s: %(message)s')
_configure_logger(LOGGER)
[docs]def set_log_level(level):
'''Set the verbosity level for the default logger.'''
LOGGER.setLevel(level)
for handler in LOGGER.handlers:
handler.setLevel(level)
[docs]def get_logger(module):
'''Get logger for the given module'''
logger = logging.getLogger(module)
return logger
[docs]def set_logger_level(module, level=logging.INFO):
'''Set the verbosity level for the required module logger.
:param str module: module name
:param int level: logger level (logging.DEBUG, logging.NOTE, \
logging.INFO, logging.WARNING, logging.ERROR)
'''
logger = get_logger(module)
logger.setLevel(level)
[docs]@contextmanager
def local_logger_level(module, level):
'''Set the verbosity level for the required module logger in a context
case.
:param str module: module name
:param int level: logger level (logging.DEBUG, logging.NOTE, \
logging.INFO, logging.WARNING, logging.ERROR)
'''
logger = get_logger(module)
log_level = (logger.getEffectiveLevel() if module == 'valjean'
else logging.NOTSET)
try:
logger.setLevel(level)
for handler in logger.handlers:
handler.setLevel(level)
yield
finally:
logger.setLevel(log_level)