dify 尽管正确设置了时区,日志中的Timestamp仍落后8小时,

az31mfrm  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(57)

自检

  • 此仅用于提交错误报告,如果您想提问,请访问 Discussions
  • 我已在 search for existing issues 中搜索了现有问题,包括已关闭的问题。
  • 我确认我使用英文提交此报告(我已阅读并同意 Language Policy )。
  • 请不要修改此模板 :) 并填写所有必填字段。

Dify版本

0.6.11

云或自托管

自托管(Docker)

重现步骤

我使用Docker部署了Dify,并在Web界面上将时区设置为UTC+8。我还将TZ:Asia/Shanghai添加到了docker-compose.yaml文件中。容器内的时间是正确的,但日志中的时间戳仍然落后8小时。如何解决这个问题?

容器内的时间是正确的。后端服务时区是否可以配置为与容器时区匹配?

✔️预期行为

后端容器的日志时间戳设置为Zone 8

❌实际行为

后端容器的日志时间戳只能是UTC时间

gdx19jrr

gdx19jrr1#

嘿,@ZimaBlueee!👋 我来帮你解决bug问题,回答问题,并成为贡献者。让我们一起解决这些bug吧!
为了确保日志时间戳与容器的时区匹配,你需要正确配置容器和后端服务。以下是实现这一目标的步骤:

  1. 设置容器时区:确保你的 docker-compose.yml 文件中容器的时区设置正确。
version: '3.8'

services:
  web:
    image: your_image_name
    environment:
      - TZ=Asia/Shanghai
    # Other service configurations...
  1. 配置后端服务时区:修改后端服务以使用指定的时区进行日志记录。这包括在 api/configs/feature/__init__.py 文件中设置 LOG_TZ 配置,并确保日志记录配置使用此时区。
    api/configs/feature/__init__.py 中:
class LoggingConfigs(BaseModel):
    """
Logging configs
"""

    LOG_LEVEL: str = Field(
        description='Log output level, default to INFO.'
                    'It is recommended to set it to ERROR for production.',
        default='INFO',
    )

    LOG_FILE: Optional[str] = Field(
        description='logging output file path',
        default=None,
    )

    LOG_FORMAT: str = Field(
        description='log format',
        default='%(asctime)s.%(msecs)03d %(levelname)s [%(threadName)s] [%(filename)s:%(lineno)d] - %(message)s',
    )

    LOG_DATEFORMAT: Optional[str] = Field(
        description='log date format',
        default=None,
    )

    LOG_TZ: Optional[str] = Field(
        description='specify log timezone, eg: America/New_York',
        default='Asia/Shanghai',
    )
  1. 更新日志记录配置:确保 api/app.py 中的日志记录配置使用指定的时区。
    api/app.py 中:
def create_app() -> Flask:
    app = create_flask_app_with_configs()

    app.secret_key = app.config['SECRET_KEY']

    log_handlers = None
    log_file = app.config.get('LOG_FILE')
    if log_file:
        log_dir = os.path.dirname(log_file)
        os.makedirs(log_dir, exist_ok=True)
        log_handlers = [
            RotatingFileHandler(
                filename=log_file,
                maxBytes=1024 * 1024 * 1024,
                backupCount=5
            ),
            logging.StreamHandler(sys.stdout)
        ]

    logging.basicConfig(
        level=app.config.get('LOG_LEVEL'),
        format=app.config.get('LOG_FORMAT'),
        datefmt=app.config.get('LOG_DATEFORMAT'),
        handlers=log_handlers,
        force=True
    )
    log_tz = app.config.get('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

    initialize_extensions(app)
    register_blueprints(app)
    register_commands(app)

    return app

遵循这些步骤,你应该能够确保日志时间戳与容器的时区 1(https://github.com/langgenius/dify/blob/main/api/app.py)2(https://github.com/langgenius/dify/blob/main/api/configs/feature/init.py) 匹配。

  • 要继续与 Dosu 对话,请提及 @dosu。*
tuwxkamq

tuwxkamq2#

我使用官方的Docker镜像,无需手动编译,无法修改容器内的代码。

dwthyt8l

dwthyt8l3#

if os.name == "nt": os.system('tzutil /s "China Standard Time"') else: os.environ['TZ'] = 'Asia/Shanghai' time.tzset()

相关问题