From daa2f2a652b6bd7f10e673b411812398d6d5a2f5 Mon Sep 17 00:00:00 2001 From: Arne Schauf Date: Wed, 8 Oct 2014 15:12:07 +0200 Subject: [PATCH 01/22] urllib import python3 compatibility fix --- logstash/handler_amqp.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/logstash/handler_amqp.py b/logstash/handler_amqp.py index ad984db..452832e 100644 --- a/logstash/handler_amqp.py +++ b/logstash/handler_amqp.py @@ -1,5 +1,8 @@ import json -from urllib import urlencode +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode from logging import Filter from logging.handlers import SocketHandler From c749e5c3c3ecdee54c0732605e8297bac3e50226 Mon Sep 17 00:00:00 2001 From: Arne Schauf Date: Wed, 8 Oct 2014 15:18:32 +0200 Subject: [PATCH 02/22] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fb36e46..65ef739 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='python-logstash', packages=['logstash'], - version='0.4.3', + version='0.4.3-1', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), author='Volodymyr Klochan', From 6028f83921f7953953b920c9429d172f73a10a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=92=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D0=B8=D0=BC=D0=B8=D1=80=D0=BE=D0=B2?= Date: Thu, 30 Oct 2014 16:30:38 +0500 Subject: [PATCH 03/22] Long is simple type --- logstash/formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logstash/formatter.py b/logstash/formatter.py index edbe7ca..0c90853 100644 --- a/logstash/formatter.py +++ b/logstash/formatter.py @@ -30,7 +30,7 @@ def get_extra_fields(self, record): 'processName', 'relativeCreated', 'thread', 'threadName', 'extra') if sys.version_info < (3, 0): - easy_types = (basestring, bool, dict, float, int, list, type(None)) + easy_types = (basestring, bool, dict, float, int, long, list, type(None)) else: easy_types = (str, bool, dict, float, int, list, type(None)) From e11b6ba50a88f3c60642f8f1132d4ca7d94c4572 Mon Sep 17 00:00:00 2001 From: Vladimir Klochan Date: Thu, 19 Mar 2015 14:37:38 -0400 Subject: [PATCH 04/22] Updated readme and version info --- README.rst | 3 +++ setup.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 91b60ad..c8d1006 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,9 @@ http://logstash.net/ Changelog ========= +0.4.4 + - Fixed urllib import python3 compatibility. + - Added long type to easy_types. 0.4.3 - Added AMQP handler. 0.4.2 diff --git a/setup.py b/setup.py index 65ef739..ddbd90b 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='python-logstash', packages=['logstash'], - version='0.4.3-1', + version='0.4.4', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), author='Volodymyr Klochan', From 4f66b8fc38e2f314afd8a72d33a02fd4a4cccf3a Mon Sep 17 00:00:00 2001 From: Ali Bozorgkhan Date: Wed, 6 May 2015 15:47:58 -0700 Subject: [PATCH 05/22] allow passing exchange's routing key to amqp handler --- logstash/handler_amqp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/logstash/handler_amqp.py b/logstash/handler_amqp.py index 452832e..99d190e 100644 --- a/logstash/handler_amqp.py +++ b/logstash/handler_amqp.py @@ -43,8 +43,8 @@ class AMQPLogstashHandler(SocketHandler, object): def __init__(self, host='localhost', port=5672, username='guest', password='guest', exchange='logstash', exchange_type='fanout', virtual_host='/', message_type='logstash', tags=None, - durable=False, - version=0, extra_fields=True, fqdn=False, facility=None): + durable=False, version=0, extra_fields=True, fqdn=False, + facility=None, exchange_routing_key=''): # AMQP parameters @@ -56,7 +56,7 @@ def __init__(self, host='localhost', port=5672, username='guest', self.exchange = exchange self.exchange_is_durable = durable self.virtual_host = virtual_host - self.routing_key = '' + self.routing_key = exchange_routing_key SocketHandler.__init__(self, host, port) From 7b30e979ef3cbdf8ef13726da01ea31bf1315408 Mon Sep 17 00:00:00 2001 From: Ali Bozorgkhan Date: Wed, 6 May 2015 16:23:50 -0700 Subject: [PATCH 06/22] Bumped version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ddbd90b..e641ca3 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='python-logstash', packages=['logstash'], - version='0.4.4', + version='0.4.5', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), author='Volodymyr Klochan', From 721a113cc5e7a2b819b19bfc71e05bdd7ab0a275 Mon Sep 17 00:00:00 2001 From: Vladimir Klochan Date: Fri, 8 May 2015 12:21:40 -0400 Subject: [PATCH 07/22] Updated README --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index c8d1006..85a95e2 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,8 @@ http://logstash.net/ Changelog ========= +0.4.5 + - Allow passing exchange's routing key to AMQP handler 0.4.4 - Fixed urllib import python3 compatibility. - Added long type to easy_types. From c3627b2253e42d5705b87f9a37c739a302275b3c Mon Sep 17 00:00:00 2001 From: Vladimir Klochan Date: Fri, 10 Jul 2015 09:08:52 -0400 Subject: [PATCH 08/22] Changed type of @version field to string --- logstash/formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logstash/formatter.py b/logstash/formatter.py index 0c90853..8697faf 100644 --- a/logstash/formatter.py +++ b/logstash/formatter.py @@ -119,7 +119,7 @@ def format(self, record): # Create message dict message = { '@timestamp': self.format_timestamp(record.created), - '@version': 1, + '@version': '1', 'message': record.getMessage(), 'host': self.host, 'path': record.pathname, From 3a3ec5452cc2abd9847d5f8dbf4a174fc9f829d5 Mon Sep 17 00:00:00 2001 From: Shreyas Karnik Date: Thu, 13 Aug 2015 19:55:23 +0100 Subject: [PATCH 09/22] added example logstash config --- README.rst | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 85a95e2..cb95bed 100644 --- a/README.rst +++ b/README.rst @@ -92,7 +92,7 @@ For example:: except: test_logger.exception('python-logstash-logger: Exception with stack trace!') - + Using with Django ================= @@ -123,10 +123,25 @@ Modify your ``settings.py`` to integrate ``python-logstash`` with Django's loggi ... } +Note +==== +Example Logstash Configuration for Receiving Events from python-logstash is:: + input { + tcp { + port => 5000 + codec => json + } + } + output { + stdout { + codec => rubydebug + } + } + Contributors ------------ - Volodymyr Klochan - Kiall Mac Innes - Alexander Boyd - joel-wright - - Dale O'Brien \ No newline at end of file + - Dale O'Brien From d011cfe745c6642cf5e0774b6b076e75ff208aa6 Mon Sep 17 00:00:00 2001 From: Shreyas Karnik Date: Thu, 13 Aug 2015 19:57:34 +0100 Subject: [PATCH 10/22] formatting changes --- README.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index cb95bed..1105efb 100644 --- a/README.rst +++ b/README.rst @@ -125,7 +125,8 @@ Modify your ``settings.py`` to integrate ``python-logstash`` with Django's loggi Note ==== -Example Logstash Configuration for Receiving Events from python-logstash is:: +Example Logstash Configuration (``logstash.conf``) for Receiving Events from python-logstash is:: + `` input { tcp { port => 5000 @@ -137,7 +138,7 @@ Example Logstash Configuration for Receiving Events from python-logstash is:: codec => rubydebug } } - +`` Contributors ------------ - Volodymyr Klochan From deffe4df3f5783a3d66814ff49186752565504f2 Mon Sep 17 00:00:00 2001 From: Shreyas Karnik Date: Thu, 13 Aug 2015 19:59:52 +0100 Subject: [PATCH 11/22] formatting changes --- README.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 1105efb..2655e47 100644 --- a/README.rst +++ b/README.rst @@ -125,8 +125,9 @@ Modify your ``settings.py`` to integrate ``python-logstash`` with Django's loggi Note ==== + Example Logstash Configuration (``logstash.conf``) for Receiving Events from python-logstash is:: - `` + input { tcp { port => 5000 @@ -138,7 +139,7 @@ Example Logstash Configuration (``logstash.conf``) for Receiving Events from pyt codec => rubydebug } } -`` + Contributors ------------ - Volodymyr Klochan From 4b6184b5c7166cf4bfd621f72d9c9831ee78f9ab Mon Sep 17 00:00:00 2001 From: Eduard Dudar Date: Fri, 30 Oct 2015 00:22:59 -0700 Subject: [PATCH 12/22] Updated field names to match java counterparts supported by logstash crew --- logstash/formatter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/logstash/formatter.py b/logstash/formatter.py index 8697faf..6d0887a 100644 --- a/logstash/formatter.py +++ b/logstash/formatter.py @@ -47,10 +47,10 @@ def get_extra_fields(self, record): def get_debug_fields(self, record): fields = { - 'exc_info': self.format_exception(record.exc_info), + 'stack_trace': self.format_exception(record.exc_info), 'lineno': record.lineno, 'process': record.process, - 'threadName': record.threadName, + 'thread_name': record.threadName, } # funcName was added in 2.5 @@ -127,8 +127,8 @@ def format(self, record): 'type': self.message_type, # Extra Fields - 'levelname': record.levelname, - 'logger': record.name, + 'level': record.levelname, + 'logger_name': record.name, } # Add extra fields From a7c5dd2a0b9f5b8885015f6061ca2b37560af42a Mon Sep 17 00:00:00 2001 From: Vladimir Klochan Date: Tue, 10 Nov 2015 14:32:04 -0500 Subject: [PATCH 13/22] Increased version number --- README.rst | 10 ++-------- setup.py | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index 2655e47..e637785 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,8 @@ http://logstash.net/ Changelog ========= +0.4.6 + - Updated field names to match java counterparts supported by logstash crew 0.4.5 - Allow passing exchange's routing key to AMQP handler 0.4.4 @@ -139,11 +141,3 @@ Example Logstash Configuration (``logstash.conf``) for Receiving Events from pyt codec => rubydebug } } - -Contributors ------------- - - Volodymyr Klochan - - Kiall Mac Innes - - Alexander Boyd - - joel-wright - - Dale O'Brien diff --git a/setup.py b/setup.py index e641ca3..bcf4eb8 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='python-logstash', packages=['logstash'], - version='0.4.5', + version='0.4.6', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), author='Volodymyr Klochan', From 61ef5615e9b553da882d4bbda98d11ca4fe7a45e Mon Sep 17 00:00:00 2001 From: Roman Tomjak Date: Wed, 20 Jan 2016 01:33:53 +0000 Subject: [PATCH 14/22] fix logstash example --- README.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index e637785..c4e95b8 100644 --- a/README.rst +++ b/README.rst @@ -125,14 +125,14 @@ Modify your ``settings.py`` to integrate ``python-logstash`` with Django's loggi ... } -Note -==== +Example Logstash Configuration +============================== Example Logstash Configuration (``logstash.conf``) for Receiving Events from python-logstash is:: input { - tcp { - port => 5000 + udp { + port => 5959 codec => json } } @@ -141,3 +141,5 @@ Example Logstash Configuration (``logstash.conf``) for Receiving Events from pyt codec => rubydebug } } + +> For TCP input you need to change the logstash's input to `tcp` and modify django log handler's class to `logstash.TCPLogstashHandler` From 9b877cdbbc8b27e8cbdba62341f713ba4285fafc Mon Sep 17 00:00:00 2001 From: Roman Tomjak Date: Wed, 20 Jan 2016 01:38:17 +0000 Subject: [PATCH 15/22] change markdown format to rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index c4e95b8..0140086 100644 --- a/README.rst +++ b/README.rst @@ -142,4 +142,4 @@ Example Logstash Configuration (``logstash.conf``) for Receiving Events from pyt } } -> For TCP input you need to change the logstash's input to `tcp` and modify django log handler's class to `logstash.TCPLogstashHandler` + For TCP input you need to change the logstash's input to ``tcp`` and modify django log handler's class to ``logstash.TCPLogstashHandler`` From 9c433162563766f9e3024be209d9e8ba358f7e23 Mon Sep 17 00:00:00 2001 From: Roman Tomjak Date: Wed, 20 Jan 2016 01:41:07 +0000 Subject: [PATCH 16/22] logstash's example footnote should not be a part of example config --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 0140086..7bccf49 100644 --- a/README.rst +++ b/README.rst @@ -142,4 +142,4 @@ Example Logstash Configuration (``logstash.conf``) for Receiving Events from pyt } } - For TCP input you need to change the logstash's input to ``tcp`` and modify django log handler's class to ``logstash.TCPLogstashHandler`` +For TCP input you need to change the logstash's input to ``tcp`` and modify django log handler's class to ``logstash.TCPLogstashHandler`` From 17d96ad3c0e8155dabe6cfbdd6b0d049a12ac283 Mon Sep 17 00:00:00 2001 From: Venkat Sundaram Date: Fri, 1 Apr 2016 11:00:44 -0600 Subject: [PATCH 17/22] Adding sensitive OpenStack log fields to skip_list --- README.rst | 2 ++ logstash/formatter.py | 3 ++- setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index e637785..7f166bd 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,8 @@ http://logstash.net/ Changelog ========= +0.4.7 + - Add couple of sensitive fields to the skip_list 0.4.6 - Updated field names to match java counterparts supported by logstash crew 0.4.5 diff --git a/logstash/formatter.py b/logstash/formatter.py index 6d0887a..f5c4424 100644 --- a/logstash/formatter.py +++ b/logstash/formatter.py @@ -27,7 +27,8 @@ def get_extra_fields(self, record): 'args', 'asctime', 'created', 'exc_info', 'exc_text', 'filename', 'funcName', 'id', 'levelname', 'levelno', 'lineno', 'module', 'msecs', 'msecs', 'message', 'msg', 'name', 'pathname', 'process', - 'processName', 'relativeCreated', 'thread', 'threadName', 'extra') + 'processName', 'relativeCreated', 'thread', 'threadName', 'extra', + 'auth_token', 'password') if sys.version_info < (3, 0): easy_types = (basestring, bool, dict, float, int, long, list, type(None)) diff --git a/setup.py b/setup.py index bcf4eb8..e49045c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='python-logstash', packages=['logstash'], - version='0.4.6', + version='0.4.7', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), author='Volodymyr Klochan', From e996c11f035d910f332a0411974c85559c6bc326 Mon Sep 17 00:00:00 2001 From: Matt Snider Date: Thu, 9 Jun 2016 17:36:34 +0200 Subject: [PATCH 18/22] Allow exchange to be declared passively in AMQPLogstashHandler --- logstash/handler_amqp.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/logstash/handler_amqp.py b/logstash/handler_amqp.py index 99d190e..4209964 100644 --- a/logstash/handler_amqp.py +++ b/logstash/handler_amqp.py @@ -27,6 +27,9 @@ class AMQPLogstashHandler(SocketHandler, object): :param exchange_type: AMQP exchange type (default 'fanout'). :param durable: AMQP exchange is durable (default False) :param virtual_host: AMQP virtual host (default '/'). + :param passive: exchange is declared passively, meaning that an error is + raised if the exchange does not exist, and succeeds otherwise. This is + useful if the user does not have configure permission on the exchange. :param tags: list of tags for a logger (default is None). :param message_type: The type of the message (default logstash). @@ -43,8 +46,8 @@ class AMQPLogstashHandler(SocketHandler, object): def __init__(self, host='localhost', port=5672, username='guest', password='guest', exchange='logstash', exchange_type='fanout', virtual_host='/', message_type='logstash', tags=None, - durable=False, version=0, extra_fields=True, fqdn=False, - facility=None, exchange_routing_key=''): + durable=False, passive=False, version=0, extra_fields=True, + fqdn=False, facility=None, exchange_routing_key=''): # AMQP parameters @@ -55,6 +58,7 @@ def __init__(self, host='localhost', port=5672, username='guest', self.exchange_type = exchange_type self.exchange = exchange self.exchange_is_durable = durable + self.declare_exchange_passively = passive self.virtual_host = virtual_host self.routing_key = exchange_routing_key @@ -81,6 +85,7 @@ def makeSocket(self, **kwargs): self.exchange, self.routing_key, self.exchange_is_durable, + self.declare_exchange_passively, self.exchange_type) def makePickle(self, record): @@ -90,7 +95,7 @@ def makePickle(self, record): class PikaSocket(object): def __init__(self, host, port, username, password, virtual_host, exchange, - routing_key, durable, exchange_type): + routing_key, durable, passive, exchange_type): # create connection parameters credentials = pika.PlainCredentials(username, password) @@ -104,6 +109,7 @@ def __init__(self, host, port, username, password, virtual_host, exchange, # create an exchange, if needed self.channel.exchange_declare(exchange=exchange, exchange_type=exchange_type, + passive=passive, durable=durable) # needed when publishing From 6c655f9d4a8834d6f0bed1e97ae94413ab586c90 Mon Sep 17 00:00:00 2001 From: Anwesha Das Date: Wed, 17 Aug 2016 16:38:09 +0530 Subject: [PATCH 19/22] Adds license information to the setup function As suggested in https://packaging.python.org/distributing/#license --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index bcf4eb8..4426821 100644 --- a/setup.py +++ b/setup.py @@ -5,6 +5,7 @@ version='0.4.6', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), + license='MIT', author='Volodymyr Klochan', author_email='vklochan@gmail.com', url='https://github.com/vklochan/python-logstash', From a8f55083153cfedf5ffd49d6809111d1abeb953f Mon Sep 17 00:00:00 2001 From: Alex Zarnitsa Date: Tue, 25 Feb 2020 13:44:48 -0500 Subject: [PATCH 20/22] Added 'stack_info' to the skip_list --- logstash/formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logstash/formatter.py b/logstash/formatter.py index f5c4424..246139b 100644 --- a/logstash/formatter.py +++ b/logstash/formatter.py @@ -28,7 +28,7 @@ def get_extra_fields(self, record): 'funcName', 'id', 'levelname', 'levelno', 'lineno', 'module', 'msecs', 'msecs', 'message', 'msg', 'name', 'pathname', 'process', 'processName', 'relativeCreated', 'thread', 'threadName', 'extra', - 'auth_token', 'password') + 'auth_token', 'password', 'stack_info') if sys.version_info < (3, 0): easy_types = (basestring, bool, dict, float, int, long, list, type(None)) From 108310c311404464b98168b7f04247c2522da968 Mon Sep 17 00:00:00 2001 From: Alex Zarnitsa Date: Fri, 25 Mar 2022 15:38:50 -0400 Subject: [PATCH 21/22] Object of type 'datetime' is not JSON serializable --- logstash/formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logstash/formatter.py b/logstash/formatter.py index 246139b..2b5d618 100644 --- a/logstash/formatter.py +++ b/logstash/formatter.py @@ -82,7 +82,7 @@ def serialize(cls, message): if sys.version_info < (3, 0): return json.dumps(message) else: - return bytes(json.dumps(message), 'utf-8') + return bytes(json.dumps(message, default=str), 'utf-8') class LogstashFormatterVersion0(LogstashFormatterBase): version = 0 From 5d8ec9e7a7ae05d38ad69ddfda0ecfb52dc65b2c Mon Sep 17 00:00:00 2001 From: Alex Zarnitsa Date: Mon, 28 Mar 2022 15:55:07 -0400 Subject: [PATCH 22/22] Object of type 'datetime' is not JSON serializable - DEV --- README.rst | 2 ++ setup.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index aec1c3a..9b19ed9 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,8 @@ http://logstash.net/ Changelog ========= +0.4.8 + - Fixed Python 3 issues with JSON serialization. 0.4.7 - Add couple of sensitive fields to the skip_list 0.4.6 diff --git a/setup.py b/setup.py index 3329e91..a7be6bf 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='python-logstash', packages=['logstash'], - version='0.4.7', + version='0.4.8', description='Python logging handler for Logstash.', long_description=open('README.rst').read(), license='MIT',