Python-Logstash在Pyramid应用程序中发送了太多条目

时间:2015-04-24 17:00:40

标签: python pyramid

使用Logstash记录日志,并记录用户何时执行操作。不幸的是,它似乎每个'动作'或错误发送多个条目,而不是每个动作或错误发送一个条目。例如,如果用户提交表单,我将其设置为记录他们已提交的表单。有时它会记录1个日志条目,有时会记录5个,3个或2个。这是非常不一致的。记录到同一服务器的其他工具和应用程序不会执行此操作。这是我设置logstash的地方:

    Dim strSQL As String
    strSQL = "SELECT * FROM [MY_TABLE] WHERE [MY_TEXT_COLUMN_NAME] LIKE %?%"

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

    conn.ConnectionString = _
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DATABASE_PATH & ";Persist Security Info=False;"

    conn.Open

Dim adoCommand As ADODB.Command
Set adoCommand = New ADODB.Command

    With adoCommand
        .ActiveConnection = conn
        .CommandType = adCmdText
        .CommandText = strSQL
        .Prepared = True
        .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 255, strMYTEXT)

        Dim rs As ADODB.Recordset
        Set rs = .Execute
    End With

我使用这个我想记录的东西。

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)

想法?

1 个答案:

答案 0 :(得分:2)

Python logging具有全局状态。

    prlogger = logging.getLogger(str(servfrom))
    prlogger.setLevel(logging.INFO)
    prlogger.addHandler(logstash.LogstashHandler(host, 6123, version=1))

首次执行此代码时,它会创建一个记录器。第二次执行此代码时,它返回相同的记录器。每次执行代码时,新的日志处理程序都会添加到现有的记录器

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