我正在使用supervisord来管理我的Node.js服务器(确保它在发生崩溃时重新启动并发送崩溃警报电子邮件)。但是,我发现如果我通过supervisord运行app.js
进程,则server.log
和console
的输出都会被剥离颜色。我正在使用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
我还注意到,如果我使用tail
中的supervisorctl
来监控我的节点服务器,那么颜色也会从那里剥离。从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;
答案 0 :(得分:3)
我在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