首页 > 解决方案 > Loggly 的 Winston 传输无法始终如一地工作

问题描述

我为 Winston 设置了 3 个传输:控制台、文件和 Loggly(使用https://github.com/loggly/winston-loggly-bulk)。

虽然控制台和文件传输记录正确,但我的 Loggly 传输只记录我最初的“服务器在端口 3001 上侦听”日志,没有其他任何内容,我不明白为什么。

记录器-utils.ts:

import * as winston from 'winston';
import { Loggly } from 'winston-loggly-bulk';

export const createLogger = () => {
  return winston.createLogger({
    format: winston.format.combine(
      winston.format.errors({ stack: true }),
      winston.format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss ZZ',
      }),
      winston.format.json(),
    ),
    transports: [
      new winston.transports.Console({
        level: process.env.LOGGING_LEVEL,
      }),
      new winston.transports.File({ filename: `logs/my-app.log` }),
      new Loggly({
        token: '<token>',
        subdomain: '<subdomain>',
        tags: ['Winston-NodeJS'],
        json: true,
      }),
    ],
  });
};

记录器.ts:

import { createLogger } from './logger-utils';

const logger = createLogger();

export default logger;

服务器.ts:

import app from './modules/app/app';
import logger from './core/logger/logger';

app.listen(PORT, () => {
  logger.info(`Server listening on port ${3001}`);
});

app.middleware.ts:

import logger from '../../core/logger/logger';

export const initializeApp = async (ctx: AppContext) => {
  logger.info('initializeApp', { ctx });
  ....

所以,我启动服务器并运行一个流程,当我检查控制台和文件时,我看到它在 server.ts 和 app.middleware.ts 中记录了消息,但是当我检查我的 Loggly 仪表板时,我只看到日志来自 server.ts。

我觉得我遗漏了一些非常明显的东西,但我不明白为什么尽管将我的东西记录在 server.ts 中,但它不会将我的信息记录在 app.middleware.ts 中,而且当我考虑到两者时,它就更没有意义了控制台和文件传输正在正确记录所有内容。

有关如何解决此问题的任何想法,以便我的 Loggly 传输像我的其他传输一样工作?

标签: javascriptnode.jsloggingwinstonloggly

解决方案


ctx对象内部有循环引用,并且可能在 Loggly 端序列化失败。在没有对象的情况下进行日志记录ctx应该可以解决问题。


推荐阅读