首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Winston / Morgan日志记录避免重复条目

Winston / Morgan日志记录避免重复条目
EN

Stack Overflow用户
提问于 2019-07-06 01:53:36
回答 2查看 1.4K关注 0票数 3

我刚刚实现了Winston日志记录,它的工作情况与预期一样,但我遇到了一些我无法找到答案的问题。

据我所知,winston的工作方式是设置日志级别和任何低于优先级的设置,比如on error它也会包含信息日志等。有没有办法创建一个特定的日志级别让我们称之为HTTP或db,其中我只记录http或db事件,而它们不会出现在组合文件或控制台中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-07 07:43:28

更好的解决方案是使用具有格式函数的单个记录器作为“级别过滤器”,以指定哪个传输日志是哪个特定级别的。以下是解决方案(请注意,levelFilter可以很容易地扩展为采用一组可接受的级别)。

关键的见解是,如果没有从格式化器链返回任何info对象,则不会记录任何内容。

代码语言:javascript
复制
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'
});
票数 5
EN

Stack Overflow用户

发布于 2019-07-06 03:57:27

我可以用一个参数初始化一个winston,在你的例子中是filename。我使用类似的设置来记录单独的cron任务(我使用type参数代替filename,它在日志中用作前缀,因此我可以在一个日志文件中识别多个cron任务中的问题)。我希望您熟悉ES6语法。

utils/winston.js

代码语言:javascript
复制
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
});

因此,在您的代码中,您可以从utils导入自定义的winston安装程序,并使用文件名对其进行初始化。请注意,我基本上只从winston errorLogger(filename).error导出错误函数,你可以用你可以接受的方式修改它。

main.js

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56907439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档