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

时间:2016-03-29 12:16:02

标签: node.js logging

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

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

如何获得与'dev'模式相同的着色?

根据摩根文档,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]')); 

但是当我使用预定义的'dev'时它会变色!

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

6 个答案:

答案 0 :(得分:4)

是的,默认情况下它无法将输出色彩调色到控制台。

你可以参考这篇文章,它借助'chalk'模块的帮助,将输出颜色调色到控制台。

或者我做的是我使用了默认的'dev'配置,我为自定义令牌添加了一个额外的配置,它保留了默认的dev输出。 像这样:

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

这将做你想做的事情但是,摩根的第二个输出将是换行符。

答案 1 :(得分:3)

您可以非常轻松地使用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 :(得分:1)

我将这种粉笔摩根配置用于我的所有工作,并将其作为中间件包含在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
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

@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]`));

这是结果:

enter image description here

答案 5 :(得分:0)

现在粉笔还支持模板字符串功能,因此您可以创建彩色的 dev 摩根字符串,如下所示:

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