values example disable_existing_loggers python logging printing stdout

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

Redirigir la salida de Python ''print'' a Logger


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)