Python日志存储在金字塔应用程序中发送过多条目

Python日志存储在金字塔应用程序中发送过多条目,python,pyramid,Python,Pyramid,使用Logstash来记录日志,并记录用户何时做某事。不幸的是,它似乎每个“操作”或错误发送多个条目,而不是每个操作或错误发送一个条目。例如,如果用户提交表单,我将其设置为记录他们已提交的表单。有时它会为此记录1个日志条目,有时它会记录5个、3个或2个。这是难以置信的不一致。登录到同一服务器的其他工具和应用程序不会这样做。这是我设置日志存储的地方: class LogStashExp(object): @staticmethod def log(exc, request, ser

使用Logstash来记录日志,并记录用户何时做某事。不幸的是,它似乎每个“操作”或错误发送多个条目,而不是每个操作或错误发送一个条目。例如,如果用户提交表单,我将其设置为记录他们已提交的表单。有时它会为此记录1个日志条目,有时它会记录5个、3个或2个。这是难以置信的不一致。登录到同一服务器的其他工具和应用程序不会这样做。这是我设置日志存储的地方:

class LogStashExp(object):
    @staticmethod
    def log(exc, request, servfrom, erlevel, email):
        if str(request.url).startswith('http://localhost'):
            host = 'localhost'
        else:
             host = '*******'
        prlogger = logging.getLogger(str(servfrom))
        prlogger.setLevel(logging.INFO)
        prlogger.addHandler(logstash.LogstashHandler(host, 6123, version=1))
        extra = {
            'email': email
        }
        if erlevel == "warn":
            prlogger.warning(exc, extra=extra)
        elif erlevel == "error":
            prlogger.error(exc, extra=extra)
        elif erlevel == "info":
            prlogger.info(exc, extra=extra)
        else:
            prlogger.error(exc)
我用它来记录一些东西

LogStashExp.log("message", request, servfrom='application', erlevel='info', email=email)

想法?

Python
日志记录具有全局状态

    prlogger = logging.getLogger(str(servfrom))
    prlogger.setLevel(logging.INFO)
    prlogger.addHandler(logstash.LogstashHandler(host, 6123, version=1))
第一次执行此代码时,它会创建一个记录器。第二次执行此代码时,它将返回相同的记录器。每次执行代码时,都会向现有记录器添加一个新的日志处理程序


我认为,如果您想动态创建日志记录程序,在继续添加新的处理程序之前,应该检查它是否有任何处理程序。

一些测试后的更多信息。当我构建金字塔应用程序时,第一个动作作为单个条目记录。第二个记录为同一单个操作的两个不同条目。第三,三个条目。等等。好吧,根据文件,它应该这样写。我不知道你说的“检查它是否有处理器”是什么意思。什么是“它”?我的申请书?唯一定义的处理程序是控制台。这有点早,也许我应该在评论之前等待我的咖啡。我知道你的意思。对不起,我不记得如何列出记录器的处理程序,但如果len(prlogger.handlers)=0:
是我使用的代码,您应该通过在调试提示
中拨动
prlogger
来了解。我将addHandler代码放在这个
if
语句中。不再有重复记录。这么简单。谢谢Mikko!