在 Node.js Express 应用中,Morgan 是处理 HTTP 请求日志的常用中间件。默认情况下,Morgan 输出的时间戳往往基于服务器所在的 UTC 时间或系统默认时区,这在排查跨时区问题时容易造成困扰。本文将介绍如何通过自定义 Token 的方式,将日志中的时间调整为本地时间格式。
默认时间格式限制
Morgan 内置了三种日期格式:clf、web 和 iso。虽然它们能记录时间,但通常无法直接满足展示本地时间的需求,尤其是当服务器部署在不同区域时。
自定义 Token 实现本地化
要修改时区显示,核心思路是利用 morgan.token() 注册一个自定义 Token,并在格式化字符串中引用它。这样我们可以灵活控制时间的输出样式,而不必依赖内置的 date token。
代码示例
下面是一个完整的 Express 集成示例。我们定义了一个名为 localDate 的 Token,返回当前系统的本地时间字符串。
const express = require('express');
const morgan = require('morgan');
const app = express();
// 1. 自定义 Token:获取本地时间字符串
morgan.token('localDate', function getDate(req) {
return new Date().toLocaleString();
});
// 2. 定义包含自定义 Token 的格式
// 注意:这里使用 'localCombined' 避免覆盖 Morgan 内置的 'combined' 格式
morgan.format('localCombined', ':remote-addr - :remote-user [:localDate] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"');
// 3. 应用中间件
app.use(morgan('localCombined'));
app.get('/', (req, res) => {
res.send('ok');
});
app.listen(3000);

