【问题标题】:Multiple log files with winston with max size and daily rotation带有最大大小和每日轮换的winston 的多个日志文件
【发布时间】:2018-03-25 17:28:44
【问题描述】:

现在我使用 winston 来记录最大大小和每日轮换

我希望每个 API 端点有一个文件,从而定义多个日志文件

我怎样才能做到这一点?

这是我的 winston 助手类

import * as winston from 'winston';
import { config } from '../config';

export const logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({
      timestamp: () => (new Date().toLocaleTimeString()),
      colorize: true,
      level: config.application.mode === 'test' ? 'emerg' : 'info',
    }),
    new (require('winston-daily-rotate-file'))({
      filename: `${process.cwd()}${config.application.log.dir}/.log`,
      timestamp: () => (new Date().toLocaleTimeString()),
      datePattern: 'yyyy-MM-dd',
      prepend: true,
      level: config.application.mode === 'test' ? 'emerg' : 'info',
      maxsize: 100000000, // en octet
      colorize: false,
      json: false,
    }),
  ],
});

export const generateLog = function (data: object): string {
  let log = 'id="easy_tms" ';
  for (const key in data) {
    const value = (data[key] !== undefined && data[key] !== null) ? data[key] : '';
    if (value instanceof Date) {
      log += key + '="' + value.toISOString() + '" ';
    } else if (Array.isArray(value) === true) {
      log += key + '="' + value.join(',');
    } else {
      log += key + '="' + value.toString().replace(/"/g, '') + '" ';
    }
  }
  return log;
};

编辑:

我测试了这个可行的解决方案,但我不确定我是否做得对:

export function apiLogger(level: string, log: {
  method?: any,
  url?: any,
  requestStep?: string,
  responseStatus?: any,
  responseMessage?: any,
  response?: any,
}, endPoint: string): void {

  const transportMain = new winston.transports.File({
    timestamp: () => (new Date().toLocaleTimeString()),
    datePattern: 'yyyy-MM-dd',
    level: config.application.mode === 'test' ? 'emerg' : 'info',
    filename: path.join(process.cwd(), config.application.log.dir, endPoint + '.log'),
    maxsize: 1024 * 1024 * 100, // 100MB
    colorize: false,
    prepend: true,
    json: false,
  });

  const loggerInstance = new (winston.Logger)({
    transports: [
      transportMain,
    ],
  });

  switch (level) {
    case 'info':
      loggerInstance.info(generateLog(log));
      break;
    case 'error':
      loggerInstance.error(generateLog(log));
      break;
    case 'warn':
      loggerInstance.warn(generateLog(log));
      break;
    case 'verbose':
      loggerInstance.verbose(generateLog(log));
      break;
    case 'debug':
      loggerInstance.debug(generateLog(log));
      break;
    case 'silly':
      loggerInstance.silly(generateLog(log));
      break;
    default:
      loggerInstance.info(generateLog(log));
      break;
  }
}

【问题讨论】:

  • 您可以为每个 API 创建一个记录器
  • 更改每个api的文件名是否足够,例如在请求中添加参数?我不熟悉温斯顿

标签: javascript node.js typescript logging winston


【解决方案1】:

您可以为每个 API 创建一个记录器,每个记录器都有自己的文件:

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

const logger1 = new Logger({
  transports: [new transports.File({ filename: 'log1.log' })]
});

const logger2 = new Logger({
  transports: [new transports.File({ filename: 'log2.log' })]
});

logger1.info('log1');
logger2.info('log2');

编辑

您每次都在创建记录器,但您可以执行以下操作:

const apis = ['api1', 'api2'];
const loggers = apis.reduce((memo, api) => {
  memo[api] = new Logger({
    transports: [new transports.File({ filename: `${api}.log` })]
  });
  return memo;
}, {});

const apiLogger = (level, message, api) => {
  loggers[api].log(level, message);
};

apiLogger('info', 'msg1', 'api1');
apiLogger('info', 'msg2', 'api2');

【讨论】:

  • 非常好的解决方案,我根据自己的需要进行了调整,但它很可靠,谢谢
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2012-04-20
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多