【发布时间】:2015-11-05 15:41:11
【问题描述】:
我正在使用 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
我还注意到,如果我使用 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 强制执行颜色输出。我为
File和Console传输都启用了colorize设置为true 的所有级别的日志记录。我在上面添加了我的配置。两个输出的示例都使用该配置,只有一个是通过 supervisord 管理进程时,另一个是当我通过 shell 使用node命令运行我的 app.js 文件时。
标签: linux node.js logging supervisord