2011-01-18 28 views
12

Python'da üç sınıfım var ve farklı iş parçacıklarında çalışıyorlar. Tüm dosyalardan aynı dosyaya çıkış yapmak istiyorum. Şu anda ana sınıfta çıkış yöntemini oluşturdum ve kuruculardan diğer sınıflara geçirdim. Daha iyi halletmenin bir yolu var mı? Kaydediciyi kullanmak dışında, logger'ı sınıflar arasında nasıl geçebilirim?Python sınıfları arasında oturum açma

Belki de python Java'da statik yöntem gibi bir şeyleri destekler, böylece her üç sınıfta da Logger.info (mesaj) gibi yazabilirim?

başka yolu da muhtemelen yani

logger = open('debug.txt', 'w') 
sys.stdout = logger 

Sonra kullanarak çağrıları tüm sınıflarda sys.stdout belirterek, dosyaya küresel sys.stdout yönlendirme olabilir.

Ne düşünüyorsunuz?

cevap

23
import logging 
log = logging.getLogger("mylog") 
log.setLevel(logging.DEBUG) 

formatter = logging.Formatter(
    "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s") 
# Alternative formatting available on python 3.2+: 
# formatter = logging.Formatter(
#  "{asctime} {threadName:>11} {levelname} {message}", style='{') 

# Log to file 
filehandler = logging.FileHandler("debug.txt", "w") 
filehandler.setLevel(logging.DEBUG) 
filehandler.setFormatter(formatter) 
log.addHandler(filehandler) 

# Log to stdout too 
streamhandler = logging.StreamHandler() 
streamhandler.setLevel(logging.INFO) 
streamhandler.setFormatter(formatter) 
log.addHandler(streamhandler) 

# Test it 
log.debug("Some message") 
log.error("An error!") 
try: 
    something() 
except: 
    log.exception("An exception occured!") 

Ve debug.txt olsun:

 
2011-01-18 12:07:24,943 MainThread DEBUG  Some message 
2011-01-18 12:07:24,943 MainThread ERROR  An error! 
2011-01-18 12:07:24,943 MainThread ERROR  An exception occured! 
Traceback (most recent call last): 
    File "./logtest.py", line 17, in 
    something() 
NameError: name 'something' is not defined 

mesajlar günlük dosyasında görünme sırası kaydetmekte olduğunuzu ne zaman oldu sıraya tam olarak karşılık olmayabilir Not birkaç iş parçacığından.

+1

@lazyr. Cevap için teşekkür ederim. Günlük nesnesini sınıflar arasında nasıl geçirebilirim, böylece üç dosyanın tümü ve aynı günlük dosyasına yazılır? – yart

+1

Yukarıdaki kodun ayrı bir dosyada var, yani log.py, sonra diğer modüllerimin her birinde "günlük içe aktarma günlüğünden" gidiyorum. Python yalnızca bir kez bir modül yükler - ilk önce yalnızca önceden yüklenmiş olanı getirdikten sonra herhangi bir içe aktarma ifadesi - böylece tüm ileti dizilerinizde aynı günlük nesnesi olur. –

+4

@lazyr: 'logging' modülünde, bunu yapmanıza gerek yoktur -' logging' modülü kendi modülünde oluşturduğu kaydediciyi tutar. Başka bir modülde 'logging.getLogger'ı tekrar çalıştırabilir ve aynı nesneyi elde edersiniz. – nosklo