Загрузка конфигурации журнала Winston из файла? - PullRequest
1 голос
/ 20 апреля 2020

В настоящее время используемая нами конфигурация Winston жестко запрограммирована в модуле Javscript, хотя было бы полезно иметь возможность изменять эту конфигурацию во время выполнения. Это позволит нам, например, изменить путь к файлу журнала, формату или уровню журнала без необходимости изменять код.

Я пришёл из школы мысли о логгере, таком как log4j, в мире Java, где вы можете указать, что вам нужно в файле XML или файле свойств ( см. Здесь ), а не программно. В мире NodeJS это было бы в файле JSON.

Я нашел пакет 'winston-config', но, к сожалению, он не совместим с Winston 3.

У кого-нибудь есть подход, который мог бы учесть это? Я не увидел ничего заметного в документации, и я бы предпочел не создавать для этого собственную логику c.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Я добился большого успеха, используя для этого пакет 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

Это очень круто для проектов, из которых вы переходите от разработки до подготовки к производству, потому что вы можете иметь отдельные конфигурации для каждой среды. Ваши конфигурационные файлы go в каталоге config.

В этом каталоге вы можете иметь default.properties с, возможно, этим содержимым.

[log]
logLevel = warn

И вы можете иметь другой файл с именем development.properties с этим

[log]
logLevel = info

И, если хотите, у вас может быть файл local.properties, который вы должны упомянуть в файле .gitignore, с этим

[log]
logLevel = debug

Это позволяет вам выбирать значения конфигурации для каждая среда развертывания по мере разработки.

0 голосов
/ 20 апреля 2020

В итоге я не нашел пакет, который мне подходит, поэтому я собрал что-то и решил поделиться им. Это базовый c, но делает работу, в которой я нуждался.

Исходный код. Конфигурация представляет собой структуру 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.

...