【问题标题】:How do I stop supervisord from stripping colors from the log output of my Node.js server?如何阻止 supervisord 从我的 Node.js 服务器的日志输出中去除颜色?
【发布时间】:2015-11-05 15:41:11
【问题描述】:

我正在使用 supervisord 来管理我的 Node.js 服务器(确保它在发生崩溃时重新启动并发送崩溃警报电子邮件)。但是,我发现如果我通过 supervisord 运行我的app.js 进程,我的server.logconsole 的输出都会被去除颜色。我正在使用Winston library 来处理我的日志记录。我在下面有几个输出示例:

server.log运行后的内容supervisord

2015-08-12T20:41:29.203Z - silly: Connected to redis
2015-08-12T20:41:29.206Z - debug: Connected to redis
2015-08-12T20:41:29.206Z - verbose: Connected to redis
2015-08-12T20:41:29.207Z - info: Connected to redis
2015-08-12T20:41:29.207Z - warn: Connected to redis
2015-08-12T20:41:29.207Z - error: Connected to redis

通过shell运行后server.log的内容($ node app.js):

2015-08-12T20:41:37.732Z - ^[[35msilly^[[39m: Connected to redis
2015-08-12T20:41:37.737Z - ^[[34mdebug^[[39m: Connected to redis
2015-08-12T20:41:37.741Z - ^[[36mverbose^[[39m: Connected to redis
2015-08-12T20:41:37.742Z - ^[[32minfo^[[39m: Connected to redis
2015-08-12T20:41:37.742Z - ^[[33mwarn^[[39m: Connected to redis
2015-08-12T20:41:37.742Z - ^[[31merror^[[39m: Connected to redis

我还注意到,如果我使用 supervisorctl 中的 tail 来监视我的 Node 服务器,颜色也会从那里被剥离。从 shell 运行它时,我可以在控制台中看到颜色输出。

有谁知道为什么会发生这种情况以及如何解决这个问题?

编辑:因为有人要我的 Winston 配置:

var winston = require( 'winston' ),
    fs = require( 'fs' ),
    logDir = 'logs', // Or read from a configuration
    logger;

winston.setLevels( winston.config.npm.levels );
winston.addColors( winston.config.npm.colors );

if ( !fs.existsSync( logDir ) ) { 
    // Create the directory if it does not exist
    fs.mkdirSync( logDir );
}
logger = new( winston.Logger )( {
    transports: [
        new winston.transports.Console( {
            level: 'silly',
            colorize: true
        } ),
        new winston.transports.File( {
            level: 'silly',
            json: false,
            colorize: true,
            filename: logDir + '/server.log',
            maxsize: 1024 * 1024 * 25 // 25MB
        } ) 
    ],  
    exceptionHandlers: [
        new winston.transports.File( {
            filename: 'log/exceptions.log'
        } ) 
    ]   
} );

module.exports = logger;

【问题讨论】:

  • 您的应用程序可能检测到它们未连接到终端并因此禁用颜色输出。
  • 您可以使用 Winston 强制执行颜色。也许您应该发布您的 Winston 配置代码。
  • 我正在使用 Winston 强制执行颜色输出。我为FileConsole 传输都启用了colorize 设置为true 的所有级别的日志记录。我在上面添加了我的配置。两个输出的示例都使用该配置,只有一个是通过 supervisord 管理进程时,另一个是当我通过 shell 使用 node 命令运行我的 app.js 文件时。

标签: linux node.js logging supervisord


【解决方案1】:

我在Super User Stack Echange 上找到了这个问题的答案。

引用它:

只需在任何命令之前插入 unbuffer 即可使其认为是 写入交互式输出,即使它实际上是管道输入 另一个可执行文件。这将在 ls 的情况下保留颜色。

例如

unbuffer ls -l --color=auto | tee output.log

如果您还没有安装它,在 Ubuntu 和其他 Debian-ish Linux 发行版上,您可以安装 unbuffer

sudo apt-get install expect-dev

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 2012-12-05
    • 2015-10-11
    • 2015-10-04
    • 1970-01-01
    • 2018-01-07
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多