【问题标题】:How to write dynamic log file names with log4js-node?如何使用 log4js-node 编写动态日志文件名?
【发布时间】:2021-05-26 10:40:43
【问题描述】:

我正在尝试根据代码运行时的时间戳编写日志文件。 设置名称后日志写得很好,例如“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'}
            }
        }
    }
};

当我运行它时,该文件在文件夹中正确创建,但是当代码运行时它没有被日志条目填充。 我尝试单独创建名称并将其放入代码中:

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'}
            }
        }
    }
};

但这也没有解决问题。

【问题讨论】:

    标签: node.js dynamic log4js-node


    【解决方案1】:

    这是可以做到的。

    让你的 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);
    

    【讨论】:

      【解决方案2】:

      显然,无法传递动态文件名。您需要使用 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');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 2020-01-22
        • 2018-01-10
        • 2018-03-07
        • 2017-11-22
        相关资源
        最近更新 更多