Skip to main content

Logstash 的异步 Python 日志记录处理程序。

项目描述

用于异步事件处理和传输到 Logstash 的 Python 日志记录处理程序。 http://logstash.net/

关于

这个 Python 日志处理程序是 https://github.com/eht16/python-logstash-async的一个分支

它具有以下特点:

  • 日志事件的异步传输

  • 通过 TCP 和 UDP 传输事件

  • TCP 传输可选 SSL 加密

  • 准备在 Django 项目中使用的特殊格式化程序

https://github.com/eht16/python-logstash-async相比,如果无法与 logstash 建立连接,此分支不会尝试保留日志语句。

异步处理

与原始的python-logstash不同,此处理程序将尝试尽快处理日志事件,以便发送程序代码可以继续其主要工作。换句话说,对于 Web 应用程序或 Web 服务,重要的是不要因为日志记录延迟而减慢请求时间,例如等待 Logstash 服务器的网络超时或类似情况。

所以这个处理程序将接受日志事件并将它们传递给一个单独的工作线程进行进一步处理,该工作线程将尝试将事件异步发送到配置的 Logstash 服务器。

发送间隔和超时可以在 logstash_async.constants模块中通过相应的模块级常量进行配置,详见下文。

安装

使用点子:

pip install git+https://github.com/koendeschacht/python-logstash-async.git

用法

AsynchronousLogstashHandler是一个自定义日志处理程序,它使用 UDP 和 TCP 发送 Logstash 消息。例如:

import logging
import sys
from logstash_async.handler import AsynchronousLogstashHandler

host = 'localhost'
port = 5959

test_logger = logging.getLogger('python-logstash-logger')
test_logger.setLevel(logging.INFO)
test_logger.addHandler(AsynchronousLogstashHandler(
    host, port)))
# test_logger.addHandler(AsynchronousLogstashHandler(host, port))

test_logger.error('python-logstash-async: test logstash error message.')
test_logger.info('python-logstash-async: test logstash info message.')
test_logger.warning('python-logstash-async: test logstash warning message.')

# add extra field to logstash message
extra = {
    'test_string': 'python version: ' + repr(sys.version_info),
    'test_boolean': True,
    'test_dict': {'a': 1, 'b': 'c'},
    'test_float': 1.23,
    'test_integer': 123,
    'test_list': [1, 2, '3'],
}
test_logger.info('python-logstash: test extra fields', extra=extra)

使用额外字段时,请确保您不使用保留名称。来自Python 文档

"The keys in the dictionary passed in extra should not clash
with the keys used by the logging system.
(See the `Formatter <https://docs.python.org/2/library/logging.html#logging.Formatter>`_ documentation
for more information on which keys are used by the logging system.)"

您还可以在日志配置中指定一个额外的额外字典,其中包含应用程序名称、环境等静态值。这些值将与日志调用中传递的任何额外字典项合并到配置的额外前缀中。

与 Django 一起使用

修改您的settings.py以将python-logstash-async与 Django 的日志记录集成:

LOGGING = {
  ...
  'formatters': {
      ...
      'logstash': {
          '()': 'logstash_async.formatter.DjangoLogstashFormatter',
          'message_type': 'python-logstash',
          'fqdn': False, # Fully qualified domain name. Default value: false.
          'extra_prefix': 'dev', #
          'extra': {
              'application': PROJECT_APP,
              'project_path': PROJECT_APP_PATH,
              'environment': 'production'
          }
      },
  },
  'handlers': {
      ...
      'logstash': {
          'level': 'DEBUG',
          'class': 'logstash_async.handler.AsynchronousLogstashHandler',
          'transport': 'logstash_async.transport.TcpTransport',
          'host': 'logstash.host.tld',
          'port': 5959,
          'ssl_enable': True,
          'ssl_verify': True,
          'ca_certs': 'etc/ssl/certs/logstash_ca.crt',
          'certfile': '/etc/ssl/certs/logstash.crt',
          'keyfile': '/etc/ssl/private/logstash.key',
      },
  },
  'loggers': {
      'django.request': {
          'handlers': ['logstash'],
          'level': 'DEBUG',
          'propagate': True,
      },
  },
  ...
}

这将导致如下所示的 Logstash 事件(注意:在某种程度上取决于您的 Logstash 配置):

{
    "@timestamp": "2016-10-23T15:11:16.853Z",
    "@version": "1",
    "extra": {
        "application": "django_example",
        "django_version": "1.10.2",
        "environment": "production",
        "func_name": "get_response",
        "interpreter": "/home/enrico/example/venv/bin/python",
        "interpreter_version": "2.7.12",
        "line": 152,
        "logger_name": "django.request",
        "path": "/home/enrico/example/venv/lib/python2.7/site-packages/django/core/handlers/base.py",
        "process_name": "MainProcess",
        "project_path": "/home/enrico/example/app",
        "req_host": "localhost",
        "req_method": "GET",
        "req_referer": "",
        "req_remote_address": "127.0.0.1",
        "req_uri": "http://localhost/hosts/nonexistent/",
        "req_user": "enrico",
        "req_useragent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1",
        "request": "<WSGIRequest: GET '/hosts/nonexistent/'>",
        "status_code": 404,
        "thread_name": "Thread-1"
    },
    "host": "my.host.tld",
    "level": "WARNING",
    "logsource": "endor.l8failed.net",
    "message": "Not Found: /hosts/nonexistent/",
    "pid": 23605,
    "port": 56170,
    "program": "manage.py",
    "type": "python-logstash"
}

配置

用于配置日志处理程序的选项

主持人

Logstash 服务器的主机(无默认)

港口

Logstash 服务器的端口(默认 5959)

运输

兼容传输类的可调用或路径(默认值:'logstash_async.transport.TcpTransport')。

您可以指定自己的传输类,例如通过 Redis 或 Beats 协议实现传输。如果你支持传递一个字符串,它应该是一个可以导入的类的路径。如果您传递任何其他内容,它应该是具有与logstash_async.transport.TcpTransport类似接口的类的对象。特别是它应该提供一个close()和一个send()方法。

ssl_enable

是否应该为连接启用 SSL?(默认值:False)仅用于logstash_async.transport.TcpTransport

ssl_verify

是否应该验证服务器的 SSL 证书?(默认值:True)仅用于logstash_async.transport.TcpTransport

密钥文件

客户端 SSL 密钥文件的路径(默认值:无)仅用于logstash_async.transport.TcpTransport

证书文件

客户端 SSL 证书文件的路径(默认值:无)仅用于logstash_async.transport.TcpTransport

ca_certs

包含已识别 CA 证书的文件的路径(默认值:无)仅用于logstash_async.transport.TcpTransport

使能够

启用日志处理的标志(默认为 True,禁用可能对本地测试等很方便)

用于配置日志格式化程序的选项

以下设置仅对提供的​​格式化程序 logstash_async.handler.LogstashFormatterlogstash_async.handler.DjangoLogstashFormatter 有效

您可以通过相应地配置 Python 的日志记录系统来使用任何其他格式化程序。任何其他格式化程序的format()方法只应返回适合发送到 Logstash 的有效 JSON(请参阅下面的示例 Logstash 配置)。

选项:

消息类型

发送到 Logstash 的消息中的类型字段(默认值:'python-logstash')

标签

要包含在 Logstash 消息中的其他标签(默认值:无)

fqdn

在发送到 Logstash 的消息 的主机字段中使用系统的 FQDN(完全限定域名) 。socket.getfqdn()用于检索 FQDN,否则 socket.gethostname()用于默认主机名。(默认:假)

额外前缀

发送到 Logstash 的结果消息中的字段名称,所有其他字段都被分组到其中。将其视为日志事件中所有非标准字段的某种命名空间。此字段将通过额外配置选项(见下文)将任何作为额外字段传递的项目以及在日志调用中传递的任何额外项目获取。

要禁用额外项目的分组并将它们放在日志事件消息的顶层,只需将此选项设置为None 或空字符串。(默认:“额外”)

额外的

包含要包含在发送到 Logstash 的消息中的静态项目的字典。该字典将与日志调用中传递的任何其他额外项目合并。(默认:无)

异步处理的选项(在模块 logstash_async.constants 中)

SOCKET_TIMEOUT

TCP 连接超时(以秒为单位)(默认值:5.0)

QUEUE_CHECK_INTERVAL

检查内部队列是否有新消息的间隔(以秒为单位)(默认值:0.2)

TIMEOUT_SENDING_MESSAGES_AT_TERMINATION

当程序终止时,任何剩余的日志消息仍会发送到 logstash。此常量定义处理程序在终止之前仍可以发送消息的秒数(默认值:2.0)

示例 Logstash 配置

未加密 TCP 传输的示例logstash.conf :

input {
    tcp {
        host => "127.0.0.1"
        port => 5959
        mode => server
        codec => json
    }
}

SSL 加密 TCP 传输的示例logstash.conf :

input {
    tcp {
        host => "127.0.0.1"
        port => 5958
        mode => server
        codec => json

        ssl_enable => true
        ssl_verify => true
        ssl_extra_chain_certs => ["/etc/ssl/certs/logstash_ca.crt"]
        ssl_cert => "/etc/ssl/certs/logstash.crt"
        ssl_key => "/etc/ssl/private/logstash.key"
    }
}

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

内置分布

python_logstash_async_dwn-1.0.0-py2.py3-none-any.whl (18.6 kB 查看哈希

已上传 py2 py3