2012-03-27 11 views
6

Napisałem kilka skryptów z biegiem czasu i jestem w trakcie refatorowania skryptów, aby zachować kod DRY. Obecnie używam coś wzdłuż tych linii w różnych scenariuszy:Python: poprawny sposób logowania do tego samego pliku z różnych modułów.

if __name__ == '__main__': 
    logger = logging.getLogger('dbinit') 
    hdlr = logging.FileHandler('/var/logs/tmp/foo.log') 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.WARNING) 

Zamiast powtarzać to w każdym skrypcie (czyli „moduł”), chciałbym mieć to rejestrator inicjalizacji zrobić jeden gdzieś i dostępne przez różne skrypty (Hmm, może owinąć klasę singleton?).

Jeśli nie mogę tego zrobić (tj umieścić kod inicjalizacji rejestrator w jednym module core), zakładam, że za pomocą tej samej nazwy pliku dziennika w logging.FileHandler() rozmowy, różne skrypty napisze do tego samego pliku.

Czy to założenie jest prawidłowe?

Ostatnia, ale nie najmniej ważna, jaka jest najlepsza praktyka (np. Pythonic) sposób rozwiązania tego problemu?

+0

related: [kwestii rejestrowania Pythona z wielu modułów] (http://stackoverflow.com/questions/7341538/) –

+0

Powiązane: [Python: moduł logowania - globalnie] (http://stackoverflow.com/questions/7621897/) –

Odpowiedz

-1

(...) addHandler() will not add a handler if the handler already exist więc posiadanie takiego kodu w wielu miejscach nie zaszkodzi.

Jeśli nie mogę tego zrobić (tj umieścić kod inicjalizacji rejestrator w jednym module rdzenia)

Można do tego i trzeba to zrobić, jeśli chcesz mieć pewność, kod inicjalizacji jest uruchamiany pewnego razu.

+0

Myślę, że odwołujesz się [do tej odpowiedzi] (https) ://przepełnienie stosu.com/a/6334064/39396) gdy powiesz "addHandler() nie doda handler'a, jeśli handler już istnieje". To, co mówisz, jest prawdziwe, tylko jeśli jest to ten sam obiekt obsługi ('hdlr' w tej odpowiedzi). To, co mówisz, nie jest prawdą, jeśli procedury obsługi są tworzone za każdym razem. (Zobacz [tę odpowiedź] (https://stackoverflow.com/a/31800084/39396) na to samo pytanie.) W tym pytaniu, gdzie każdy plik może utworzyć nowy handler ('logging.FileHandler (...)') twoja odpowiedź jest niepoprawna. –

1

Biorąc pod uwagę, że używasz if __name__ == __main__, zakładam, że te skrypty będą działać jako różne procesy. W takim przypadku powinieneś użyć oddzielnego pliku konfiguracyjnego.

Ta konfiguracja może być przechowywana w pliku w formacie określonym w dokumentacji. Następnie możesz użyć logging.config.fileConfig, aby załadować plik. Możesz również zapisać konfigurację w formatach JSON/YAML, przekonwertować ją na słownik i wczytać za pomocą logging.config.dictConfig. To ostatnie jest obecnie zalecanym podejściem, chociaż uważam, że ten pierwszy jest bardziej bezpośredni. Przeczytaj this, aby uzyskać więcej informacji.

Korzyści z zastosowania podejścia plik konfiguracyjny wiele krotnie:

  1. Zachowuje ustawienia konfiguracyjne oddzielone od kodu
  2. To pozwala nie-programistów dokonać zmian w konfiguracji, ponieważ są one przechowywane w łatwy do odczytu formatów
  3. Utrzymuje to również od powtarzania się, o czym już wspomniałeś.
0

utworzyć funkcję w module python jak poniżej:

def createLogHandler(job_name,log_file): 
    logger = logging.getLogger(job_name) 
    ## create a file handler ## 
    handler = logging.FileHandler(log_file) 
    ## create a logging format ## 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
    handler.setFormatter(formatter) 
    logger.addHandler(handler) 
    return logger 

Teraz wywołać funkcję w zaprogramować tak:

job_name = 'dbinit' 
log_file = '/var/logs/tmp/foo.log' 
logger = createLogHandler(job_name ,log_file) 
logger.info('Logger has been created') 
Powiązane problemy