2013-03-28 12 views
5

Aşağıdaki kod var:Her zaman dictConfig kullanarak proje klasöründe günlük dosyası oluşturmak için YAML'de nasıl belirtilir? Benim Python programında

def main(): 
    # The file's path 
    path = os.path.dirname(os.path.realpath(__file__)) 
    ... 
    # Config file relative to this file 
    loggingConf = open('{0}/configs/logging.yml'.format(path), 'r') 
    logging.config.dictConfig(yaml.load(loggingConf)) 
    loggingConf.close() 
    logger = logging.getLogger(LOGGER) 
    ... 

ve bu benim logging.yml yapılandırma dosyasıdır:

version: 1 
formatters: 
    default: 
    format: '%(asctime)s %(levelname)s %(name)s %(message)s' 
handlers: 
    console: 
    class: logging.StreamHandler 
    level: DEBUG 
    formatter: default 
    stream: ext://sys.stdout 
    file: 
    class : logging.FileHandler 
    formatter: default 
    filename: bot.log 
loggers: 
    cloaked_chatter: 
    level: DEBUG 
    handlers: [console, file] 
    propagate: no 

sorun bot.log dosya oluşturulur ki programı başlatıldı. Her zaman projenin klasöründe, yani Python programımla aynı klasörde oluşturulmasını istiyorum. Örneğin, programı ./bot.py ile başlatmak, günlük dosyasını aynı klasörde oluşturacaktır. Ancak, python3 path/bot.py ile başlatıldığında, günlük dosyası, dosya hiyerarşisindeki Python programının üstünde bir düzey oluşturur.

Bunu çözmek için dosya dosyasında dosya adını nasıl yazmalıyım? Veya özel bir işleyici yazmam gerekiyor mu? Öyleyse nasıl? Veya bu dictConfig kullanarak çözmek mümkün değil mi?

+1

Cevabınızı yorumunuza yanıt olarak güncelledim. –

cevap

5

İstediğinizi gerçekleştirebileceğiniz çeşitli yollar vardır. Senaryonun bitişik olması logging.yml taşındı

import os 
import yaml 

def logmaker(): 
    path = os.path.dirname(os.path.realpath(__file__)) 
    path = os.path.join(path, 'bot.log') 
    return logging.FileHandler(path) 

def main(): 
    # The file's path 
    path = os.path.dirname(os.path.realpath(__file__)) 

    # Config file relative to this file 
    loggingConf = open('{0}/logging.yml'.format(path), 'r') 
    logging.config.dictConfig(yaml.load(loggingConf)) 
    loggingConf.close() 
    logger = logging.getLogger('cloaked_chatter') 
    logger.debug('Hello, world!') 

if __name__ == '__main__': 
    main() 

Not: Örneğin bir yolu işleyicisi için özel Başlatıcı yapmaktır. logmaker, özel başlatıcıdır. şöyle YAML bunu belirtin: Python komut dosyasını çalıştırırsanız

version: 1 
formatters: 
    default: 
    format: '%(asctime)s %(levelname)s %(name)s %(message)s' 
handlers: 
    console: 
    class: logging.StreamHandler 
    level: DEBUG 
    formatter: default 
    stream: ext://sys.stdout 
    file: 
    () : __main__.logmaker 
    formatter: default 
loggers: 
    cloaked_chatter: 
    level: DEBUG 
    handlers: [console, file] 
    propagate: no 

, sen bot.log senaryo ve YAML dosyaya bitişik oluşturulduğunu bulmalısınız.

2013-04-16 11:08:11,178 DEBUG cloaked_chatter Hello, world! 

N.B.: aynı mesaj konsol ve bot.log yazdırılır Senaryo biraz daha düzenli olabilir ama benim amacım bu.

Güncelleme:the documentation gereğince, sözlükte bir anahtar olarak () kullanılması değeri esas işleyicisi için özel bir yapıcısı olan bir çağrılabilir olduğunu gösterir.

+1

YAML kodunda, '():' '__main __. Logmaker' ın önünde ne anlama gelir? –

İlgili konular