使用elasticsearch-py记录

时间:2014-08-22 13:10:34

标签: python logging elasticsearch

我想记录使用python的{​​{1}}脚本。特别是,我想要三个日志:

  1. 常规日志:日志elasticsearch-py及以上INFO和文件。
  2. ES日志:仅ES与文件相关的消息。
  3. ES跟踪日志:扩展ES日志记录(例如,卷曲查询及其输出)仅限于文件。
  4. 这是我到目前为止所做的:

    stdout

    我的问题是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) 的{​​{1}}消息也显示在终端上。事实上,日志消息被保存到正确的文件中!

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


    修改

    可能的提示:在es_logger的来源中有一个名为logger的记录器。它可能与我的冲突吗?我尝试在上面的行中将elasticsearch-py的名称更改为logger,但它没有帮助。

    可能的提示2:如果我将logger替换为main_logger,则logger = logging.getLogger('mainLog')的控制台输出格式会发生变化,并与代码段中定义的格式相同。< / p>

1 个答案:

答案 0 :(得分:8)

我认为你受到了有些令人困惑的记录器层次结构传播的影响。登录的所有内容&#34; elasticsearch.trace&#34;通过 记录器的loglevel,将首先传播到&#34; elasticsearch&#34;记录器,然后到根(&#34;&#34;)记录器。请注意,一旦消息通过&#34; elasticsearch.trace&#34;的日志级别。记录器,父项的日志级别(&#34; elasticsearch&#34;和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

你看到&#34; msg1&#34;记录由&#34; foo&#34;记录器及其父记录,根记录器(&#34; DEBUG:foo:msg1&#34;)。然后,当传播在&#34; msg2&#34;之前关闭ll.propagate = False时,根记录器不再记录它。现在,如果您要注释掉第一行(logging.info("DUMMY..."),那么行为将会改变,以便不会显示根记录器行。这是因为logging模块顶级函数{{1当没有定义处理程序时,使用处理程序配置根记录器。这也是在您通过执行info()修改根处理程序时在示例中看到不同行为的原因。}},debug()等。

我无法在您的代码中看到您将对根记录器执行任何操作,但正如您所看到的,代码或库代码中的杂散logger = logging.getLogger()等会导致处理程序加入。

因此,为了回答您的问题,我会将logging.info()设置为对您有意义的记录器以及您希望传播的位置,检查处理程序本身的日志级别是否符合您的要求。

这是一次尝试:

logger.propagate = False