相关疑难解决方法(0)

简单python日志配置中的重复输出

我正在设置python日志记录如下:

def setup_logging():
    loggers = (logging.getLogger("amcat"), logging.getLogger("scrapers"),logging.getLogger(__name__))
    filename = "somefile.txt"
    sys.stderr = open(filename, 'a')
    handlers = (logging.StreamHandler(sys.stdout),logging.FileHandler(filename))
    formatter = AmcatFormatter(date = True)

    for handler in handlers:
        handler.setLevel(logging.INFO)
        handler.setFormatter(formatter)

    for logger in loggers:
        logger.propagate = False
        logger.setLevel(logging.INFO)
        for handler in handlers:        
            logger.addHandler(handler)
    logging.getLogger().handlers = []
Run Code Online (Sandbox Code Playgroud)

启用了2个主要模块记录器,它们都应该记录到控制台以及文件.错误被重定向到文件(理想情况下,错误也会显示在控制台中,但我还没有实现)

之后,我检查事情是否正确:

should_work = [
    "amcat.scraping.scraper",
    "amcat.scraping.htmltools",
    "amcat.scraping.controller",
    "__main__"]

loggerdict = logging.Logger.manager.loggerDict #all loggers
for name, logger in loggerdict.items():
    if name in should_work:
        print("\nlogger: "+name)
        #iterate through parents see if effective handlers are set correctly
        print(effectivehandlers(logger)) …
Run Code Online (Sandbox Code Playgroud)

python logging

22
推荐指数
2
解决办法
2万
查看次数

Python 2.7:在两个python脚本中使用`logging`模块时,日志显示两次

语境:

Python 2.7.

同一文件夹中的两个文件:

  • 第一:主要脚本.
  • 第二:自定义模块.

目标:

可以在logging没有任何冲突的情况下使用模块(参见下面的输出).

文件:

a.py:

import logging
from b import test_b

def test_a(logger):
    logger.debug("debug")
    logger.info("info")
    logger.warning("warning")
    logger.error("error")

if __name__ == "__main__":
    # Custom logger.
    logger = logging.getLogger("test")

    formatter = logging.Formatter('[%(levelname)s] %(message)s')
    handler = logging.StreamHandler()
    handler.setFormatter(formatter)

    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler)

    # Test A and B.
    print "B"
    test_b()
    print "A"
    test_a(logger)
Run Code Online (Sandbox Code Playgroud)

b.py:

import logging

def test_b():
    logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
Run Code Online (Sandbox Code Playgroud)

输出:

如下所示,日志显示两次.

python a.py
B
WARNING:root:warning
ERROR:root:error
A
[DEBUG] debug
DEBUG:test:debug
[INFO] info
INFO:test:info …
Run Code Online (Sandbox Code Playgroud)

python logging python-2.7

12
推荐指数
1
解决办法
8765
查看次数

Python 日志记录检索特定处理程序

我们正在开发一个 python 程序/库,我们想为其设置一个日志系统。基本上我们想在终端上登录或在文件上登录。为此,我们将使用标准发行版中嵌入的优秀日志记录包。

用户应通过其首选项来自定义日志记录级别。我的问题是如何检索连接到记录器的处理程序之一?我在想一些类似这样的事情:

import logging

class NullHandler(logging.Handler):
    def emit(self,record):
        pass

HANDLERS = {}
HANDLERS['console'] = logging.StreamHandler()
HANDLERS['logfile'] = logging.FileHandler('test.log','w')

logging.getLogger().addHandler(NullHandler())
logging.getLogger('console').addHandler(HANDLERS['console'])
logging.getLogger('logfile').addHandler(HANDLERS['logfile'])

def set_log_level(handler, level):
    if hanlder not in HANDLERS:
        return

    HANDLERS[handler].setLevel(level)

def log(message, level, logger=None):

    if logger is None:
        logger= HANDLERS.keys()

    for l in logger:
        logging.getLogger(l).log(level, message)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的实现意味着使用 HANDLERS 全局字典来存储我创建的处理程序的实例。我找不到更好的方法来做到这一点。在该设计中,可以说,由于我只为每个记录器插入一个处理程序,因此我的记录器对象的处理程序属性应该没问题,但我正在寻找更通用的东西(即,如果有一天插入多个处理程序,该怎么办到我的一位记录器?)

你怎么看待这件事 ?

非常感谢

埃里克

python logging

6
推荐指数
1
解决办法
6143
查看次数

Python记录器格式化不是格式化字符串

以下为 的内容mylogger.py

def get_logger(name='my_super_logger'):
    log = logging.getLogger(name)
    log.setLevel(logging.DEBUG)
    formatter = logging.Formatter(fmt='%(asctime)s %(name)s %(message)s',
                                  datefmt='%m/%d/%Y %I:%M:%S %p')
    if not len(log.handlers):
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(formatter)
        log.addHandler(ch)
    # print(id(log))
    return log
Run Code Online (Sandbox Code Playgroud)

以下是内容myscript.py

from mylogger import get_logger

_logger = get_logger()

_logger.info('trying info')
_logger.debug('trying debug')
Run Code Online (Sandbox Code Playgroud)

然而我面临两个问题。它打印日志两次并且格式化程序每次都不起作用:

09/18/2015 09:59:54 PM my_super_logger trying info 
INFO:my_super_logger:trying info 
09/18/2015 09:59:54 PM my_super_logger trying debug 
DEBUG:my_super_logger:trying debug 
Run Code Online (Sandbox Code Playgroud)

我的代码到底有什么问题get_logger

我需要自定义格式。但是我发现,如果不添加处理程序,我就无法添加formatter. 这就是我添加的原因StreamHandler这个答案if中提到了阻止的原因。如果没有它,我会打印重复的日志消息。

python logging python-2.7

6
推荐指数
1
解决办法
6302
查看次数

日志文件中日志重复行的问题

我一整天都在努力让它正常工作,它几乎完成了,只是我遇到了一个奇怪的问题。在搜索查询中找到的每个结果都会按预期记录,但第一个结果会记录一次,第二个结果会记录两次,第三个结果会记录三次,依此类推。

有什么想法如何消除重复项吗?日志示例

#!/usr/bin/python
import urllib
import simplejson 
import logging
from logging.handlers import SysLogHandler

query = urllib.urlencode({'q' : 'test'})
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
      % (query)
search_results = urllib.urlopen(url)
json = simplejson.loads(search_results.read())
results = json['responseData']['results']
for i in results:
    logger = logging.getLogger()
    logger.addHandler(SysLogHandler(address=('192.168.0.2', 514)))
    logger.addHandler(logging.FileHandler("hits.log"))
    logging.warn(i['url'])
    print i['url']
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
2
解决办法
2585
查看次数

标签 统计

python ×5

logging ×4

python-2.7 ×2