修改服务器时区后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实例
- systemd场景:检查应用的service配置文件(通常位于
- 检查运行Node应用的用户的家目录下
.bashrc、.profile等配置文件是否手动设置了TZ=UTC,删除对应配置后重新登录用户再启动应用
3. 验证配置生效
可以在应用入口添加测试代码,确认Node进程的时区配置是否正确:
console.log('当前进程时间:', new Date().toString()); console.log('时区偏移量:', new Date().getTimezoneOffset() / 60, '小时');
如果打印时间与系统本地时间一致,说明Node时区配置正常,仅需修改morgan配置即可解决问题。
内容的提问来源于stack exchange,提问作者Awer Muller
相关产品推荐
相关产品推荐

