disable_existing_loggers - python logging formatter example
Python, registra declaraciones de impresiĆ³n mientras las imprime en stdout (4)
Tengo un script de Python largo que usa declaraciones de impresión a menudo, me preguntaba si era posible agregar algún código que registraría todas las declaraciones de impresión en un archivo de texto o algo así. Todavía quiero que todas las instrucciones de impresión vayan a la línea de comando a medida que el usuario recibe una instrucción a lo largo del programa. Si es posible, registrar el ingreso del usuario también sería beneficioso.
Encontré esto que en cierto modo responde mi pregunta, pero lo hace donde la instrucción "imprimir" ya no se imprime en la línea de comando
Aquí hay un programa que hace lo que describes:
#! /usr/bin/python3
class Tee:
def write(self, *args, **kwargs):
self.out1.write(*args, **kwargs)
self.out2.write(*args, **kwargs)
def __init__(self, out1, out2):
self.out1 = out1
self.out2 = out2
import sys
sys.stdout = Tee(open("/tmp/log.txt", "w"), sys.stdout)
print("hello")
Si utiliza el módulo de registro incorporado, puede configurar sus registradores con tantas salidas como necesite: para archivar, para bases de datos, para correos electrónicos, etc. Sin embargo, parece que está mezclando impresiones para dos usos diferentes: registro (programa de grabación) flujo para una inspección posterior) y pautas. El trabajo real será dividir esos dos usos de ''imprimir'' en diferentes funciones para que pueda obtener lo que necesita en cada lugar.
Mucha gente reemplaza los sys.stdout y sys.stderr genéricos de python para hacer automáticamente cosas al texto que se envía a la consola. La salida de la consola real siempre vive en sys.__stdout__
y sys.__stderr__
(por lo que no tiene que preocuparse por "perderla" de alguna manera), pero si pega cualquier objeto con los mismos métodos que un archivo en las variables sys.stdout
y sys.stderr
puede hacer lo que quiera con el proceso de salida.
Puedes agregar esto a tu script:
import sys
sys.stdout = open(''logfile'', ''w'')
Esto hará que las instrucciones de impresión escriban en el logfile
de logfile
.
Si desea la opción de imprimir en stdout
y un archivo, puede intentar esto:
class Tee(object):
def __init__(self, *files):
self.files = files
def write(self, obj):
for f in self.files:
f.write(obj)
f = open(''logfile'', ''w'')
backup = sys.stdout
sys.stdout = Tee(sys.stdout, f)
print "hello world" # this should appear in stdout and in file
Para volver a solo imprimir en la consola, simplemente restaure la "copia de seguridad"
sys.stdout = backup
hm ... ¿es difícil implementar su propia función de impresión () y decorador que registrará todo lo que pasa a su función de impresión?
def logger(func):
def inner(*args, **kwargs):
log(*args, **kwargs) # your logging logic
return func(*args, **kwargs)
return inner
@logger
def lprint(string_to_print):
print(string_to_print)