【问题标题】:Loading Winston log configuration from file?从文件加载 Winston 日志配置?
【发布时间】:2023-03-16 00:05:01
【问题描述】:

目前我们使用的 Winston 配置是硬编码在一个 Javscript 模块中,尽管能够在运行时修改这个配置会很有用。例如,这将允许我们更改日志文件的路径、格式或日志级别,而无需修改代码。

我来自 Java 世界中诸如 log4j 之类的记录器的思想学派,您可以在 XML 文件或属性文件 (see here) 中指定您需要的内容,而不是通过编程方式。在 NodeJS 世界中,这将在 JSON 文件中。

我确实找到了“winston-config”包,但不幸的是它与 Winston 3 不兼容。

有没有人有办法可以做到这一点?我在文档中没有看到任何值得注意的内容,我宁愿避免为此制定我们自己的逻辑。

【问题讨论】:

  • 如果需要也检查一下:npmjs.com/package/morgan 另外,您可以在进程中设置日志记录级别并在运行时设置,但是当您必须更改日志记录级别时,您必须重新启动应用程序.
  • 这个答案有日志级别的设置 - stackoverflow.com/a/22934566/957026 强烈推荐它放入我上面提到的过程中。
  • @LearningEveryday 这只是为我提供了一个替代记录器,实际上并没有提供从文件调整日志配置的解决方案。
  • 当您说文件时,像这样的 .json 文件可能会起作用:medium.com/@felipedutratine/… 另外,为什么不使用来自进程的值,例如 process.env.loggingLevel
  • 它不仅仅是日志级别。它试图避免以编程方式执行此操作。现在澄清了问题。

标签: node.js logging configuration winston


【解决方案1】:

我最终没有找到适合我的包,所以我把一些东西放在一起并选择分享它。这是基本的,但可以完成我需要的工作。

源代码。该配置是一个 JSON 结构,带有一个用于日志记录配置的条目。

const loggingConfig = config.logging;

if (!loggingConfig) {
    throw new Error('No logging configuration was found');
}

const formatter = printf(({ level, message, label, timestamp, stack }) => {
    if (!stack) {
        return `${timestamp} [${label}] ${level}: ${message}`;
    } else {
        return `${timestamp} [${label}] ${level}: ${message}\n  ${stack}`;
    }
});

const logLabel = 'main';

const formats = {
    colorized: combine(
        colorize(),
        errors({ stack: true }),
        label({ label: logLabel }),
        timestamp(),
        formatter
    ),
    'default': combine(
        errors({ stack: true }),
        label({ label: logLabel }),
        timestamp(),
        formatter
    )
};

const transports = Object.values(loggingConfig.outputs).map((transportConfig: any) => {
    const { type, formatName, ...other } = transportConfig;

    let selectedFormat = formats[formatName];
    if (!selectedFormat) {
        selectedFormat = formats['default'];
    }

    if (type === 'console') {
        return new winston.transports.Console(Object.assign(other, { format: selectedFormat }));
    } else if (type === 'file') {
        return new winston.transports.File(Object.assign(other, { format: selectedFormat }));
    } else {
        throw new Error(`Invalid transport configuation in ${JSON.stringify(transportConfig)}`);
    }
});

那么JSON结构如下:

{
    "logging": {
        "outputs": {
            "console": {
                "type": "console",
                "level": "debug",
                "formatName": "colorized"
            },
            "main": {
                "type": "file",
                "level": "debug",
                "filename": "logs/main.log",
                "formatName": "default"
            }
        }
    }
}

这种方法允许我在开发、持续集成机器和生产中拥有不同的日志配置。

这适用于 Winston 3。

【讨论】:

    【解决方案2】:

    为此,我使用config 包取得了巨大成功。它可以很好地扩展,并且使从开发人员到测试和操作的交接更加顺畅。

    你可以这样使用它:

    const config = require( 'config' )
    require( 'properties' )  // lets you use property file format as well as JSON.
    const logLevel = config.get( 'log.logLevel' ) || 'info'
    // then use logLevel to configure winston
    

    这对于您从开发到暂存再到生产的项目来说非常酷,因为您可以为每个环境进行单独的配置。您的配置文件位于config 目录中。

    在该目录中,您可以拥有default.properties,其中可能包含这些内容。

    [log]
    logLevel = warn
    

    而且,您可以拥有另一个名为 development.properties 的文件

    [log]
    logLevel = info
    

    而且,如果你愿意,你可以有一个local.properties 文件,你应该在你的.gitignore 文件中提到这个

    [log]
    logLevel = debug
    

    这使您可以在开发时为每个部署环境选择配置值。

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 2012-04-20
      • 2019-05-20
      • 2021-04-26
      • 2018-03-21
      • 2016-04-18
      • 2015-02-14
      • 2016-09-08
      • 1970-01-01
      相关资源
      最近更新 更多