Linux 如何阻止supervisord从Node.js服务器的日志输出中剥离颜色?

Linux 如何阻止supervisord从Node.js服务器的日志输出中剥离颜色?,linux,node.js,logging,supervisord,Linux,Node.js,Logging,Supervisord,我正在使用supervisord管理我的Node.js服务器(确保它在崩溃时重新启动,并发送崩溃警报电子邮件)。但是,我发现,如果我通过supervisord运行我的app.js进程,那么到我的server.log和到控制台的输出都会褪色。我正在使用来处理我的日志记录。我有以下几个输出示例: 运行supervisord后的server.log内容: 2015-08-12T20:41:29.203Z - silly: Connected to redis 2015-08-12T20:41:29.2

我正在使用supervisord管理我的Node.js服务器(确保它在崩溃时重新启动,并发送崩溃警报电子邮件)。但是,我发现,如果我通过supervisord运行我的
app.js
进程,那么到我的
server.log
和到
控制台的输出都会褪色。我正在使用来处理我的日志记录。我有以下几个输出示例:

运行
supervisord
后的
server.log
内容:

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(
$node app.js
)后,服务器.log的内容:

我还注意到,如果我使用
supervisorctl
中的
tail
来监视节点服务器,颜色也会从那里去除。从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;

我在网上找到了这个问题的答案

引用它:

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

比如说

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

如果您还没有安装,在Ubuntu和其他Debian ish Linux发行版上,您可以通过执行以下操作来安装
unbuffer

sudo-apt-get-install-expect-dev


你的应用程序可能检测到它们未连接到终端,因此正在禁用颜色输出。你可以使用Winston强制使用颜色。也许你应该发布你的Winston配置代码。我正在用Winston强制颜色输出。对于
文件
控制台
传输,我启用了所有级别的日志记录,并将
着色
设置为true。我在上面添加了我的配置。这两个输出的示例都与该配置有关,一个是通过supervisord管理流程,另一个是通过shell使用
节点
命令运行app.js文件。
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;