2013-06-20 9 views
5

Znalazłem this odpowiedź na pozornie podobny problem, jednak (ponieważ jestem nowicjuszem w Pythonie) nie jestem pewien, jak wdrożyć to rozwiązanie w moim kodzie (jeśli jest to ten sam problem po wszystko).Wiadomości rejestrowania pojawiają się dwa razy w konsoli Python

W moim kodu mam następujący punkt:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        filename='C:\\Tests\\TRACE.log', 
        filemode='a') 
console = logging.StreamHandler() 
console.setLevel(logging.INFO) 
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
console.setFormatter(consoleFormatter) 
logging.getLogger('').addHandler(console) 
localLog = logging.getLogger('text') 

Najśmieszniejsze jest to, że pracował w porządku, ale w pewnym momencie zaczęło się pisanie tych duplikatów wiadomości do konsoli.

Czy ktoś może podać mi kierunek tutaj, proszę?

Odpowiedz

5

Wygląda na to, że znalazłem źródło tego problemu.

Chodzi o to, że używałem loggera na poziomie modułu. Wyglądało to dość logicznie, ale jest pułapka - moduł rejestrowania Pythona szanuje cały utworzony rejestrator przed załadowaniem konfiguracji z pliku. Więc zasadniczo, kiedy importowałem moduł (który używa logującego się wewnętrznie) do kodu głównego (gdzie również dzwoniłem do rejestratora), wynikło strumieniowanie danych rejestratora dwukrotnie.

Możliwe rozwiązania tego problemu są:

  1. Nie zrozumcie rejestratora na poziomie modułu
  2. Ustaw disable_existing_loggers do Fałsz. Dodano ponieważ Python 2.7
5

Zazwyczaj zduplikowane wyciągi z dziennika występują, ponieważ dołączone są dwie oddzielne procedury obsługi, które kierują wyciągami z dziennika do tego samego miejsca. Istnieje kilka rzeczy, które warto spróbować dostać się do źródła problemu:

  1. Wykomentuj wywołanie logging.basicConfig - jeśli ta eliminuje duplikaty oświadczenia dziennika oznacza to, że jest prawdopodobne, że nie trzeba ręcznie skonfigurować drugi moduł obsługi dziennika.
  2. Jeśli korzystasz z IDE, warto wstawić punkt przerwania na wyciąg z dziennika i wkroczyć za pomocą debuggera, aby móc dokonać introspekcji stanu konfiguracji logów pythonów, aby uzyskać dokładniejszy obraz dołączonych różnych procedur obsługi.

Aby dokonać rejestrowanie łatwiejsze do zarządzania, może warto patrząc przenieść konfigurację z kodem i do pliku konfiguracyjnego - dokument Python na logging configuration jest doskonałym miejscem, aby rozpocząć.

+1

Cześć i dzięki za odpowiedź, ale w jaki sposób mogę skomentować wszystkie ' logowanieBasicConfig'? Zawiera obowiązkowe ustawienia jako ścieżkę, format i kod pliku ... –

+1

Odczytując pytanie, wydaje się, że problem polega na tym, że otrzymujesz zduplikowane komunikaty dziennika w konsoli i że rejestrowanie plików nie jest problemem. Podejrzewam, że basicConfig konfiguruje program obsługi dziennika konsoli, a następnie konfigurujesz drugi moduł obsługi dziennika konsoli. Zdecydowanie zaleca przeniesienie konfiguracji rejestrowania do pliku konfiguracyjnego, w którym można bardziej szczegółowo określić konkretną konfigurację. – robjohncox

+1

Warto zwrócić uwagę na to, że logowanie do pliku, konsoli lub dowolnego innego miejsca docelowego nie jest obowiązkowe - rejestrowanie to po prostu sposób kierowania wiadomości do użytecznego miejsca, w którym można je wyświetlać lub przechowywać. Istnieje wiele różnych miejsc, w których możesz chcieć wyślij je (plik i konsola to dwie bardzo typowe opcje). Zdecydowanie zaleca się pracę przy pomocy [zaawansowanego samouczka rejestrowania] (http://docs.python.org/2/howto/logging.html#advanced-logging-tutorial) w dokumentacji Pythona, aby uzyskać solidne wprowadzenie do sposobu działania rejestrowania. – robjohncox

0

miałem taką samą sytuację z mojego konfiguracji rejestratora, poprawka, która kiedyś była:

class Logger: 

@staticmethod 
def setup(name, file_name): 

    log_file = <path to save the file> 
    log_file_max_size = 1024 * 1024 * 20 # megabytes 
    log_num_backups = 3 
    log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" 
    log_filemode = "w" # w: overwrite; a: append 
    logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG) 
    rotate_file = logging.handlers.RotatingFileHandler(
     log_file, maxBytes=log_file_max_size, backupCount=log_num_backups 
    ) 
    logger = logging.getLogger(name) 
    # Console output line. 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.INFO) 
    log_formatter = logging.Formatter(log_format) 
    console_handler.setFormatter(log_formatter) 
    logger.handlers = rotate_file, console_handler 

    return logger 
Powiązane problemy