You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改服务器时区后Express应用日志仍不使用本地时间是什么原因?

问题原因

你修改的是系统层时区,出现日志时间未同步主要是morgan默认配置、Node.js进程时区规则两个层面的问题,按以下顺序排查解决即可:

1. morgan默认输出UTC时间(最高概率)

morgan的common格式默认遵循通用日志格式标准,强制输出UTC时间戳,不受系统时区影响,仅需修改morgan配置即可关闭UTC输出:

// 将原有的morgan引用修改为如下配置,关闭utc参数即可使用本地时间输出
app.use(morgan('common', { utc: false }));

如果需要自定义时间格式,可以通过token方式实现:

const morgan = require('morgan');
// 注册自定义本地时间token
morgan.token('localTime', () => new Date().toLocaleString('es-AR', { timeZone: 'America/Argentina/Buenos_Aires' }));
// 自定义日志格式,和common格式逻辑一致仅替换时间字段
const customLogFormat = ':remote-addr - :remote-user [:localTime] ":method :url HTTP/:http-version" :status :res[content-length]';
app.use(morgan(customLogFormat));

2. Node.js进程时区未同步系统配置

如果修改morgan配置后仍然无效,说明Node.js进程读取到的时区还是UTC,排查以下场景:

  • 若你使用systemd、pm2等进程托管工具,这类工具的配置可能单独设置了TZ=UTC环境变量,优先级高于系统时区:
    • systemd场景:检查应用的service配置文件(通常位于/etc/systemd/system/目录下),删除Environment=TZ=UTC配置项,执行systemctl daemon-reload后重启应用
    • pm2场景:执行pm2 env 应用ID查看是否存在TZ变量,若存在执行pm2 set env TZ=America/Argentina/Buenos_Aires后重启pm2实例
  • 检查运行Node应用的用户的家目录下.bashrc、.profile等配置文件是否手动设置了TZ=UTC,删除对应配置后重新登录用户再启动应用

3. 验证配置生效

可以在应用入口添加测试代码,确认Node进程的时区配置是否正确:

console.log('当前进程时间:', new Date().toString());
console.log('时区偏移量:', new Date().getTimezoneOffset() / 60, '小时');

如果打印时间与系统本地时间一致,说明Node时区配置正常,仅需修改morgan配置即可解决问题。


内容的提问来源于stack exchange,提问作者Awer Muller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:24:00