From bab5c542197f935d35fe75eb5d2c3301fbbf58b4 Mon Sep 17 00:00:00 2001 From: Bowen Liang Date: Wed, 30 Oct 2024 11:18:23 +0800 Subject: [PATCH] chore: improve validation and handler of logging timezone with TimezoneName (#9595) --- api/configs/feature/__init__.py | 6 ++++-- api/extensions/ext_logging.py | 16 ++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) 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() + )