Django 服务器不向 Logstash 发送日志
Django server not sending logs to Logstash
我正在使用 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,但是日志没有发送到我的远程服务器。
我检查了很多问题,确认服务 运行ning 和端口正确,但我不知道为什么日志没有发送到 Logstash。
查看配置,记录器 "django.request" 设置为级别 "DEBUG",处理程序 "logstash" 设置为级别 "INFO"。我的猜测是 handler 不会处理 DEBUG 消息。不过我不确定。
为记录器和处理程序设置相同的级别以测试它是否工作。
使用什么级别取决于您希望从日志中获得什么。在这种情况下,我想 level 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 处理程序至少应收到 message/logrecord。如果运气不好,我建议尝试调试 logstash.TCPLogstashHandler 和
SocketHandler(由 TCPLogstashHandler 继承)以确保它们收到发出的记录。
您的日志记录配置正确。
您需要在 logstash conf 的 elasticsearch 配置部分中提及索引名称。将您的 logstash 配置更新为
input {
tcp {
port => 5959
codec => json
}
}
output {
elasticsearch {
hosts => ["xx.xx.xx.xx:9200"]
manage_template => false
index => "djangologs"
}
}
如果您使用 google 云或 AWS,请打开 port/update 防火墙规则。
我遇到了同样的问题,但经过一番摸索之后,我通过将 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
谢谢 Tasneem,
这在我的机器上有效:
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 }
}
}
我正在使用 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,但是日志没有发送到我的远程服务器。
我检查了很多问题,确认服务 运行ning 和端口正确,但我不知道为什么日志没有发送到 Logstash。
查看配置,记录器 "django.request" 设置为级别 "DEBUG",处理程序 "logstash" 设置为级别 "INFO"。我的猜测是 handler 不会处理 DEBUG 消息。不过我不确定。
为记录器和处理程序设置相同的级别以测试它是否工作。
使用什么级别取决于您希望从日志中获得什么。在这种情况下,我想 level 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 处理程序至少应收到 message/logrecord。如果运气不好,我建议尝试调试 logstash.TCPLogstashHandler 和 SocketHandler(由 TCPLogstashHandler 继承)以确保它们收到发出的记录。
您的日志记录配置正确。 您需要在 logstash conf 的 elasticsearch 配置部分中提及索引名称。将您的 logstash 配置更新为
input {
tcp {
port => 5959
codec => json
}
}
output {
elasticsearch {
hosts => ["xx.xx.xx.xx:9200"]
manage_template => false
index => "djangologs"
}
}
如果您使用 google 云或 AWS,请打开 port/update 防火墙规则。
我遇到了同样的问题,但经过一番摸索之后,我通过将 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
谢谢 Tasneem,
这在我的机器上有效:
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 }
}
}