簡體   English   中英

使用elasticsearch-py記錄

[英]Logging using elasticsearch-py

我想記錄使用elasticsearch-py python腳本。 特別是,我想要三個日志:

  1. 常規日志:將 INFO日志記錄到stdout和文件中。
  2. ES日志:僅ES與文件相關的消息。
  3. ES跟蹤日志 :擴展ES日志記錄(例如,卷曲查詢及其輸出)僅限於文件。

這是我到目前為止:

import logging
import logging.handlers

es_logger = logging.getLogger('elasticsearch')
es_logger.setLevel(logging.INFO)
es_logger_handler=logging.handlers.RotatingFileHandler('top-camps-base.log',
                                                          maxBytes=0.5*10**9,
                                                          backupCount=3)
es_logger.addHandler(es_logger_handler)

es_tracer = logging.getLogger('elasticsearch.trace')
es_tracer.setLevel(logging.DEBUG)
es_tracer_handler=logging.handlers.RotatingFileHandler('top-camps-full.log',
                                                       maxBytes=0.5*10**9,
                                                       backupCount=3)
es_tracer.addHandler(es_tracer_handler)

logger = logging.getLogger('mainLog')
logger.setLevel(logging.DEBUG)
# create file handler
fileHandler = logging.handlers.RotatingFileHandler('top-camps.log',
                                                   maxBytes=10**6,
                                                   backupCount=3)
fileHandler.setLevel(logging.INFO)
# create console handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

我的問題是es_logger INFO消息也顯示在終端上。 事實上,日志消息被保存到正確的文件中!

如果我卸下與logger相關的部分,那么ES記錄工作正常,即只保存到相應的文件。 但后來我沒有其他部分......我在設置的最后一部分做錯了什么?


編輯

可能的提示:在elasticsearch-py的源代碼中,有一個名為logger的記錄logger 它可能與我的沖突嗎? 我試圖在上面的行main_logger logger的名稱更改為main_logger ,但它沒有幫助。

可能暗示2:如果我更換logger = logging.getLogger('mainLog')logger = logging.getLogger()則輸出到控制台的格式es_logger改變和變成等於在所述摘錄中定義的一個。

我認為你被有點令人困惑的記錄器層次結構傳播所打擊。 傳遞給記錄器的loglevel的“elasticsearch.trace”中記錄的所有內容將首先傳播到“elasticsearch”記錄器,然后傳播到root(“”)記錄器。 請注意,一旦消息通過“elasticsearch.trace”記錄器的日志級別,就不會檢查父級(“elasticsearch”和root)的日志級別,但會將所有消息發送給處理程序。 (處理程序本身具有適用的日志級別。)

請考慮以下示例來說明問題,以及可能的解決方案:

import logging

# The following line will basicConfig() the root handler
logging.info('DUMMY - NOT SEEN')
ll = logging.getLogger('foo')
ll.setLevel('DEBUG')
ll.addHandler(logging.StreamHandler())
ll.debug('msg1')
ll.propagate = False
ll.debug('msg2')

輸出:

msg1
DEBUG:foo:msg1
msg2

您會看到“msg1”由“foo”記錄器及其父記錄器(根記錄器)記錄(如“DEBUG:foo:msg1”)。 然后,當在“msg2”之前關閉傳播ll.propagate = False ,根記錄器不再記錄它。 現在,如果您要注釋掉第一行( logging.info("DUMMY...") ,那么行為將會改變,以便不顯示根記錄器行。這是因為logging模塊頂層功能info()debug()等在沒有定義處理程序的情況下使用處理程序配置根記錄器。這也是在你通過執行logger = logging.getLogger()修改根處理程序時在示例中看到不同行為的原因。

我無法在您的代碼中看到您將對根記錄器執行任何操作,但正如您所看到的,代碼或庫代碼中的logging.info()等將導致添加處理程序。

因此,為了回答您的問題,我會將logger.propagate = False設置為對您有意義的記錄器以及您希望傳播的位置,檢查處理程序本身的日志級別是否符合您的要求。

這是一個嘗試:

es_logger = logging.getLogger('elasticsearch')
es_logger.propagate = False
es_logger.setLevel(logging.INFO)
es_logger_handler=logging.handlers.RotatingFileHandler('top-camps-base.log',
                                                      maxBytes=0.5*10**9,
                                                      backupCount=3)
es_logger.addHandler(es_logger_handler)

es_tracer = logging.getLogger('elasticsearch.trace')
es_tracer.propagate = False
es_tracer.setLevel(logging.DEBUG)
es_tracer_handler=logging.handlers.RotatingFileHandler('top-camps-full.log',
                                                   maxBytes=0.5*10**9,
                                                   backupCount=3)
es_tracer.addHandler(es_tracer_handler)

logger = logging.getLogger('mainLog')
logger.propagate = False
logger.setLevel(logging.DEBUG)
# create file handler
fileHandler = logging.handlers.RotatingFileHandler('top-camps.log',
                                               maxBytes=10**6,
                                               backupCount=3)
fileHandler.setLevel(logging.INFO)
# create console handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM