완벽한 솔루션이 아닐지 몰라도 비슷한 상황이되었습니다. 앱의 다른 부분을 관리하는 활성 파일 일 수도 있고 아닐 수도있는 파일이 있습니다.
내 솔루션은 winston을 기준으로 내 "자체"로거를 만드는 것이 었습니다.
log.js :
각 소스 코드 파일이 하나의 differents 파일에 기록 로거, 그리고 "일반적인"파일을 필요로 이었기 때문에, 내가 직접 윈스턴을 요구하는 대신에 부르는 "발전기"를 만들어
'use strict';
const util = require('util'),
winston = require('winston'),
config = require('./config.json');
//If I don't want to log in files and only in console
let testMode = (config.log.mode === 'test');
//"Common" log file
const fileTransport = new (winston.transports.File)({
timestamp: true,
name: config.log.all.file,
filename: config.log.all.file,
level: config.log.all.level
}),
//"Common" error log file
errorTransport = new (winston.transports.File)({
timestamp: true,
name: config.log.error.file,
filename: config.log.error.file,
level: 'error'
});
//Logs are also sent in mongoDB, with the same schema as in the files
let mongoTransport = {},
mongoErrorTransport = {};
if(!testMode) {
//Add winston.transport.MongoDB
require('winston-mongodb');
mongoTransport = new (winston.transports.MongoDB)({
name: 'all',
host: config.log.db.host,
safe: config.log.db.safe,
collection: 'all',
level: config.log.all.level,
db: config.log.db.db
});
mongoErrorTransport = new (winston.transports.MongoDB)({
name: 'error',
host: config.log.db.host,
safe: config.log.db.safe,
collection: 'error',
level: 'error',
db: config.log.db.db
});
}
function getTransports(file) {
let transports = [];
//Log in the console
transports.push(new (winston.transports.Console)({
timestamp: true,
level: config.log.all.level,
formatter: (args) => {
let d = new Date();
return d.getFullYear() +
'/' + d.getMonth(), +
'/' + d.getDate(), +
' ' + d.getHours(), +
':' + d.getMinutes(), +
':' + d.getSeconds(), +
':' + d.getMilliseconds(), +
' - ' + file +
' - ' + args.level +
' -\t' + args.message +
'\t' + util.inspect(args.meta);
}
}));
if(testMode) {
return transports;
}
let name,
level,
filename;
transports.push(fileTransport);
transports.push(errorTransport);
transports.push(mongoTransport);
transports.push(mongoErrorTransport);
//Module specific logs
if(config.log[file] && config.log[file].file) {
name = config.log[file].file;
} else {
name = file;
}
if(config.log[file] && config.log[file].level) {
level = config.log[file].level;
} else if(config.log.default && config.log.default.level) {
level = config.log.default.level;
} else {
level = 'info';
}
if(config.log[file] && config.log[file].file) {
filename = config.log[file].file;
} else if(config.log.default && config.log.default.file) {
filename = config.log.default.path + file + '.log';
} else if(config.log.default && config.log.default.path) {
filename = config.log.default.file;
} else {
filename = './log/' + file + '.log';
}
//Module specific log file
transports.push(new (winston.transports.File)(
{
timestamp: true,
name: name,
level: level,
filename: filename
}
));
//Module specific Mongo collection for logs
transports.push(new (winston.transports.MongoDB)({
name: 'mongo' + file,
host: config.log.db.host,
safe: config.log.db.safe,
collection: file,
level: level,
db: config.log.db.db
}));
return transports;
}
//Generator
module.exports = (file) => {
let transports = getTransports(file);
return new (winston.Logger)({
rewriters: [
(level, msg, meta) => {
meta.app = file + '.js';
return meta;
}
],
transports: transports
});
};
같이 호출 할 : 그것은 완벽한 해결책에서 멀리 있지만
'use strict';
const Logger = require('./log.js'),
logger = Logger('myModule');
logger.debug('Hi');
logger.error('Oops');
하고 특정 문제에 적용되지 않을 수 있습니다, 비슷한 수동으로 모든 로거를 만드는 것보다 청소기 수 있습니다.
내가 아는 한, 네, 다른 로거가 필요합니다. 또는 해킹 된 해결책은 winston에서 자신 만의 로거를 만들고, 가능한 모든 로거를 선언하고, 다른 전송에 인쇄하는 편리한 방법을 만드는 것입니다. – DrakaSAN