feat: make log format configurable (#4851)
* made logformat configurable * [autofix.ci] apply automated fixes * documentation of log format env var * log stuff at one place in documentation * added documentation of log environment * check for log format * [autofix.ci] apply automated fixes * just load log format on custom logenv * [autofix.ci] apply automated fixes * no more invalid whitespaces * fixed br s with escape * logging error in case of invalid format string --------- Co-authored-by: Kraxner Thomas <thomas.kraxner@illwerkevkw.at> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
2de119b8d5
commit
1e6ada3a3a
2 changed files with 38 additions and 5 deletions
|
|
@ -122,7 +122,10 @@ The following table lists the environment variables supported by Langflow.
|
||||||
| <a id="LANGFLOW_HEALTH_CHECK_MAX_RETRIES"></a>`LANGFLOW_HEALTH_CHECK_MAX_RETRIES` | Integer | `5` | Set the maximum number of retries for the health check.<br/>See [`--health-check-max-retries` option](./configuration-cli.md#run-health-check-max-retries). |
|
| <a id="LANGFLOW_HEALTH_CHECK_MAX_RETRIES"></a>`LANGFLOW_HEALTH_CHECK_MAX_RETRIES` | Integer | `5` | Set the maximum number of retries for the health check.<br/>See [`--health-check-max-retries` option](./configuration-cli.md#run-health-check-max-retries). |
|
||||||
| <a id="LANGFLOW_HOST"></a>`LANGFLOW_HOST` | String | `127.0.0.1` | The host on which the Langflow server will run.<br/>See [`--host` option](./configuration-cli.md#run-host). |
|
| <a id="LANGFLOW_HOST"></a>`LANGFLOW_HOST` | String | `127.0.0.1` | The host on which the Langflow server will run.<br/>See [`--host` option](./configuration-cli.md#run-host). |
|
||||||
| <a id="LANGFLOW_LANGCHAIN_CACHE"></a>`LANGFLOW_LANGCHAIN_CACHE` | `InMemoryCache`<br/>`SQLiteCache` | `InMemoryCache` | Type of cache to use.<br/>See [`--cache` option](./configuration-cli.md#run-cache). |
|
| <a id="LANGFLOW_LANGCHAIN_CACHE"></a>`LANGFLOW_LANGCHAIN_CACHE` | `InMemoryCache`<br/>`SQLiteCache` | `InMemoryCache` | Type of cache to use.<br/>See [`--cache` option](./configuration-cli.md#run-cache). |
|
||||||
|
| <a id="LANGFLOW_MAX_FILE_SIZE_UPLOAD"></a>`LANGFLOW_MAX_FILE_SIZE_UPLOAD` | Integer | `100` | Set the maximum file size for the upload in megabytes.<br/>See [`--max-file-size-upload` option](./configuration-cli.md#run-max-file-size-upload). |
|
||||||
|
| <a id="LANGFLOW_LOG_ENV"></a>`LANGFLOW_LOG_ENV` | `container_json`<br/>`container_csv`<br/> | Not set | Set the log environment. Default (Not set) is json with color. If not set a format string can be provided.<br/> See [`LANGFLOW_LOG_FORMAT`](#LANGFLOW_CACHE_TYPE) |
|
||||||
| <a id="LANGFLOW_LOG_FILE"></a>`LANGFLOW_LOG_FILE` | String | `logs/langflow.log` | Set the path to the log file for Langflow.<br/>See [`--log-file` option](./configuration-cli.md#run-log-file). |
|
| <a id="LANGFLOW_LOG_FILE"></a>`LANGFLOW_LOG_FILE` | String | `logs/langflow.log` | Set the path to the log file for Langflow.<br/>See [`--log-file` option](./configuration-cli.md#run-log-file). |
|
||||||
|
| <a id="LANGFLOW_LOG_FORMAT"></a>`LANGFLOW_LOG_FORMAT` | String | `<green>{time:YYYY-MM-DD HH:mm:ss}</green> - <level>{level: <8}</level> - {module} - <level>{message}</level>` | Configure the logformat.<br/>For example without colors: `{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {file} {line} {function} {message}` <br/> If [`LANGFLOW_LOG_ENV`](#LANGFLOW_LOG_ENV) is set this configuration will be ignored.
|
||||||
| <a id="LANGFLOW_LOG_LEVEL"></a>`LANGFLOW_LOG_LEVEL` | `debug`<br/>`info`<br/>`warning`<br/>`error`<br/>`critical` | `critical` | Set the logging level.<br/>See [`--log-level` option](./configuration-cli.md#run-log-level). |
|
| <a id="LANGFLOW_LOG_LEVEL"></a>`LANGFLOW_LOG_LEVEL` | `debug`<br/>`info`<br/>`warning`<br/>`error`<br/>`critical` | `critical` | Set the logging level.<br/>See [`--log-level` option](./configuration-cli.md#run-log-level). |
|
||||||
| <a id="LANGFLOW_MAX_FILE_SIZE_UPLOAD"></a>`LANGFLOW_MAX_FILE_SIZE_UPLOAD` | Integer | `100` | Set the maximum file size for the upload in megabytes.<br/>See [`--max-file-size-upload` option](./configuration-cli.md#run-max-file-size-upload). |
|
| <a id="LANGFLOW_MAX_FILE_SIZE_UPLOAD"></a>`LANGFLOW_MAX_FILE_SIZE_UPLOAD` | Integer | `100` | Set the maximum file size for the upload in megabytes.<br/>See [`--max-file-size-upload` option](./configuration-cli.md#run-max-file-size-upload). |
|
||||||
| <a id="LANGFLOW_OPEN_BROWSER"></a>`LANGFLOW_OPEN_BROWSER` | Boolean | `true` | Open the system web browser on startup.<br/> See [`--open-browser` option](./configuration-cli.md#run-open-browser). |
|
| <a id="LANGFLOW_OPEN_BROWSER"></a>`LANGFLOW_OPEN_BROWSER` | Boolean | `true` | Open the system web browser on startup.<br/> See [`--open-browser` option](./configuration-cli.md#run-open-browser). |
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,10 @@ from typing_extensions import NotRequired
|
||||||
from langflow.settings import DEV
|
from langflow.settings import DEV
|
||||||
|
|
||||||
VALID_LOG_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
|
VALID_LOG_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
|
||||||
|
# Human-readable
|
||||||
|
DEFAULT_LOG_FORMAT = (
|
||||||
|
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> - <level>" "{level: <8}</level> - {module} - <level>{message}</level>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class SizedLogBuffer:
|
class SizedLogBuffer:
|
||||||
|
|
@ -147,6 +151,7 @@ class LogConfig(TypedDict):
|
||||||
log_file: NotRequired[Path]
|
log_file: NotRequired[Path]
|
||||||
disable: NotRequired[bool]
|
disable: NotRequired[bool]
|
||||||
log_env: NotRequired[str]
|
log_env: NotRequired[str]
|
||||||
|
log_format: NotRequired[str]
|
||||||
|
|
||||||
|
|
||||||
class AsyncFileSink(AsyncSink):
|
class AsyncFileSink(AsyncSink):
|
||||||
|
|
@ -166,12 +171,37 @@ class AsyncFileSink(AsyncSink):
|
||||||
await asyncio.to_thread(self._sink.write, message)
|
await asyncio.to_thread(self._sink.write, message)
|
||||||
|
|
||||||
|
|
||||||
|
def is_valid_log_format(format_string) -> bool:
|
||||||
|
"""Validates a logging format string by attempting to format it with a dummy LogRecord.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
format_string (str): The format string to validate.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if the format string is valid, False otherwise.
|
||||||
|
"""
|
||||||
|
record = logging.LogRecord(
|
||||||
|
name="dummy", level=logging.INFO, pathname="dummy_path", lineno=0, msg="dummy message", args=None, exc_info=None
|
||||||
|
)
|
||||||
|
|
||||||
|
formatter = logging.Formatter(format_string)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Attempt to format the record
|
||||||
|
formatter.format(record)
|
||||||
|
except (KeyError, ValueError, TypeError):
|
||||||
|
logger.error("Invalid log format string passed, fallback to default")
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def configure(
|
def configure(
|
||||||
*,
|
*,
|
||||||
log_level: str | None = None,
|
log_level: str | None = None,
|
||||||
log_file: Path | None = None,
|
log_file: Path | None = None,
|
||||||
disable: bool | None = False,
|
disable: bool | None = False,
|
||||||
log_env: str | None = None,
|
log_env: str | None = None,
|
||||||
|
log_format: str | None = None,
|
||||||
async_file: bool = False,
|
async_file: bool = False,
|
||||||
) -> None:
|
) -> None:
|
||||||
if disable and log_level is None and log_file is None:
|
if disable and log_level is None and log_file is None:
|
||||||
|
|
@ -195,11 +225,11 @@ def configure(
|
||||||
elif log_env.lower() == "container_csv":
|
elif log_env.lower() == "container_csv":
|
||||||
logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {file} {line} {function} {message}")
|
logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {file} {line} {function} {message}")
|
||||||
else:
|
else:
|
||||||
# Human-readable
|
if os.getenv("LANGFLOW_LOG_FORMAT") and log_format is None:
|
||||||
log_format = (
|
log_format = os.getenv("LANGFLOW_LOG_FORMAT")
|
||||||
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> - <level>"
|
|
||||||
"{level: <8}</level> - {module} - <level>{message}</level>"
|
if log_format is None or not is_valid_log_format(log_format):
|
||||||
)
|
log_format = DEFAULT_LOG_FORMAT
|
||||||
|
|
||||||
# Configure loguru to use RichHandler
|
# Configure loguru to use RichHandler
|
||||||
logger.configure(
|
logger.configure(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue