From 788fce89a21e1c10d391d3b438dd706f581a58e7 Mon Sep 17 00:00:00 2001 From: Niels Albers Date: Sun, 15 Sep 2019 13:19:45 +0200 Subject: [PATCH] closes #1: Found that gunicorn logger not passed in logging object, but as data in event dict. --- gunicorn.conf.py | 38 ++++++++++++++++++++++++++++++ setup.py | 4 ++-- structlog_extensions/processors.py | 10 +++++--- test_flask/__init__.py | 0 test_flask/app.py | 10 ++++++++ test_flask/wsgi.py | 4 ++++ 6 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 gunicorn.conf.py create mode 100644 test_flask/__init__.py create mode 100644 test_flask/app.py create mode 100644 test_flask/wsgi.py diff --git a/gunicorn.conf.py b/gunicorn.conf.py new file mode 100644 index 0000000..a1603f7 --- /dev/null +++ b/gunicorn.conf.py @@ -0,0 +1,38 @@ +import structlog +import structlog_extensions + +# --- Structlog logging initialisation code + +pre_chain = [ + # Add the log level and a timestamp to the event_dict if the log entry + # is not from structlog. + structlog.stdlib.add_log_level, + structlog.stdlib.add_logger_name, + structlog_extensions.processors.CombinedLogParser("gunicorn.access") +] + +logconfig_dict = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "json_formatter": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.processors.JSONRenderer(), + "foreign_pre_chain": pre_chain, + } + }, + "handlers": { + "error_console": { + "class": "logging.StreamHandler", + "formatter": "json_formatter", + }, + "console": { + "class": "logging.StreamHandler", + "formatter": "json_formatter", + } + }, + } + +accesslog = '-' +errorlog = '-' +bind = '0.0.0.0:5000' \ No newline at end of file diff --git a/setup.py b/setup.py index 266fb6e..9e57e6a 100644 --- a/setup.py +++ b/setup.py @@ -1,13 +1,13 @@ from setuptools import setup -KEYWORDS = ["logging", "structured", "structure", "log","ecs","apache-combined-log"] +KEYWORDS = ["logging", "structured", "structure", "log", "ecs", "apache-combined-log"] with open("README.rst", "r") as fh: long_description = fh.read() setup( name='structlog-extensions-nralbers', - version='1.0.2', + version='1.0.3', packages=['structlog_extensions'], url='https://structlog-extensions-nralbers.readthedocs.io/en/latest/', project_urls={ diff --git a/structlog_extensions/processors.py b/structlog_extensions/processors.py index 250db52..bba8aff 100644 --- a/structlog_extensions/processors.py +++ b/structlog_extensions/processors.py @@ -145,16 +145,20 @@ def __init__(self, target_logger): def __call__(self, logger, method_name, event_dict): try: - if logger and logger.name == self.target_logger: + record = event_dict.get("_record") + if record is None: + logger_name = logger.name + else: + logger_name = record.name + if logger_name == self.target_logger: if method_name in ['info', 'warn', 'warning', 'error', 'critical', 'debug']: severity = getattr(logging, method_name.upper()) else: severity = 0 original_event = event_dict['event'] - ecs_fields = convert_combined_log_to_ecs(log_line=original_event, dataset=logger.name, + ecs_fields = convert_combined_log_to_ecs(log_line=original_event, dataset=logger_name, severity=severity) event_dict.update(ecs_fields) - finally: return event_dict diff --git a/test_flask/__init__.py b/test_flask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test_flask/app.py b/test_flask/app.py new file mode 100644 index 0000000..6f02726 --- /dev/null +++ b/test_flask/app.py @@ -0,0 +1,10 @@ +from flask import Flask +app = Flask(__name__) + + +@app.route('/') +def hello_world(): + return 'Hello, World!' + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/test_flask/wsgi.py b/test_flask/wsgi.py new file mode 100644 index 0000000..5ce9f6c --- /dev/null +++ b/test_flask/wsgi.py @@ -0,0 +1,4 @@ +from .app import app + +if __name__ == "__main__": + app.run() \ No newline at end of file