diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index 0fa926038d..a8a4170f67 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -10,6 +10,7 @@ from pydantic import ( PositiveInt, computed_field, ) +from pydantic_extra_types.timezone_name import TimeZoneName from pydantic_settings import BaseSettings from configs.feature.hosted_service import HostedServiceConfig @@ -339,8 +340,9 @@ class LoggingConfig(BaseSettings): default=None, ) - LOG_TZ: Optional[str] = Field( - description="Timezone for log timestamps (e.g., 'America/New_York')", + LOG_TZ: Optional[TimeZoneName] = Field( + description="Timezone for log timestamps. Allowed timezone values can be referred to IANA Time Zone Database," + " e.g., 'America/New_York')", default=None, ) diff --git a/api/extensions/ext_logging.py b/api/extensions/ext_logging.py index 56b1d6bd28..0fa832f420 100644 --- a/api/extensions/ext_logging.py +++ b/api/extensions/ext_logging.py @@ -1,8 +1,10 @@ import logging import os import sys +from datetime import datetime from logging.handlers import RotatingFileHandler +import pytz from flask import Flask from configs import dify_config @@ -30,16 +32,10 @@ def init_app(app: Flask): handlers=log_handlers, force=True, ) + log_tz = dify_config.LOG_TZ if log_tz: - from datetime import datetime - - import pytz - - timezone = pytz.timezone(log_tz) - - def time_converter(seconds): - return datetime.utcfromtimestamp(seconds).astimezone(timezone).timetuple() - for handler in logging.root.handlers: - handler.formatter.converter = time_converter + handler.formatter.converter = lambda seconds: ( + datetime.fromtimestamp(seconds, tz=pytz.UTC).astimezone(log_tz).timetuple() + )