Forráskód Böngészése

修 Python 日志配置,为 FileHandler 添加一个自定义的 Formatter,专门过滤掉 ANSI 转义序列。

tanlie 6 napja
szülő
commit
ed4e1707a1
2 módosított fájl, 21 hozzáadás és 3 törlés
  1. 1 0
      .gitignore
  2. 20 3
      app/utils/logger.py

+ 1 - 0
.gitignore

@@ -21,3 +21,4 @@ build/
 .vscode/
 .DS_Store
 Thumbs.db
+logs/

+ 20 - 3
app/utils/logger.py

@@ -1,9 +1,20 @@
 import logging
 from logging.config import dictConfig
 import os
+import re
 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):
     """Configure logging: console, optional file and external HTTP handler.
 
@@ -28,10 +39,12 @@ def setup_logging(app):
     log_file = os.getenv("LOG_FILE")
     if log_file:
         # 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"] = {
             "class": "logging.handlers.RotatingFileHandler",
-            "formatter": "default",
+            "formatter": "file",
             "level": level,
             "filename": log_file,
             "maxBytes": int(os.getenv("LOG_MAX_BYTES", 10 * 1024 * 1024)),
@@ -57,7 +70,11 @@ def setup_logging(app):
         "formatters": {
             "default": {
                 "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,
         "root": {