2012-01-04 38 views
11

Python günlüğümün bir dosyadan yapılandırılmasını yapıyorum (bkz. http://www.python.org/doc//current/library/logging.html#configuration-file-format). i formatlayıcı belirten "biçim" dizesinde bir yeni satır koymak nasılPython günlüğe kaydetme: günlüğe kaydetme yapılandırma dosyasındaki biçim dizisindeki yeni satırların nasıl gösterileceği?

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

: o sayfadaki örnekte itibaren

i benziyor yapılandırma dosyasında birformatlayıcı var? Ne \n ne de \\n ne çalışır (ör. format=F1\n%(asctime)s %(levelname)s %(message)s çalışmıyor). Teşekkür

+5

Kayıt sırasında yeni satırlar? Lütfen yapma. Günlük dosyası grep için çok zor olacak. – fabrizioM

+0

@fabrizioM Doğru, ancak bu soru için alakasız. –

cevap

0

özel biçimlendirici (yerine logging.Formatter ait) ... Başvuru için, burada logging.Formatter.format için kaynak kodu kullanarak olurdu Benim iyi bahis:

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 

Bence gayet net oluyor eğer, self._fmt bir metin dosyasından (tek satır) okunduğunda, herhangi bir çeşit eskime mümkün olmaz. Belki, logging.Formatter uzanacak bu yöntemi geçersiz kılmak ve böyle bir şey için 4 satır yerine kullanabilirsiniz: Eğer başka şeyler de kaçmış istiyorsanız,

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

veya daha genel bir şey.

DÜZENLEME: alternatif olarak bunu, bir defa (bir iletinin her biçimlendirilmesi yerine) init yönteminde yapabilirsiniz. Ancak diğerleri zaten işaret ettiği gibi, ConfigParser birden fazla satırı destekler, bu nedenle bu rotaya gitmeye gerek yok ...

7

logging.config modülü, ConfigParser yapılandırma dosyalarını okur, bu da çok satırlı değerler için destek içerir.

Yani bunun gibi format dize belirtebilirsiniz:

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

Multilines değerleri aşağıdaki satırları girintileyerek devam edilir (bir veya daha fazla boşluk veya sekme bir girinti olarak saymak).

5

Günlük yapılandırma dosyası, ConfigParser modülünü temel alır. İşte böyle bunu çözebilir bulacaksınız:

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

Bu kolay bir yol olabilir: tahlil

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) 

, yukarıdaki ayar bunun gibi her günlüğü mesajı için iki yeni hat verir kodlarda gösterilir. Not: %(asctime)s ve bunun gibi şeyler python günlük biçimlendirme dizeleridir. dosyada

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) 

ayıklama metni yeni hat ile yazılır.

İlgili konular