Le script suivant, log1.py
:
import logging, sys
class SingleLevelFilter(logging.Filter):
def __init__(self, passlevel, reject):
self.passlevel = passlevel
self.reject = reject
def filter(self, record):
if self.reject:
return (record.levelno != self.passlevel)
else:
return (record.levelno == self.passlevel)
h1 = logging.StreamHandler(sys.stdout)
f1 = SingleLevelFilter(logging.INFO, False)
h1.addFilter(f1)
rootLogger = logging.getLogger()
rootLogger.addHandler(h1)
h2 = logging.StreamHandler(sys.stderr)
f2 = SingleLevelFilter(logging.INFO, True)
h2.addFilter(f2)
rootLogger.addHandler(h2)
logger = logging.getLogger("my.logger")
logger.setLevel(logging.DEBUG)
logger.debug("A DEBUG message")
logger.info("An INFO message")
logger.warning("A WARNING message")
logger.error("An ERROR message")
logger.critical("A CRITICAL message")
lorsqu'il est exécuté, produit les résultats suivants.
C:\\temp>log1.py
A DEBUG message
An INFO message
A WARNING message
An ERROR message
A CRITICAL message
Comme on peut s'y attendre, puisque sur un terminal sys.stdout
y sys.stderr
sont les mêmes. Maintenant, redirigeons stdout vers un fichier, tmp
:
C:\\temp>log1.py >tmp
A DEBUG message
A WARNING message
An ERROR message
A CRITICAL message
Ainsi, le message INFO n'a pas été imprimé sur le terminal - mais les messages adressés à sys.stderr
ont a été imprimé. Voyons ce qu'il y a dans tmp
:
C:\\temp>type tmp
An INFO message
Cette approche semble donc faire ce que vous voulez.
1 votes
Si vous aimez une réponse, la façon normale de répondre est de l'accepter - c'est-à-dire de la marquer comme acceptée :-)