|
@@ -1,9 +1,20 @@
|
|
|
import logging
|
|
import logging
|
|
|
from logging.config import dictConfig
|
|
from logging.config import dictConfig
|
|
|
import os
|
|
import os
|
|
|
|
|
+import re
|
|
|
from logging.handlers import RotatingFileHandler, HTTPHandler
|
|
from logging.handlers import RotatingFileHandler, HTTPHandler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class StripAnsiFormatter(logging.Formatter):
|
|
|
|
|
+ """Formatter that strips ANSI escape sequences from formatted log text."""
|
|
|
|
|
+
|
|
|
|
|
+ ANSI_RE = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]")
|
|
|
|
|
+
|
|
|
|
|
+ def format(self, record):
|
|
|
|
|
+ text = super().format(record)
|
|
|
|
|
+ return self.ANSI_RE.sub("", text)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def setup_logging(app):
|
|
def setup_logging(app):
|
|
|
"""Configure logging: console, optional file and external HTTP handler.
|
|
"""Configure logging: console, optional file and external HTTP handler.
|
|
|
|
|
|
|
@@ -28,10 +39,12 @@ def setup_logging(app):
|
|
|
log_file = os.getenv("LOG_FILE")
|
|
log_file = os.getenv("LOG_FILE")
|
|
|
if log_file:
|
|
if log_file:
|
|
|
# ensure parent dirs exist
|
|
# ensure parent dirs exist
|
|
|
- os.makedirs(os.path.dirname(log_file), exist_ok=True)
|
|
|
|
|
|
|
+ dirname = os.path.dirname(log_file)
|
|
|
|
|
+ if dirname:
|
|
|
|
|
+ os.makedirs(dirname, exist_ok=True)
|
|
|
handlers["file"] = {
|
|
handlers["file"] = {
|
|
|
"class": "logging.handlers.RotatingFileHandler",
|
|
"class": "logging.handlers.RotatingFileHandler",
|
|
|
- "formatter": "default",
|
|
|
|
|
|
|
+ "formatter": "file",
|
|
|
"level": level,
|
|
"level": level,
|
|
|
"filename": log_file,
|
|
"filename": log_file,
|
|
|
"maxBytes": int(os.getenv("LOG_MAX_BYTES", 10 * 1024 * 1024)),
|
|
"maxBytes": int(os.getenv("LOG_MAX_BYTES", 10 * 1024 * 1024)),
|
|
@@ -57,7 +70,11 @@ def setup_logging(app):
|
|
|
"formatters": {
|
|
"formatters": {
|
|
|
"default": {
|
|
"default": {
|
|
|
"format": "%(asctime)s %(levelname)s %(name)s: %(message)s",
|
|
"format": "%(asctime)s %(levelname)s %(name)s: %(message)s",
|
|
|
- }
|
|
|
|
|
|
|
+ },
|
|
|
|
|
+ "file": {
|
|
|
|
|
+ "()": "app.utils.logger.StripAnsiFormatter",
|
|
|
|
|
+ "format": "%(asctime)s %(levelname)s %(name)s: %(message)s",
|
|
|
|
|
+ },
|
|
|
},
|
|
},
|
|
|
"handlers": handlers,
|
|
"handlers": handlers,
|
|
|
"root": {
|
|
"root": {
|