2017-09-28 122 views
0

我想配置使用dictConfig和配置SQLAlchemy的記錄,我的燒瓶應用等與蟒蛇燒瓶日誌記錄問題

我有一個YAML文件,如下

version: 1 

root: 
    handlers: [console] 
    level: INFO 


loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    clportal: 
    level: INFO 
    handlers: [console] 
    propagate: false 

handlers: 
    console: 
    class: logging.StreamHandler 
    formatter: standard 
    level: INFO 
    stream: ext://sys.stdout 

formatters: 
    standard: 
    format: '%(asctime)s %(levelname)-8s %(name)-10s: %(message)s' 

其中我日誌通過執行以下內容:

def create_app(): 
    app = Flask('clportal') 
    configure_logging() 
    app.logger.info('from app.logger') 
    app.config.from_pyfile('config.py') 
    app.secret_key = app.config["SECRET_KEY"] 
    finjector = FlaskInjector(app=app, modules=[ConfigurationModule(app)]) 
    app.injector = finjector 
    #app.logger.setLevel(app.config['LOG_LEVEL']) 
    # add stdout handler (used for docker etc) 
    #stdout_handler = logging.StreamHandler(sys.stdout) 
    # stdout_handler.setFormatter(logging.Formatter('%(message)s')) 
    #app.logger.addHandler(stdout_handler) 
    #app.logger.info('Set up correctly now?') 
    return app 


def configure_logging(): 
    logging.config.dictConfig(yaml.load(open(os.path.join(APP_PATH, 'logconfig.yml'), 'r'))) 

通過app.logger.info進行記錄只有在註釋掉create_app函數中的這些行時纔有效。

我很想能夠通過yaml文件配置我所有的日誌記錄。任何想法,爲什麼這不工作?

enter image description here

回答

0

這是因爲app.logger的名字是不是真的"app.logger"。如果您嘗試打印app.logger.name,您會發現它的真實姓名。你應該在logconfig.yml使用該名稱,例如:

loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    real_name: 
    level: INFO 
    handlers: [console] 
    propagate: false 

或者您也可以使用自定義記錄器來替換默認記錄:

# python scirpt 
logger = logging.getLogger("what_ever_you_want") 
app.logger = logger 

# logconfig.yml 
loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    what_ever_you_want: 
    level: INFO 
    handlers: [console] 
    propagate: false 
+0

感謝@sraw我已經正確設置了名,但仍然沒有骰子。添加了上面的截圖,以查看實際存在的內容。似乎被以某種方式覆蓋? – Cameron

+0

@Cameron所以我認爲你已經解決了這個問題?你介意接受我的回答嗎? – Sraw

0

我已經通過http://flask.pocoo.org/docs/dev/logging/試着做它作爲第一步,但那對我不起作用。

相反,我發現要做到以下幾點。通過使用語句訪問app.logger來啓動默認日誌記錄器,然後使用yaml文件運行配置日誌記錄,並且所有日誌都會很好。如果我在創建應用程序之前通過yaml完成配置,如幫助中指定的那樣,它將不會覆蓋默認處理程序。

def create_app(): 
    app = Flask('clportal') 
    app.logger.info('initing app.logger') 
    logging.config.dictConfig(yaml.load(open(os.path.join(APP_PATH, 'logconfig.yml'), 'r'))) 
    app.logger.info('app logger has now been reset') 
    app.config.from_pyfile(os.path.join(APP_PATH, 'config.py')) 
    app.secret_key = app.config["SECRET_KEY"] 
    finjector = FlaskInjector(app=app, modules=[ConfigurationModule(app)]) 
    app.injector = finjector 
    return app 

if __name__ == '__main__': 
    create_app().run() 

和我的工作YAML

version: 1 
disable_existing_loggers: true 
root: 
    handlers: [console] 
    level: INFO 


loggers: 
    sqlalchemy.engine: 
    level: WARN 
    propagate: false 
    handlers: [] 
    clportal: 
    level: INFO 
    handlers: [console] 
    propagate: false 

handlers: 
    console: 
    class: logging.StreamHandler 
    formatter: standard 
    level: INFO 
    stream: ext://sys.stdout 

formatters: 
    standard: 
    format: '%(asctime)s %(levelname)-8s %(name)-10s: %(message)s'