Morgan(node.js):使用自定义格式时着色状态代码(如“dev”中)

Posted

技术标签:

【中文标题】Morgan(node.js):使用自定义格式时着色状态代码(如“dev”中)【英文标题】:Morgan (node.js): Coloring status code (as in 'dev') while using custom format 【发布时间】:2016-07-16 23:48:04 【问题描述】:

我正在使用 morgan 登录 node.js。

我喜欢预定义格式模式“dev”中提供的状态码着色, 但我使用的是自定义格式。

如何获得与“开发”模式相同的颜色?

根据摩根文档,开发格式如下:

 :method :url :status :response-time ms - :res[content-length]

当我使用它时它不会着色:

// does not color
app.use(morgan(':method :url :status :response-time ms - :res[content-length]')); 

但是当我使用预定义的“开发”时,它会变色!

app.use(morgan('dev'));

【问题讨论】:

【参考方案1】:

您可以非常轻松地使用 chalkJS 进行着色。

import morgan from 'morgan';
import chalk from 'chalk'; // or you can use the require('chalk') syntax too

export const morganMiddleware = morgan(function (tokens, req, res) 
    return [
        '\n\n\n',
        chalk.hex('#ff4757').bold('?  Morgan --> '),
        chalk.hex('#34ace0').bold(tokens.method(req, res)),
        chalk.hex('#ffb142').bold(tokens.status(req, res)),
        chalk.hex('#ff5252').bold(tokens.url(req, res)),
        chalk.hex('#2ed573').bold(tokens['response-time'](req, res) + ' ms'),
        chalk.hex('#f78fb3').bold('@ ' + tokens.date(req, res)),
        chalk.yellow(tokens['remote-addr'](req, res)),
        chalk.hex('#fffa65').bold('from ' + tokens.referrer(req, res)),
        chalk.hex('#1e90ff')(tokens['user-agent'](req, res)),
        '\n\n\n',
    ].join(' ');
);

app.use(morganMiddleware);

【讨论】:

【参考方案2】:

是的,默认情况下它不能将您的输出着色到控制台。

您可以参考这篇文章,该文章借助“粉笔”模块为控制台的输出着色。

否则我所做的是我使用了默认的“开发”配置,并为我的自定义令牌添加了一个额外的配置,使默认的开发输出保持原样。 像这样的:

app.use(morgan('dev'));
app.use(morgan('auth_id - :userid user_email - :email'));

这会做你想做的事,但是 morgan 的第二个输出将在换行符中。

【讨论】:

摩根github上的相关讨论:github.com/expressjs/morgan/issues/53(附有粉笔使用示例)【参考方案3】:

我在所有工作中都使用这个 chalk morgan 配置,并将其作为中间件包含在 express 应用中。

const morgan = require ('morgan');
const chalk = require ('chalk');

const  morganChalk = morgan(function (tokens, req, res) 
    return [
        chalk.green.bold(tokens.method(req, res)),
        chalk.red.bold(tokens.status(req, res)),
        chalk.white(tokens.url(req, res)),
        chalk.yellow(tokens['response-time'](req, res) + ' ms'),
    ].join(' ');
);

module.exports = 
    morganChalk

【讨论】:

【参考方案4】:

@Adam Reis 指出了一个非常好的方向。我想出了这个解决方案:

morgan.token('splitter', (req) => 
    return "\x1b[36m--------------------------------------------\x1b[0m\n";
);
morgan.token('statusColor', (req, res, args) => 
    // get the status code if response written
    var status = (typeof res.headersSent !== 'boolean' ? Boolean(res.header) : res.headersSent)
        ? res.statusCode
        : undefined

    // get status color
    var color = status >= 500 ? 31 // red
        : status >= 400 ? 33 // yellow
            : status >= 300 ? 36 // cyan
                : status >= 200 ? 32 // green
                    : 0; // no color

    return '\x1b[' + color + 'm' + status + '\x1b[0m';
);
server.use(morgan(`:splitter\x1b[33m:method\x1b[0m \x1b[36m:url\x1b[0m :statusColor :response-time ms - length|:res[content-length]`));

结果如下:

【讨论】:

【参考方案5】:

只需使用与摩根源代码中定义的dev 格式相同的格式化函数:https://github.com/expressjs/morgan/blob/master/index.js#L183-L206

【讨论】:

【参考方案6】:

现在 chalk 还支持模板字符串功能,因此您可以像这样创建彩色 dev morgan 字符串:

app.use(morgan(chalk`:method :url green :status :response-time ms - :res[content-length]`));

【讨论】:

【参考方案7】:

只需将“dev”放入其中:

morgan("dev")

或者在你的配置之前,像这样:

app.use(
  morgan(
    "dev",
    ":method :url :status :res[content-length] - :response-time ms - [:date[clf]]"
  )
);

【讨论】:

以上是关于Morgan(node.js):使用自定义格式时着色状态代码(如“dev”中)的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 模块之 morgan中间件记录日志

收到请求时使用 morgan 记录 POST 正文大小

尝试使用 Nodejs 库 morgan-body

如何使用 TypeScript 导入自定义 node.js 插件模块

将 Azure 自定义视觉模型与 Node.js 结合使用

使用 mysql 和 node.js 的自定义前缀