【问题标题】:Logging using elasticsearch-py使用 elasticsearch-py 进行日志记录
【发布时间】:2014-10-16 08:35:40
【问题描述】:

我想记录使用elasticsearch-pypython 脚本。特别是,我想要三个日志:

  1. 常规日志:INFO 及更高版本记录到stdout 和文件中。
  2. ES 日志:仅将 ES 相关消息仅写入文件。
  3. ES 跟踪日志:仅将 ES 日志记录(例如 curl 查询及其输出)扩展到文件。

这是我目前所拥有的:

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_loggerINFO 消息也显示在终端上。事实上,日志消息被保存到正确的文件中!

如果我删除了与logger 相关的部分,那么 ES 日志记录工作正常,即只保存到相应的文件中。但是后来我没有其他部分....我在设置的最后一部分做错了什么?


编辑

可能的提示:在elasticsearch-py 的源代码中有一个名为logger 的记录器。会不会和我的有冲突?我尝试在上面的行中将logger 的名称更改为main_logger,但没有帮助。

可能的提示2:如果我将logger = logging.getLogger('mainLog')替换为logger = logging.getLogger(),那么es_logger控制台的输出格式会发生变化,并与sn-p中定义的格式相同。

【问题讨论】:

    标签: python logging elasticsearch


    【解决方案1】:

    我认为您受到了有点令人困惑的记录器层次结构传播的影响。在“elasticsearch.trace”中记录的所有通过 that 记录器的日志级别的内容,将首先传播到“elasticsearch”记录器,然后传播到根(“”)记录器。请注意,一旦消息通过“elasticsearch.trace”记录器的日志级别,则不会检查父级(“elasticsearch”和根)的日志级别,但所有消息都将发送到处理程序。 (处理程序本身具有适用的日志级别。)

    考虑以下说明问题的示例和可能的解决方案:

    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
    

    您会看到“foo”记录器及其父级根记录器(如“DEBUG:foo:msg1”)都记录了“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)
    

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多