如何使用 log4js-node 编写动态日志文件名?
How to write dynamic log file names with log4js-node?
我正在尝试根据代码的时间戳编写一个日志文件,时间为 运行s。
设置名字后日志写的很好,比如"Test.log":
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/Test.log`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
在“logs”文件夹中正确创建了一个名为 的日志文件,其中填充了来自代码的日志。
但是,当我尝试使名称动态化时,事情变得更加复杂:
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/${new Date().toISOString().toString().replace(":","-")}`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
当我 运行 这样做时,文件在文件夹中正确创建,但是当代码 运行s 时它没有填充日志条目。
我尝试单独创建名称并将其放入代码中:
let name = new Date().toISOString().toString().replace(":","-");
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/${name}`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
但这也没有解决问题
显然,无法传递动态文件名。您需要在 multiFile 中使用占位符 属性,然后传递 属性 名称(来自 documentation):
log4js.configure({
appenders: {
everything: {
type: 'multiFile', base: 'logs/', property: 'userID', extension: '.log',
maxLogSize: 10485760, backups: 3, compress: true
}
},
categories: {
default: { appenders: [ 'everything' ], level: 'debug'}
}
});
const userLogger = log4js.getLogger('user');
userLogger.addContext('userID', user.getID());
userLogger.info('this user just logged in');
这是可以做到的。
让你的 log4js 配置文件保持原样:
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/Test.log`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
module.exports = appSettings;
您可以在加载配置时覆盖文件名,如下所示:
const { traceLogConfig } = require('./log4js-config').log4js;
traceLogConfig.appenders.fileAppender.filename = 'your file name';
log4js.configure(traceLogConfig);
我正在尝试根据代码的时间戳编写一个日志文件,时间为 运行s。 设置名字后日志写的很好,比如"Test.log":
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/Test.log`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
在“logs”文件夹中正确创建了一个名为 的日志文件,其中填充了来自代码的日志。 但是,当我尝试使名称动态化时,事情变得更加复杂:
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/${new Date().toISOString().toString().replace(":","-")}`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
当我 运行 这样做时,文件在文件夹中正确创建,但是当代码 运行s 时它没有填充日志条目。 我尝试单独创建名称并将其放入代码中:
let name = new Date().toISOString().toString().replace(":","-");
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/${name}`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
但这也没有解决问题
显然,无法传递动态文件名。您需要在 multiFile 中使用占位符 属性,然后传递 属性 名称(来自 documentation):
log4js.configure({
appenders: {
everything: {
type: 'multiFile', base: 'logs/', property: 'userID', extension: '.log',
maxLogSize: 10485760, backups: 3, compress: true
}
},
categories: {
default: { appenders: [ 'everything' ], level: 'debug'}
}
});
const userLogger = log4js.getLogger('user');
userLogger.addContext('userID', user.getID());
userLogger.info('this user just logged in');
这是可以做到的。
让你的 log4js 配置文件保持原样:
const appSettings = {
log4js: {
traceLogConfig: {
appenders: {
fileAppender: { type: 'file', filename: `./logs/Test.log`},
consoleAppender: { type: 'console' }
},
categories: {
default: { appenders: ['fileAppender', 'consoleAppender'], level: 'trace'}
}
}
}
};
module.exports = appSettings;
您可以在加载配置时覆盖文件名,如下所示:
const { traceLogConfig } = require('./log4js-config').log4js;
traceLogConfig.appenders.fileAppender.filename = 'your file name';
log4js.configure(traceLogConfig);