2012-01-04 16 views
11

Konfiguruję logowanie w języku Python z pliku (patrz http://www.python.org/doc//current/library/logging.html#configuration-file-format).Rejestrowanie w języku Python: jak reprezentować znaki nowej linii w pliku formatu w pliku konfiguracyjnym rejestrowania?

Z przykład na tej stronie, mam formatowania w pliku konfiguracyjnym, który wygląda tak:

[formatter_form01] 
format=F1 %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 

Jak umieścić znak nowej linii w „Format” ciąg, który określa formatowania? Ani \n ani \\n nie działa (np. format=F1\n%(asctime)s %(levelname)s %(message)s nie działa). Dzięki

+5

nowe linie w logowaniu? Proszę, nie rób tego. Plik logu będzie bardzo trudny do podrobienia. – fabrizioM

+0

@fabrizioM To prawda, ale nie ma to znaczenia dla tego pytania. –

Odpowiedz

0

Moja Najprościej byłoby przy użyciu niestandardowego formatowania (zamiast logging.Formatter) ... Dla porównania, oto kod źródłowy logging.Formatter.format:

def format(self, record): 
    record.message = record.getMessage() 
    if string.find(self._fmt,"%(asctime)") >= 0: 
     record.asctime = self.formatTime(record, self.datefmt) 
    s = self._fmt % record.__dict__ 
    if record.exc_info: 
     # Cache the traceback text to avoid converting it multiple times 
     # (it's constant anyway) 
     if not record.exc_text: 
      record.exc_text = self.formatException(record.exc_info) 
    if record.exc_text: 
     if s[-1:] != "\n": 
      s = s + "\n" 
     s = s + record.exc_text 
    return s 

Jest całkiem jasne do mnie że jeśli self._fmt zostanie odczytany z pliku tekstowego (pojedyncza linia), żadne eskapowanie nie byłoby możliwe. Może można przedłużyć z logging.Formatter, przesłonić tę metodę i zastąpić 4. wierszu na coś takiego:

s = self._fmt.replace('\\n', '\n') % record.__dict__ 

lub coś bardziej ogólnego, jeśli chcesz inne rzeczy do uciekł jak dobrze.

EDYCJA: alternatywnie można to zrobić w metodzie init, raz (zamiast za każdym razem, gdy formatowana jest wiadomość). Ale jak inni już zauważyli, program ConfigParser obsługuje wiele linii, więc nie trzeba iść tą drogą ...

7

Moduł czyta pliki konfiguracyjne z ConfigParser, który obsługuje wartości wielowierszowe.

Tak można określić ciąg format tak:

[formatter_form01] 
format=F1 
    %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 

wartości wieloliniowe są kontynuowane przez wcięcia następujące wiersze (jeden lub więcej spacji lub klapki liczyć jako tiret).

5

Plik konfiguracji rejestrowania oparty jest na module ConfigParser. Znajdziesz tam można go rozwiązać tak:

[formatter_form01] 
format=F1 
    %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 
0

To może być w prosty sposób:

import logging 
logformat = """%(asctime)s ... here you get a new line 
    ... %(thread)d .... here you get another new line 
    %(message)s""" 
logging.basicConfig(format=logformat, level=logging.DEBUG) 

testowałem, powyższe ustawienie daje dwie nowe linie do każdego komunikatu logowania, ponieważ pokazane w kodach. Uwaga: %(asctime)s i takie rzeczy to ciągi formatowania logów Pythona.

0
import logging 
logformat = "%(asctime)s %(message)s\n\r" 
logging.basicConfig(level=logging.DEBUG, format=logformat,filename='debug.log', filemode='w')   
logging.debug (Your String here) 

Tekst debugowania w pliku zostanie zapisany w nowym wierszu.

Powiązane problemy