diff --git a/src/backend/base/langflow/utils/logger.py b/src/backend/base/langflow/utils/logger.py
index 48783710a..c84cbeced 100644
--- a/src/backend/base/langflow/utils/logger.py
+++ b/src/backend/base/langflow/utils/logger.py
@@ -1,5 +1,6 @@
import logging
import os
+import sys
from pathlib import Path
from typing import Optional
@@ -11,7 +12,7 @@ from rich.logging import RichHandler
VALID_LOG_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
-def serialize(record):
+def serialize_log(record):
subset = {
"timestamp": record["time"].timestamp(),
"message": record["message"],
@@ -22,54 +23,67 @@ def serialize(record):
def patching(record):
- record["extra"]["serialized"] = serialize(record)
+ record["extra"]["serialized"] = serialize_log(record)
-def configure(log_level: Optional[str] = None, log_file: Optional[Path] = None, disable: Optional[bool] = False):
+def configure(
+ log_level: Optional[str] = None,
+ log_file: Optional[Path] = None,
+ disable: Optional[bool] = False,
+ log_env: Optional[str] = None,
+):
if disable and log_level is None and log_file is None:
logger.disable("langflow")
if os.getenv("LANGFLOW_LOG_LEVEL", "").upper() in VALID_LOG_LEVELS and log_level is None:
log_level = os.getenv("LANGFLOW_LOG_LEVEL")
if log_level is None:
log_level = "ERROR"
- # Human-readable
- log_format = (
- "{time:YYYY-MM-DD HH:mm:ss} - "
- "{level: <8} - {module} - {message}"
- )
- # log_format = log_format_dev if log_level.upper() == "DEBUG" else log_format_prod
+ if log_env is None:
+ log_env = os.getenv("LANGFLOW_LOG_ENV", "")
+
logger.remove() # Remove default handlers
logger.patch(patching)
- # Configure loguru to use RichHandler
- logger.configure(
- handlers=[
- {
- "sink": RichHandler(rich_tracebacks=True, markup=True),
- "format": log_format,
- "level": log_level.upper(),
- }
- ]
- )
-
- if not log_file:
- cache_dir = Path(user_cache_dir("langflow"))
- logger.debug(f"Cache directory: {cache_dir}")
- log_file = cache_dir / "langflow.log"
- logger.debug(f"Log file: {log_file}")
- try:
- log_file = Path(log_file)
- log_file.parent.mkdir(parents=True, exist_ok=True)
-
- logger.add(
- sink=str(log_file),
- level=log_level.upper(),
- format=log_format,
- rotation="10 MB", # Log rotation based on file size
- serialize=True,
+ if log_env.lower() == "container" or log_env.lower() == "container_json":
+ logger.add(sys.stdout, format="{message}", serialize=True)
+ elif log_env.lower() == "container_csv":
+ logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {file} {line} {function} {message}")
+ else:
+ # Human-readable
+ log_format = (
+ "{time:YYYY-MM-DD HH:mm:ss} - "
+ "{level: <8} - {module} - {message}"
)
- except Exception as exc:
- logger.error(f"Error setting up log file: {exc}")
+
+ # Configure loguru to use RichHandler
+ logger.configure(
+ handlers=[
+ {
+ "sink": RichHandler(rich_tracebacks=True, markup=True),
+ "format": log_format,
+ "level": log_level.upper(),
+ }
+ ]
+ )
+
+ if not log_file:
+ cache_dir = Path(user_cache_dir("langflow"))
+ logger.debug(f"Cache directory: {cache_dir}")
+ log_file = cache_dir / "langflow.log"
+ logger.debug(f"Log file: {log_file}")
+ try:
+ log_file = Path(log_file)
+ log_file.parent.mkdir(parents=True, exist_ok=True)
+
+ logger.add(
+ sink=str(log_file),
+ level=log_level.upper(),
+ format=log_format,
+ rotation="10 MB", # Log rotation based on file size
+ serialize=True,
+ )
+ except Exception as exc:
+ logger.error(f"Error setting up log file: {exc}")
logger.debug(f"Logger set up with log level: {log_level}")