在我的节点应用程序中,我使用winston模块来存储我的应用程序日志。我们可以用两种格式存储日志,一种是json,另一种是字符串。在winston中将日志保存为字符串时,我的格式低于日志格式。
2013-09-10T06:51:34.199Z - error: error message!!!
(timestamp) - (level) : (log message)
现在我想将以上日志格式更改为以下内容:
2013-09-10T06:51:34.199Z/error/error message!!!
(timestamp) / (level) / (log message)
如何实现这一目标?
我的代码:
var winston = require('winston');
winston.loggers.add('category1', {
file: {
filename: '/path/to/some/file',json:false
}
});
var category1 = winston.loggers.get('category1');
category1.log('error','error message!!!');
答案 0 :(得分:14)
我想知道同样的事情,并找到了一个好的解决方案(虽然不是理想的IMO,所以也许其他人可以权衡这个)。
您可以通过为传输对象提供格式化程序功能来完全自定义记录器输出。对于文件传输而言,这可能比控制台更好,因为如果你想要的话,你必须手动着色你的字体。
这是一个相对简单的格式化程序功能,您可以使用(并根据您的需要进行调整):
// Define options for Date#toLocaleTimeString call we will use.
var twoDigit = '2-digit';
var options = {
day: twoDigit,
month: twoDigit,
year: twoDigit,
hour: twoDigit,
minute: twoDigit,
second: twoDigit
};
function formatter(args) {
var dateTimeComponents = new Date().toLocaleTimeString('en-us', options).split(',');
var logMessage = dateTimeComponents[0] + dateTimeComponents[1] + ' - ' + args.level + ': ' + args.message;
return logMessage;
}
要在传输中使用此格式化程序,只需调整代码即可传递函数:
winston.loggers.add('category1', {
file: {
filename: '/path/to/some/file',
json: false,
formatter: formatter
}
});
值得一提的是,属性args.meta
将被设置为传递给日志方法调用的任何对象参数。因此,您必须提出一种策略来处理传入的对象(或者只是将整个对象打印为JSON)。例如:
var error = {
name: 'MongoError',
code: 11000,
err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error...'
}
logger.info('Some error ocurred: ', error);
会导致args.meta
设置为错误变量。
正如您所看到的,在以这种方式处理日志消息时需要处理相当多的事情。如果有更好的方法来做这些事情,我不会感到惊讶,但希望这可以帮助你(或其他人)。