2012-03-27 21 views
6

Zaman içinde bir sürü komut yazdım ve kodları DRY kodunda tutmak için yeniden yazım aşamasındayım. Şu anda çeşitli komut bu satırlar boyunca bir şey kullanıyorum: (yani "modül") her komut bu tekrarlayarak daha ziyadePython: Farklı modülden aynı dosyaya giriş yapmanın doğru yolu

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) 

, bu logger başlatılması çeşitli tek bir yere yapılması ve erişilen istiyorum komut dosyaları (Hmm, belki de bir singleton sınıfında mı?). Ben (yani tek çekirdek modülü içinde logger başlatma kodu koymak) o yapamazsa

, ben logging.FileHandler() çağrısında aynı günlük dosyası adını kullanarak, çeşitli komut yazacak varsayalım aynı dosyaya.

Bu varsayım doğru mu?

Son olarak, en az değil, bu sorunu çözmek için en iyi yöntem (yani Pythonic) yolu nedir? Birçok yerde böyle bir init koduna sahip olmak,

+0

İlgili:: böyle programlamak içinde

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 

Şimdi işlevi çağırmak [Birden modüllerden Python günlüğü sorunlarını] (http://stackoverflow.com/questions/7341538/) –

+0

İlgili: [Python: günlüğe kaydetme modülü - global olarak] (http://stackoverflow.com/questions/7621897/) –

cevap

-1

(...) addHandler() will not add a handler if the handler already exist.

Ben (yani tek çekirdek modülünde logger başlatma kodu koymak) bu kadar

yapabilirsiniz yapmak ve yapamıyorsanız size çalıştırılan başlatma kodu sağlamak istiyorsanız bunu yapmak gerekir bir Zamanlar.

+0

Bence bu yanıtı atlıyorsun (https) : // stackoverflow.com/a/6334064/39396) "addHandler(), işleyici zaten varsa bir işleyici eklemez" dediğinizde. Söyledikleriniz, yalnızca aynı işleyici nesnesi (bu cevapta hdlr) olması durumunda doğrudur. İşleyiciler her seferinde oluşturulmuşsa, söyledikleriniz doğru değildir. (Aynı soruya [bu yanıtı] (https://stackoverflow.com/a/31800084/39396) bakın.) Bu soruda, her dosya yeni bir işleyici oluşturabilir ('logging.FileHandler (...)') cevabınız yanlış. –

1

if __name__ == __main__ kullandığınız göz önüne alındığında, bu komut dosyalarının farklı işlemler olarak çalıştığını varsayıyorum. Bu durumda, ayrı bir yapılandırma dosyası kullanmalısınız.

Bu yapılandırma, dokümanda belirtilen biçimde bir dosyada saklanabilir. Ardından dosyayı yüklemek için logging.config.fileConfig'u kullanabilirsiniz. JSON/YAML formatlarında saklanan konfigürasyona sahip olabilir, onu bir sözlüke dönüştürebilir ve logging.config.dictConfig kullanarak yükleyebilirsiniz. İkincisi şu anki tavsiye yaklaşımıdır; Daha fazla bilgi için this'u okuyun. Bir yapılandırma dosyası yaklaşımı kullanmanın

avantajları birçok katlama şunlardır: Bu sizin kodundan ayrı yapılandırma ayarlarını tutan

  1. Onlar kolay saklanır olmayan programcılar, yapılandırma değişiklik yapmanızı sağlar
  2. formatlarını okumak için, daha önce bahsettiğiniz gibi kendinizi tekrar etmenizi önler.
0

aşağıda gibi piton modülünde bir işlev oluşturun:

job_name = 'dbinit' 
log_file = '/var/logs/tmp/foo.log' 
logger = createLogHandler(job_name ,log_file) 
logger.info('Logger has been created') 
İlgili konular