Source code for pyworkflow.utils.log

#!/usr/bin/env python
# **************************************************************************
# *
# * Authors:     Antonio Poza (Apr 30, 2013)
# *
# * Unidad de  Bioinformatica of Centro Nacional de Biotecnologia , CSIC
# *
# * This program is free software; you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
# * the Free Software Foundation; either version 3 of the License, or
# * (at your option) any later version.
# *
# * This program is distributed in the hope that it will be useful,
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# * GNU General Public License for more details.
# *
# * You should have received a copy of the GNU General Public License
# * along with this program; if not, write to the Free Software
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# * 02111-1307  USA
# *
# *  All comments concerning this program package may be sent to the
# *  e-mail address 'scipion@cnb.csic.es'
# *
# **************************************************************************
import os
import sys
import logging
import logging.config


from pyworkflow.utils import makeFilePath


[docs]def getLogConfiguration(): from pyworkflow import Config # Log configuration config = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': '%(asctime)s %(levelname)s: %(message)s' # TODO: use formattime to show the time less verbose }, 'fileFormat': { 'format': '%(asctime)s %(levelname)s: %(message)s' }, }, 'handlers': { 'fileHandler': { 'level': 'NOTSET', 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'standard', 'filename': Config.SCIPION_LOG, 'maxBytes': 100000, }, 'consoleHandler': { 'level': 'NOTSET', 'class': 'logging.StreamHandler', 'formatter': 'standard', }, }, 'loggers': { '': { 'handlers': ['consoleHandler', 'fileHandler'], 'level': 'INFO', 'propagate': False, 'qualname': 'pyworkflow', }, } } # Create the log folder os.makedirs(Config.SCIPION_LOGS, exist_ok=True) logging.config.dictConfig(config) return config
[docs]class ScipionLogger: def __init__(self, filePath=''): """ If filePath is empty string, the general logger is used. """ self._filePath = filePath makeFilePath(self._filePath) self.config = getLogConfiguration() if self._filePath not in self.config['loggers']: self.config['handlers'][self._filePath] = { 'level': 'NOTSET', 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'fileFormat', 'filename': self._filePath, 'maxBytes': 100000} self.config['loggers'][self._filePath] = { 'handlers': [self._filePath], 'level': 'NOTSET', 'propagate': False} # Note: if we want to see in the console what we also have in # run.log, add 'consoleHandler' to the list of 'handlers'. logging.config.dictConfig(self.config) self._log = logging.getLogger(self._filePath)
[docs] def getLog(self): return self._log
[docs] def getLogString(self): return open(self._filePath, 'r').readlines()
[docs] def info(self, message, redirectStandard=False, *args, **kwargs): if redirectStandard: print(message) sys.stdout.flush() self._log.info(message, *args, **kwargs)
[docs] def warning(self, message, redirectStandard=False, *args, **kwargs): if redirectStandard: print(message) sys.stdout.flush() self._log.warning(message, *args, **kwargs)
[docs] def error(self, message, redirectStandard=False, *args, **kwargs): if redirectStandard: sys.stderr.write(message + '\n') sys.stderr.flush() self._log.error(message, *args, **kwargs)
[docs] def close(self): if self._filePath in self.config['loggers']: del self.config['handlers'][self._filePath] del self.config['loggers'][self._filePath]