logger.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import logging
  2. from logging.config import dictConfig
  3. import os
  4. from logging.handlers import RotatingFileHandler, HTTPHandler
  5. def setup_logging(app):
  6. """Configure logging: console, optional file and external HTTP handler.
  7. Controlled by env vars:
  8. - LOG_FILE: path to write rotating logs
  9. - LOG_MAX_BYTES: max bytes per file (default 10MB)
  10. - LOG_BACKUP_COUNT: number of backups (default 5)
  11. - EXTERNAL_LOG_URL: if set, an HTTPHandler will POST logs to this URL
  12. """
  13. level = logging.DEBUG if app.config.get("DEBUG") else logging.INFO
  14. handlers = {
  15. "console": {
  16. "class": "logging.StreamHandler",
  17. "formatter": "default",
  18. "level": level,
  19. }
  20. }
  21. root_handlers = ["console"]
  22. log_file = os.getenv("LOG_FILE")
  23. if log_file:
  24. # ensure parent dirs exist
  25. os.makedirs(os.path.dirname(log_file), exist_ok=True)
  26. handlers["file"] = {
  27. "class": "logging.handlers.RotatingFileHandler",
  28. "formatter": "default",
  29. "level": level,
  30. "filename": log_file,
  31. "maxBytes": int(os.getenv("LOG_MAX_BYTES", 10 * 1024 * 1024)),
  32. "backupCount": int(os.getenv("LOG_BACKUP_COUNT", 5)),
  33. }
  34. root_handlers.append("file")
  35. external = os.getenv("EXTERNAL_LOG_URL")
  36. if external:
  37. handlers["external"] = {
  38. "class": "logging.handlers.HTTPHandler",
  39. "formatter": "default",
  40. "level": level,
  41. "host": external,
  42. "url": "/",
  43. "method": "POST",
  44. }
  45. root_handlers.append("external")
  46. config = {
  47. "version": 1,
  48. "disable_existing_loggers": False,
  49. "formatters": {
  50. "default": {
  51. "format": "%(asctime)s %(levelname)s %(name)s: %(message)s",
  52. }
  53. },
  54. "handlers": handlers,
  55. "root": {
  56. "handlers": root_handlers,
  57. "level": level,
  58. },
  59. }
  60. dictConfig(config)