Dro*_*ror 10 python logging elasticsearch
我想记录我python
使用的脚本elasticsearch-py
.特别是,我想要三个日志:
INFO
和上面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)
Run Code Online (Sandbox Code Playgroud)
我的问题是终端上也会显示INFO
消息es_logger
.事实上,日志消息被保存到正确的文件中!
如果我卸载相关的部分logger
,那么ES日志记录工作正常,即只保存到相应的文件.但后来我没有其他部分......我在设置的最后一部分做错了什么?
可能的提示:在elasticsearch-py
一个名为logger 的源中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')
Run Code Online (Sandbox Code Playgroud)
输出:
msg1
DEBUG:foo:msg1
msg2
Run Code Online (Sandbox Code Playgroud)
您会看到"msg1"由"foo"记录器及其父记录器(根记录器)记录(如"DEBUG:foo:msg1").然后,当ll.propagate = False
在"msg2"之前关闭传播时,根记录器不再记录它.现在,如果你注释掉第一行(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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11331 次 |
最近记录: |