Django服务器没有将日志发送到Logstash

时间:2017-07-15 12:04:31

标签: python django logstash elastic-stack

我正在使用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。

4 个答案:

答案 0 :(得分:4)

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

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

使用的级别取决于您对日志的要求。在这种情况下,我猜水平INFO就足够了。

如果尚未查看Django logging

注意:从评论来看似乎没有解决问题,但我希望它无论如何都是有用的。

更新:

我尝试了以下配置,它在“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处理程序至少应该接收消息/ logrecord。如果没有运气我建议尝试调试logstash.TCPLogstashHandler和。{ SocketHandler(由TCPLogstashHandler继承)以确保它们接收发出的记录。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我遇到了同样的问题,但是经过很多争吵之后,我通过将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

答案 3 :(得分:0)

谢谢塔斯尼姆,

这在我的机器上工作:

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 }
  }
}