Ведение журнала Уинстон / Морган, избегая дублирования записей - PullRequest
2 голосов
/ 05 июля 2019

Я только что реализовал Winston Logging, и он работает, как и ожидалось, но я столкнулся с несколькими проблемами, на которые я не могу найти ответ.

Способ работы Winston, насколько я могу судить, установленный уровень журнала и все остальноениже, когда используется приоритет, как при ошибке, он также будет включать в себя информационные журналы и т. д. Есть ли способ создать определенный уровень журнала, позволяющий называть его HTTP или дБ, где я регистрирую только события http или db, и они не заканчиваютсяв объединенном файле или консоли?

Ответы [ 2 ]

4 голосов
/ 07 июля 2019

Лучшим решением является использование единого регистратора с функцией форматирования в качестве «фильтра уровня», чтобы указать, какие журналы транспорта, какой конкретный уровень.Вот решение (заметьте, levelFilter можно легко расширить, чтобы получить массив приемлемых уровней).

Ключевое понимание заключается в том, что если из цепочки форматера не возвращается объект info, ничего не регистрируется.

const { createLogger, format, transports } = require('winston');

const levelFilter = (level) =>
  format((info, opts) => {
     if (info.level != level) { return false; }
      return info;
  })();

const logger = createLogger({
  transports: [
    new transports.Console({
        format: format.combine(
          levelFilter("info"),
          format.json()
        )
    }),
    new transports.File({
        filename: "test.log",
        format: format.combine(
          levelFilter("error"),
          format.json()
        )
    }),
  ]
});

// ONLY is logged to test.log
logger.log({
  level: 'error',
  message: 'abcd'
});

// ONLY is logged to console
logger.log({
  level: 'info',
  message: '1234'
});
0 голосов
/ 05 июля 2019

Я могу запустить winston с параметром, в вашем случае имя файла.Я использую аналогичную настройку для регистрации отдельных задач cron (вместо параметра filename используется параметр type, который используется в качестве префикса в журнале, поэтому я могу выявлять проблемы в нескольких задачах cron в одном файле журнала).Я надеюсь, что вы знакомы с синтаксисом ES6.

utils / winston.js

const { createLogger, transports } = require('winston');

const infoLogger = filename => createLogger({
    transports: [
        new transports.File({
            filename: 'info-' + filename,
            level: 'info'
        }),
        new transports.Console(),
    ],
        exitOnError: false
    });

const errorLogger = filename => createLogger({
    transports: [
        new transports.File({
            filename: 'error-' + filename,
            level: 'error'
        }),
        new transports.Console(),
    ],
        exitOnError: false
    });

export default filename => ({
    errorLogger: errorLogger(filename).error,
    infoLogger: infoLogger(filename).info
});

Так что в своем коде вы можете импортировать пользовательские настройки winston из utils и инициализировать их с именем файла.Будьте осторожны, я в основном экспортирую только функцию ошибок из winston errorLogger(filename).error, вы можете изменить ее приемлемым для вас способом

main.js

import logger from './utils/winston';
const { errorLogger, infoLogger } = logger('http.log');
errorLogger('some http fail'); // destination file => error-http.log
infoLogger('some http info'); // destination file => info-http.log
...