mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-06-28 02:53:30 +00:00
feat: add support for LLAMA_STACK_LOG_FILE (#1450)
# What does this PR do? setting $LLAMA_STACK_LOG_FILE will pipe the logs to a file as well as stdout. this is done by using a logging FileHandler Signed-off-by: Charlie Doern <cdoern@redhat.com>
This commit is contained in:
parent
83a2c78615
commit
b647ecd9ed
2 changed files with 33 additions and 16 deletions
|
@ -33,6 +33,8 @@ Can be set to any of the following log levels:
|
||||||
|
|
||||||
The default global log level is `info`. `all` sets the log level for all components.
|
The default global log level is `info`. `all` sets the log level for all components.
|
||||||
|
|
||||||
|
A user can also set `LLAMA_STACK_LOG_FILE` which will pipe the logs to the specified path as well as to the terminal. An example would be: `export LLAMA_STACK_LOG_FILE=server.log`
|
||||||
|
|
||||||
### Llama Stack Build
|
### Llama Stack Build
|
||||||
|
|
||||||
In order to build your own distribution, we recommend you clone the `llama-stack` repository.
|
In order to build your own distribution, we recommend you clone the `llama-stack` repository.
|
||||||
|
|
|
@ -97,12 +97,13 @@ class CustomRichHandler(RichHandler):
|
||||||
self.markup = original_markup
|
self.markup = original_markup
|
||||||
|
|
||||||
|
|
||||||
def setup_logging(category_levels: Dict[str, int]) -> None:
|
def setup_logging(category_levels: Dict[str, int], log_file: str | None) -> None:
|
||||||
"""
|
"""
|
||||||
Configure logging based on the provided category log levels.
|
Configure logging based on the provided category log levels and an optional log file.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
category_levels (Dict[str, int]): A dictionary mapping categories to their log levels.
|
category_levels (Dict[str, int]): A dictionary mapping categories to their log levels.
|
||||||
|
log_file (str): Path to a log file to additionally pipe the logs into
|
||||||
"""
|
"""
|
||||||
log_format = "[dim]%(asctime)s %(name)s:%(lineno)d[/] [yellow dim]%(category)s[/]: %(message)s"
|
log_format = "[dim]%(asctime)s %(name)s:%(lineno)d[/] [yellow dim]%(category)s[/]: %(message)s"
|
||||||
|
|
||||||
|
@ -117,6 +118,28 @@ def setup_logging(category_levels: Dict[str, int]) -> None:
|
||||||
# Determine the root logger's level (default to WARNING if not specified)
|
# Determine the root logger's level (default to WARNING if not specified)
|
||||||
root_level = category_levels.get("root", logging.WARNING)
|
root_level = category_levels.get("root", logging.WARNING)
|
||||||
|
|
||||||
|
handlers = {
|
||||||
|
"console": {
|
||||||
|
"()": CustomRichHandler, # Use custom console handler
|
||||||
|
"formatter": "rich",
|
||||||
|
"rich_tracebacks": True,
|
||||||
|
"show_time": False,
|
||||||
|
"show_path": False,
|
||||||
|
"markup": True,
|
||||||
|
"filters": ["category_filter"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add a file handler if log_file is set
|
||||||
|
if log_file:
|
||||||
|
handlers["file"] = {
|
||||||
|
"class": "logging.FileHandler",
|
||||||
|
"formatter": "rich",
|
||||||
|
"filename": log_file,
|
||||||
|
"mode": "a",
|
||||||
|
"encoding": "utf-8",
|
||||||
|
}
|
||||||
|
|
||||||
logging_config = {
|
logging_config = {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"disable_existing_loggers": False,
|
"disable_existing_loggers": False,
|
||||||
|
@ -126,17 +149,7 @@ def setup_logging(category_levels: Dict[str, int]) -> None:
|
||||||
"format": log_format,
|
"format": log_format,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"handlers": {
|
"handlers": handlers,
|
||||||
"console": {
|
|
||||||
"()": CustomRichHandler, # Use our custom handler class
|
|
||||||
"formatter": "rich",
|
|
||||||
"rich_tracebacks": True,
|
|
||||||
"show_time": False,
|
|
||||||
"show_path": False,
|
|
||||||
"markup": True,
|
|
||||||
"filters": ["category_filter"],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"filters": {
|
"filters": {
|
||||||
"category_filter": {
|
"category_filter": {
|
||||||
"()": CategoryFilter,
|
"()": CategoryFilter,
|
||||||
|
@ -144,14 +157,14 @@ def setup_logging(category_levels: Dict[str, int]) -> None:
|
||||||
},
|
},
|
||||||
"loggers": {
|
"loggers": {
|
||||||
category: {
|
category: {
|
||||||
"handlers": ["console"],
|
"handlers": list(handlers.keys()), # Apply all handlers
|
||||||
"level": category_levels.get(category, DEFAULT_LOG_LEVEL),
|
"level": category_levels.get(category, DEFAULT_LOG_LEVEL),
|
||||||
"propagate": False, # Disable propagation to root logger
|
"propagate": False, # Disable propagation to root logger
|
||||||
}
|
}
|
||||||
for category in CATEGORIES
|
for category in CATEGORIES
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"handlers": ["console"],
|
"handlers": list(handlers.keys()),
|
||||||
"level": root_level, # Set root logger's level dynamically
|
"level": root_level, # Set root logger's level dynamically
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -180,4 +193,6 @@ if env_config:
|
||||||
cprint(f"Environment variable LLAMA_STACK_LOGGING found: {env_config}", "yellow")
|
cprint(f"Environment variable LLAMA_STACK_LOGGING found: {env_config}", "yellow")
|
||||||
_category_levels.update(parse_environment_config(env_config))
|
_category_levels.update(parse_environment_config(env_config))
|
||||||
|
|
||||||
setup_logging(_category_levels)
|
log_file = os.environ.get("LLAMA_STACK_LOG_FILE")
|
||||||
|
|
||||||
|
setup_logging(_category_levels, log_file)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue