Node.js Winston日志
在我的节点应用程序中,我使用“Winston”日志将错误打印到单独的文件中 我跟着 当我试图从其他文件访问记录器时 我的代码:Node.js Winston日志,node.js,winston,Node.js,Winston,在我的节点应用程序中,我使用“Winston”日志将错误打印到单独的文件中 我跟着 当我试图从其他文件访问记录器时 我的代码: var winston = require('winston'); var fs = require('fs'); fs.mkdir('./logs', function(err) { if (err) throw err; }); // Define levels to be like log4j in java var customLevels = {
var winston = require('winston');
var fs = require('fs');
fs.mkdir('./logs', function(err) {
if (err) throw err;
});
// Define levels to be like log4j in java
var customLevels = {
levels: {
debug: 0,
info: 1,
warn: 2,
error: 3
},
colors: {
debug: 'blue',
info: 'green',
warn: 'yellow',
error: 'red'
}
};
// create the main logger
var logger = new(winston.Logger)({
level: 'debug',
levels: customLevels.levels,
transports: [
// setup console logging
new(winston.transports.Console)({
level: 'info', // Only write logs of info level or higher
levels: customLevels.levels,
colorize: true
}),
// setup logging to file
new(winston.transports.File)({
filename: './logs/project-debug.log',
maxsize: 1024 * 1024 * 10, // 10MB
level: 'debug',
levels: customLevels.levels
})
]
});
// create the data logger - I only log specific app output data here
var datalogger = new (winston.Logger) ({
level: 'info',
transports: [
new (winston.transports.File) ({
filename: './logs/project-data.log',
maxsize: 1024 * 1024 * 10 // 10MB
})
]
});
// make winston aware of your awesome colour choices
winston.addColors(customLevels.colors);
var Logging = function() {
var loggers = {};
// always return the singleton instance, if it has been initialised once already.
if (Logging.prototype._singletonInstance) {
return Logging.prototype._singletonInstance;
}
this.getLogger = function(name) {
return loggers[name];
}
Logging.prototype.get = this.getLogger;
loggers['project-debug.log'] = logger;
loggers['project-data.log'] = datalogger;
Logging.prototype._singletonInstance = this;
};
new Logging(); // I decided to force instantiation of the singleton logger here
logger.info('Logging set up OK!');
module.exports = Logging;
错误正在抛出:
Logging() is undefined.
本教程似乎有很多错误。我打电话让它工作
var logger = logging.Logging().get('project-debug.log');
注意参数中的
.log
。参数必须与记录器
数组中定义的一个名称匹配。我花了几个小时来解决这个问题,下面是我的解决方案:不要创建新的记录器
,只需更改默认名称即可
创建一个模块lib/logger.js
:
var logger = require('winston');
logger.setLevels({debug:0,info: 1,silly:2,warn: 3,error:4,});
logger.addColors({debug: 'green',info: 'cyan',silly: 'magenta',warn: 'yellow',error: 'red'});
logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { level: 'debug', colorize:true });
module.exports = logger;
var logger = require('./lib/log.js');
在app.js中使用:
var logger = require('winston');
logger.setLevels({debug:0,info: 1,silly:2,warn: 3,error:4,});
logger.addColors({debug: 'green',info: 'cyan',silly: 'magenta',warn: 'yellow',error: 'red'});
logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { level: 'debug', colorize:true });
module.exports = logger;
var logger = require('./lib/log.js');
从所有其他模块中使用:
var logger = require('winston');
我使用了winston调试日志记录,但它没有那么有效。我面临着类似的问题,有时它也会崩溃。我最近切换到了mopublish团队使用的一个新模块。通过morgan支持http日志记录也很棒。NPM模块elogger-我创建并解释的文件:
var winston = require('winston'),
winstonRedis = require('winston-redis').Redis;
// TR: console'da sadece hepsi tutuluyor olacak çünkü info log seviyesinden sonra diğer tüm log seviyeleri sıralanmış
// EN: all log level will be shown in Console, because 'info' is on the top of list with 0 value.
var transportConsole = new winston.transports.Console({ json: false, timestamp: true, prettyPrint:true, colorize: true, level:'info' }),
// TR: File'da sadece i ve db tutuluyor olacak çünkü i den sonra db log seviyesi sıralanmış
// EN: 'i' and 'db' log levels will be shown in File, because db is after i and for File transport level is 'i'
transportFileDebug = new winston.transports.File({ filename: __dirname + '/debug.log', json: true }),
transportFileException = new winston.transports.File({ filename: __dirname + '/exceptions.log', json: false }),
// TR: rediste sadece db tutuluyor olacak çünkü db den sonra bir log seviyesi yok
// EN: only 'db' will be stored in rediste because 'db' is the last one
transportRedis = new (winstonRedis)({host: '127.0.0.1', port: 6379, level:'db'});
var logger = new (winston.Logger)({
levels: {
info: 0,
warn: 1,
error: 2,
verbose: 3,
i: 4,
db: 5
},
transports: [
transportConsole,
transportFileDebug,
transportRedis
],
exceptionHandlers: [
transportConsole,
transportFileException
],
exitOnError: false
});
winston.addColors({
info: 'green',
warn: 'cyan',
error: 'red',
verbose: 'blue',
i: 'gray',
db: 'magenta'
});
logger.i('iiiii foobar level-ed message');
logger.db('dbbbbb foobar level-ed message');
logger.info('infoo foobar level-ed message');
logger.warn('warnnnn foobar level-ed message');
logger.error('errroor foobar level-ed message');
module.exports = logger;
您的logger
var未定义,这意味着.get('project-debug')
正在返回未定义或根本不返回。检查此方法是否符合您的预期。谢谢@Ivan Vergiliev..我只是按照我提到的教程进行操作..我对node.js和winston world是新手..因此我正在尝试使用我得到的代码..re:signleton和“new Logging;”,您也可以在构造函数闭包中使用一个单例实例,并在调用构造函数时检查该实例。谢谢@Zlatko..现在我的问题是我无法将错误(catch)传递给记录器…您有什么想法吗?您也可以发布代码示例吗?您可以将logging.js
文件发布到要点或类似的内容中吗?我还必须在那里做一些更改代码>带有exports.Logging=日志记录代码>-如教程中所示。现在日志文件显示{“级别”:“错误”、“消息”:“时间戳”:“2014-01-02T13:08:23.880Z”},但错误消息不会出现为什么?现在我的问题是我无法将错误(捕获)传递给日志记录器…你有什么想法吗我知道这很古老,我用过你的解决方案。但我还有一个问题。如何访问快速路由处理程序路由(“/route”,(req,res)=>{//need access to logger})中的记录器;?