So jetzt haben wir viele Python-Skripte und wir versuchen, sie zu konsolidieren und zu beheben und Redundanzen. Eines der Dinge, die wir versuchen zu tun, ist sicherzustellen, dass alle sys.stdout/sys.stderr in das Python Logging Modul gehen.umleiten von sys.stdout zu python logging
Nun ist die Hauptsache ist, wollen wir die folgenden ausgedruckt:
[<ERROR LEVEL>] | <TIME> | <WHERE> | <MSG>
Jetzt sind alle sys.stdout/sys.stderr msgs so ziemlich in allen der Python-Fehlermeldungen sind im Format [LEVEL ] - MSG, die alle mit sys.stdout/sys.stderr geschrieben wurden. Ich kann die Geldbuße analysieren, in meinem sys.stdout-Wrapper und im sys.stderr-Wrapper. Rufen Sie dann die entsprechende Protokollierungsstufe auf, abhängig von der geparsten Eingabe.
Also im Grunde haben wir ein Paket namens foo, und ein Unterpaket namens log. In __init__.py
definieren wir folgendes:
def initLogging(default_level = logging.INFO, stdout_wrapper = None, \
stderr_wrapper = None):
"""
Initialize the default logging sub system
"""
root_logger = logging.getLogger('')
strm_out = logging.StreamHandler(sys.__stdout__)
strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_TIME_FORMAT, \
DEFAULT_LOG_TIME_FORMAT))
root_logger.setLevel(default_level)
root_logger.addHandler(strm_out)
console_logger = logging.getLogger(LOGGER_CONSOLE)
strm_out = logging.StreamHandler(sys.__stdout__)
#strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_MSG_FORMAT, \
# DEFAULT_LOG_TIME_FORMAT))
console_logger.setLevel(logging.INFO)
console_logger.addHandler(strm_out)
if stdout_wrapper:
sys.stdout = stdout_wrapper
if stderr_wrapper:
sys.stderr = stderr_wrapper
def cleanMsg(msg, is_stderr = False):
logy = logging.getLogger('MSG')
msg = msg.rstrip('\n').lstrip('\n')
p_level = r'^(\s+)?\[(?P<LEVEL>\w+)\](\s+)?(?P<MSG>.*)$'
m = re.match(p_level, msg)
if m:
msg = m.group('MSG')
if m.group('LEVEL') in ('WARNING'):
logy.warning(msg)
return
elif m.group('LEVEL') in ('ERROR'):
logy.error(msg)
return
if is_stderr:
logy.error(msg)
else:
logy.info(msg)
class StdOutWrapper:
"""
Call wrapper for stdout
"""
def write(self, s):
cleanMsg(s, False)
class StdErrWrapper:
"""
Call wrapper for stderr
"""
def write(self, s):
cleanMsg(s, True)
Jetzt würde nennen wir dies in einem unserer Skripte zum Beispiel:
import foo.log
foo.log.initLogging(20, foo.log.StdOutWrapper(), foo.log.StdErrWrapper())
sys.stdout.write('[ERROR] Foobar blew')
, die in einem Fehlerprotokoll Nachricht umgewandelt werden würde. Wie:
[ERROR] | 20090610 083215 | __init__.py | Foobar Blew
Nun das Problem ist, wenn wir das tun, das Modul, in dem die Fehlermeldung protokolliert wurde, ist jetzt die __init__
(entsprechend foo.log.__init__.py
-Datei), die den ganzen Zweck besiegt.
Ich habe versucht, eine deepCopy/shallowCopy der stderr/stdout Objekte, aber das tut nichts, es sagt immer noch das Modul die Nachricht in __init__.py
aufgetreten ist. Wie kann ich es so machen, dass dies nicht passiert?