From 9bf70cfce5e88ff9236802f862c6ac8f998d5d1b Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Mon, 11 Jan 2021 19:29:18 +0100
Subject: [PATCH] =?UTF-8?q?Dal=C5=A1=C3=AD=20pokra=C4=8Dov=C3=A1n=C3=AD=20?=
 =?UTF-8?q?s=C3=A1gy=20o=20logov=C3=A1n=C3=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Odhodlání pythoních modulů logovat si po svém je nebetyčné :(
---
 mo/web/__init__.py | 45 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 11 deletions(-)

diff --git a/mo/web/__init__.py b/mo/web/__init__.py
index b4f5183e..2a16ef2a 100644
--- a/mo/web/__init__.py
+++ b/mo/web/__init__.py
@@ -32,17 +32,6 @@ db.flask_db = SQLAlchemy(app, metadata=db.metadata)
 
 Bootstrap(app)  # make bootstrap libs accessible for the app
 
-# Nastavíme logování:
-#   - náš hlavní logger se jmenuje "mo"
-#   - app.logger se jmenuje "mo.web" a nepropaguje se do hlavního
-log_handler = flask.logging.default_handler
-log_formatter = logging.Formatter(fmt='%(asctime)-15s.%(msecs)03d %(levelname)-5.5s [%(process)s] (%(name)s) %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
-log_handler.setFormatter(log_formatter)
-app.logger.removeHandler(log_handler)
-app.logger.setLevel(logging.DEBUG)
-root_logger = logging.getLogger()
-root_logger.addHandler(log_handler)
-
 # Budeme používat české locale
 locale.setlocale(locale.LC_COLLATE, 'cs_CZ.UTF-8')
 
@@ -54,6 +43,40 @@ app.jinja_env.filters.update(timedelta=util_format.timedelta)
 app.jinja_env.filters.update(time_and_timedelta=util_format.time_and_timedelta)
 
 
+# Incializace logování
+
+def setup_logging():
+    # Logování v Pythonu je vymyšlené hezky, ale bohužel spousta modulů má tendenci
+    # konfigurovat si u svých loggerů náhodné handlery. Pokud chceme, aby bylo logování
+    # aspoň trochu jednotné, musíme jim to trochu předrátovat.
+
+    # Nastavíme root logger, aby logoval po našem do flaskového logu
+    log_handler = flask.logging.default_handler
+    log_formatter = logging.Formatter(fmt='%(asctime)-15s.%(msecs)03d %(levelname)-5.5s [%(process)s] (%(name)s) %(message)s',
+                                      datefmt='%Y-%m-%d %H:%M:%S')
+    log_handler.setFormatter(log_formatter)
+    root_logger = logging.getLogger()
+    root_logger.addHandler(log_handler)
+
+    # app.logger se jmenuje "mo.web" a propaguje se do root loggeru,
+    # takže nechceme, aby měl svůj handler.
+    app.logger.removeHandler(log_handler)
+    app.logger.setLevel(logging.DEBUG)
+
+    # sqlalchemy má logger, ke kterému si při prvním vypsání hlášky přidá handler,
+    # není-li tam zatím žádný. Tak přidáme dummy handler. Vše se propaguje do root loggeru.
+    sqla_logger = logging.getLogger('sqlalchemy.engine.base.Engine')
+    sqla_logger.addHandler(logging.NullHandler())
+
+    # werkzeug má vlastní handler s vlastním formátem hlášek, který už obsahuje timestamp,
+    # takže vypneme propagování
+    wz_logger = logging.getLogger('werkzeug')
+    wz_logger.propagate = False
+
+
+setup_logging()
+
+
 # Inicializace požadavků a nucená autorizace
 
 class NeedLoginError(werkzeug.exceptions.Forbidden):
-- 
GitLab