首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用elasticsearch-py进行日志记录

使用elasticsearch-py进行日志记录
EN

Stack Overflow用户
提问于 2014-08-22 13:10:34
回答 1查看 17.7K关注 0票数 12

我想记录一下使用pythonelasticsearch-py脚本。特别是,我希望有三条日志:

  1. 常规日志:日志INFO及以上的日志到stdout和文件。
  2. ES日志:只使用与文件相关的消息。
  3. ES跟踪日志:只将ES日志记录(例如curl查询及其输出)扩展到文件中。

以下是我到目前为止所拥有的:

代码语言:javascript
复制
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)

我的问题是,INFO消息的es_logger也显示在终端上。事实上,日志消息被保存到正确的文件中!

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

编辑

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-25 13:26:32

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

考虑下面的示例说明了这个问题,以及一个可能的解决方案:

代码语言:javascript
复制
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')

输出:

代码语言:javascript
复制
msg1
DEBUG:foo:msg1
msg2

您可以看到"msg1“是由"foo”记录器及其父程序根记录器记录的(作为“DEBUG:foo:msg1 1”)。然后,当在“ll.propagate = False”之前关闭传播时,根记录器将不再记录它。现在,如果要注释掉第一行(logging.info("DUMMY...") ),那么行为就会改变,这样就不会显示根记录器行。这是因为logging模块顶层函数info()debug()等在尚未定义处理程序时使用处理程序配置根记录器。这也是为什么在通过执行logger = logging.getLogger()修改根处理程序时,您在示例中看到了不同的行为。

在您的代码中,我看不到您将对根记录器做任何事情,但是正如您所看到的,代码或库代码中的一个偏离的logging.info()之类的东西会导致添加一个处理程序。

因此,为了回答您的问题,我将logger.propagate = False设置为对您有意义的记录器,以及您想要传播的地方,检查处理程序本身的日志级别是否与您想要的一样。

以下是一次尝试:

代码语言:javascript
复制
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)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25447869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档