2013-06-13 92 views
3

我正在使用燒瓶和werkzeug。監視sqlalchemy發出的sql語句我已經設置了一個logging.basicConfig()記錄器,並附加了before_cursor_execute事件來監視SQL語句。但是現在werkzeug也將日誌記錄附加到記錄器,這不是我想要的。 所以我的日誌看起來像這樣...(不想要的WERKZEUG消息)如何防止werkzeug記錄

INFO:root:SELECT anon_1.heartbeat_id AS anon_1_heartbeat_id 
FROM (SELECT heartbeat.id AS heartbeat_id FROM heartbeat ORDER BY stamp desc LIMIT ? 
OFFSET ?) AS anon_1 ORDER BY heartbeat_name 
INFO:werkzeug:127.0.0.1 - - [13/Jun/2013 12:10:52] "GET/HTTP/1.1" 200 - 

在WERKZEUG文檔,我無法找到任何記錄。這裏是我使用的代碼。

logging.basicConfig(filename='sql.log', level=logging.INFO) 
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): 
    logging.info(statement) 
event.listen(engine, "before_cursor_execute", before_cursor_execute) 

回答

4

嘗試這樣的事情,而不是(未經測試):

import logging 
logger = logging.getLogger('sql') 
logger.addHandler(logging.StreamHandler('sql.log')) 
logger.setLevel(logging.INFO) 

def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): 
    logger.info(statement) 
event.listen(engine, "before_cursor_execute", before_cursor_execute) 

你要做的就是簡單地創建一個不同的記錄,使他們不要混淆,這應該解決您遇到的問題: )

+0

清楚了吧,WERKZEUG利用全球記錄的,我應該從一個 – Paul

5

Sqlalchemy使用「sqlalchemy.engine」記錄器。 配置它,你可以做到以下幾點:

lg = logging.getLogger('sqlalchemy.engine') 
lg.setLevel(logging.INFO) 

lh = logging.StreamHandler() 
lh.setFormatter(logging.Formatter('YOUR FORMAT HERE')) 

lg.add_handler(lh) 

之後,您可以使用

logging.getLogger('sqlalchemy.engine') 
logging.info('your sql statement') 
+0

這是遠離有用的信息,我不知道如何利用sqlalchemy正在使用的日誌記錄。 – Paul