Source code for cpnest.utils
import os
import logging
# Default formats and level names
FORMATTER = logging.Formatter(
'%(asctime)s - %(name)-38s: %(message)s',
datefmt='%Y-%m-%d, %H:%M:%S'
)
LEVELS = ['CRITICAL', 'WARNING', 'INFO', 'DEBUG']
LOGGER = logging.getLogger('cpnest.utils')
class _Handler(logging.Handler):
def __init__(self, verbose=0, **kwargs):
super().__init__(**kwargs)
self.set_verbosity(verbose)
self.setFormatter(FORMATTER)
def get_verbosity(self):
return self._verbose
def set_verbosity(self, verbose):
LOGGER.warning('Setting verbosity to {}'.format(verbose))
self._verbose = verbose
self.setLevel(LEVELS[verbose])
[docs]class StreamHandler(_Handler, logging.StreamHandler):
def __init__(self, verbose=0, **kwargs):
super().__init__(verbose=verbose, **kwargs)
[docs]class FileHandler(_Handler, logging.FileHandler):
def __init__(self, filename, verbose=0, **kwargs):
super().__init__(filename=filename, verbose=verbose, **kwargs)
[docs]class LogFile:
"""
Context manager for file logging. It logs everything from `logger`
in some file at a given `filename`.
Parameters
----------
filename : str
Filename under which to save the log.
verbose : int, optional
Logging level verbosity 0='CRITICAL' 1='WARNING' 2='INFO' 3='DEBUG'.
loggername : str, optional
Name of the logger to send to file at `path`. Default is `'cpnest'` so
all cpnest logs are recorded. E.g. specify `'cpnest.cpnest'` to only
record logs from the `cpnest.py` module.
Attributes
----------
handler : logging.FileHandler
File handler object.
Examples
--------
```python
from cpnest.utils import LogFile
with LogFile('example.log') as flog:
# Do some stuff here and it will be logged to 'example.log'
...
# Do some stuff here and it won't be logged to 'example.log'
with flog:
# Do some stuff here and it will be logged to 'example.log'
...
```
"""
def __init__(self, filename, verbose=0, loggername='cpnest'):
self._filename = filename
self._verbose = verbose
self._logger = logging.getLogger(loggername)
self.handler = None
[docs] def open(self):
self.handler = FileHandler(self._filename, verbose=self._verbose)
self._logger.addHandler(self.handler)
[docs] def close(self):
self._logger.removeHandler(self.handler)
self.handler.close()
self.handler = None
def __enter__(self):
self.open()
return self
def __exit__(self, type, value, traceback):
self.close()