【问题标题】:Django server not sending logs to LogstashDjango 服务器不向 Logstash 发送日志
【发布时间】:2017-12-20 10:35:47
【问题描述】:

我正在使用 ELK 堆栈从我的 Django 服务器集中记录日志。我的 ELK 堆栈位于远程服务器上,logstash.conf 看起来像这样:

input {
    tcp {
    port => 5959
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["xx.xx.xx.xx:9200"]
  }
}

elasticsearch 和 logstash 服务都在工作(使用 docker-compose logs logstash 检查)。

我的 Django 服务器的设置文件的日志记录配置如下:

LOGGING = {
  'version': 1,
  'handlers': {
        'logstash': {
            'level': 'INFO',
            'class': 'logstash.TCPLogstashHandler',
            'host': 'xx.xx.xx.xx',
            'port': 5959, # Default value: 5959
            'version': 0, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
            'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
            'fqdn': True, # Fully qualified domain name. Default value: false.
            'tags': ['django.request'], # list of tags. Default: None.
        },
  },
  'loggers': {
        'django.request': {
            'handlers': ['logstash'],
            'level': 'DEBUG',
  },
}
}

我运行我的 Django 服务器,Logstash 处理程序处理日志,因为控制台没有显示日志。我使用Django服务器中的python-logstash库来构建上述conf,但是日志没有发送到我的远程服务器。

我检查了许多问题,确认服务正在运行并且端口正确,但我不知道为什么日志没有发送到 Logstash。

【问题讨论】:

  • 你确定“django.request”没有过滤掉所有事件吗?
  • Django 请求应该发送所有请求日志
  • 你试过把fqdn改成False吗?
  • 是的,但没有成功

标签: python django logstash elastic-stack


【解决方案1】:

查看配置,记录器“django.request”设置为“DEBUG”级别,处理程序“logstash”设置为“INFO”级别。我的猜测是 handler 不会处理 DEBUG 消息。不过我不确定。

为记录器和处理程序设置相同的级别以测试它是否有效。

使用什么级别取决于您希望从日志中获得什么。在这种情况下,我想级别 INFO 就足够了。

如果还没有,请查看Django logging

注意:从 cmets 看来,它似乎无法解决问题,但我希望它仍然有用。

更新:

我尝试了以下配置,它在“debug.log”中捕获了 404 和 500 错误。

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
    'logfile': {
        'level': 'WARNING',
        'class': 'logging.FileHandler',
        'filename': os.path.join(PROJECT_DIR, 'debug.log'),
    },
},
'loggers': {
    'django.request': {
        'handlers': ['logfile'],
        'level': 'WARNING',
        'propagate': True,
    },
}}

使用此测试配置,logstash 处理程序至少应该接收消息/日志记录。如果运气不好,我建议尝试调试logstash.TCPLogstashHandlerSocketHandler(由 TCPLogstashHandler 继承)以确保他们收到发出的记录。

【讨论】:

  • 您的观点似乎是正确的,那么您建议如何解决这个问题?
  • 我建议使用级别 INFO。根据创建日志消息的方式,有时最好能够根据使用的环境打开和关闭 DEBUG 日志记录。例如 django 将其用于 mail_admins。
  • @ArpitSolanki django.request 仅记录 WARNINGERROR 消息。 docs.djangoproject.com/en/1.11/topics/logging/…
  • @DanielBackman 感谢您的努力,但它并没有解决问题。如果您在答案中添加一个小注释,说明它没有解决问题但有助于记录部分代码,我仍然可以奖励您
  • @ArpitSolanki 我会尝试找出记录器无法按预期工作的原因。
【解决方案2】:

我也遇到了同样的问题,但经过一番折腾后,我通过将 django.request 更改为 django.server 使其工作。 当我在 python 代码中仅使用 django 作为记录器名称,然后从存储在 elasticsearch 中的日志数据中找到实际的 logger_name 时,我得到了这个想法。 以下是更新后的代码

LOGGING = {
  'version': 1,
  'handlers': {
        'logstash': {
            'level': 'INFO',
            'class': 'logstash.TCPLogstashHandler',
            'host': 'xx.xx.xx.xx',
            'port': 5959, # Default value: 5959
            'version': 0, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
            'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
            'fqdn': True, # Fully qualified domain name. Default value: false.
            'tags': ['django.request'], # list of tags. Default: None.
        },
  },
  'loggers': {
        'django.server': {  # Here is the change
            'handlers': ['logstash'],
            'level': 'DEBUG',
      }
  },
}

有关 django 日志记录的更多详细信息,请参阅此处 https://docs.djangoproject.com/en/1.11/topics/logging/#id3

【讨论】:

  • 那么稍后我应该在登录 logging.getLogger('django.server') 之前执行此操作吗? . 让我很困惑
【解决方案3】:

您的日志记录配置正确。 您需要在 logstash conf 的 elasticsearch 配置部分中提及索引名称。将您的 logstash 配置更新为

input {
    tcp {
    port => 5959
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["xx.xx.xx.xx:9200"]
    manage_template => false
    index => "djangologs"
  }
}

如果您使用的是 google cloud 或 AWS,请打开端口/更新防火墙规则。

【讨论】:

    【解决方案4】:

    谢谢塔斯尼姆,

    这在我的机器上有效:

    mysite/settings.py

    LOGGING = {
      'version': 1,
      'handlers': {
          'logstash': {
              'level': 'DEBUG',
              'class': 'logstash.TCPLogstashHandler',
              'host': 'xx.xx.xx.xx',
              'port': 9600, # Default value: 5959
              'version': 1, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
              'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
              'fqdn': False, # Fully qualified domain name. Default value: false.
              'tags': ['django.request'],# list of tags. Default: None.
          },
      },
      'loggers': {
          'django.server': {
              'handlers': ['logstash'],
              'level': 'DEBUG',
          },
      },
    }
    

    logstash# cat logstash-django.conf

    input {
      tcp {
        port => 9600
        codec => json
      }
    }
    output {
        elasticsearch {
          hosts => ["https://your.elasticsearch.com:port"]
          user => ["xx"]
          password => ["xx"]
          index => "djangotest"
          document_type => "%{type}"
        }
       stdout {
          codec => rubydebug {metadata => true }
      }
    }
       
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多