programing

Node.js - Winston 라이브러리를 사용하여 로그에 타임스탬프를 추가하는 방법은 무엇입니까?

powerit 2023. 7. 27. 22:26
반응형

Node.js - Winston 라이브러리를 사용하여 로그에 타임스탬프를 추가하는 방법은 무엇입니까?

로그에 타임스탬프를 추가하고 싶습니다.

이를 달성하는 가장 좋은 방법은 무엇입니까?

감사해요.

위의 답변은 저에게 효과가 없었습니다.Winston - 3.0.0-rc1의 최신 버전을 사용하여 로그에 타임스탬프를 추가하려는 경우, 이 작업은 매우 효과적이었습니다.

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

    const logger = createLogger({
        format: format.combine(
            format.timestamp(),
            format.json()
        ),
        transports: [
            new transports.Console(),
            new transports.File({filename: 'logs/error/error.log', level: 'error'}),
            new transports.File({filename: 'logs/activity/activity.log', level:'info'})
        ]
    });

저는 'format.combine()'을 사용했습니다.모든 전송에 타임스탬프가 필요했기 때문에 각 전송 내부가 아닌 createLogger 내에 포맷 옵션을 추가했습니다.콘솔 및 파일(activity.log)에 대한 내 출력은 다음과 같습니다.

{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}
{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}

다음을 사용하여 평소와 같이 'format.combine()' 형식으로 이 타임스탬프에 형식을 추가할 수 있습니다.

format.timestamp({format:'MM-YY-DD'})

저도 같은 문제를 다루고 있었습니다.제가 이 일을 할 수 있었던 방법은 두 가지가 있습니다.

Winston을 포함하면 일반적으로 콘솔 전송을 추가하는 것으로 기본 설정됩니다.이 기본 사례에서 타임스탬프가 작동하도록 하려면 다음 중 하나를 수행해야 했습니다.

  1. 콘솔 전송을 제거하고 타임스탬프 옵션을 사용하여 다시 추가합니다.
  2. 타임스탬프 옵션이 true로 설정된 자체 Logger 개체를 만듭니다.

첫 번째:

var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'timestamp':true});

두 번째, 그리고 더 깨끗한 옵션:

var winston = require('winston');
var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({'timestamp':true})
    ]
});

콘솔 전송의 다른 옵션 중 일부는 다음에서 확인할 수 있습니다.

  • level: 이 전송이 기록해야 하는 메시지의 수준(기본값은 '디버깅')입니다.
  • silent: 출력을 억제할지 여부를 나타내는 부울 플래그입니다(기본값은 false).
  • 색상 지정:출력을 색상화할지 여부를 나타내는 부울 플래그(기본값은 거짓)입니다.
  • timestamp: 출력에 타임스탬프를 추가해야 하는지 여부를 나타내는 부울 플래그입니다(기본값은 false).함수를 지정하면 반환 값이 타임스탬프 대신 사용됩니다.

우리도 이렇게 할 수 있습니다.

var winston = require('winston');
const { createLogger, format, transports } = require('winston');
var config = require('../configurations/envconfig.js');

var loggerLevel = process.env.LOGGERLEVEL ||  config.get('LOGGERLEVEL');

var logger = winston.createLogger({
  format: format.combine(
    format.timestamp({
      format: 'YYYY-MM-DD HH:mm:ss'
    }),
    format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`+(info.splat!==undefined?`${info.splat}`:" "))
  ),
  transports: [
    new (winston.transports.Console)({ level: loggerLevel }),
  ]
});
module.exports = logger;

기본 제공 util forever를 사용하여 nodejs 서버에 대한 타임스탭으로 로깅을 수행할 수 있습니다.서버를 시작할 때 매개 변수의 일부로 로그 출력을 추가합니다.

forever start -ao log/out.log server.js

그런 다음 서버에 util을 쓸 수 있습니다.js

server.js

var util = require('util');
util.log("something with timestamp");

out.log 파일의 출력은 다음과 같습니다.

로그아웃

15 Mar 15:09:28 - something with timestamp

비스와데프의 답변을 받아 문자열화된 JSON 객체를 만들었습니다.이렇게 하면 나중에 로그를 처리해야 하는 경우 잘 구성된 형식이 됩니다.

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

const dotenv = require('dotenv');
dotenv.config();

var logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss',
        }),
        format.printf((info) =>
            JSON.stringify({
                t: info.timestamp,
                l: info.level,
                m: info.message,
                s: info.splat !== undefined ? `${info.splat}` : '',
            }) + ','
        )
    ),
});

if (process.env.NODE_ENV !== 'PRODUCTION') {
    logger.add(new transports.Console({ format: winston.format.cli() }));

    // Turn these on to create logs as if it were production
    // logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
    // logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
    // logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
} else {
    logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
    logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
    logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
}

module.exports = {
    logger,
};

용도:

app.listen(port, () => logger.info(`app is running on port ${port}`));

출력:

info.log 파일:

{"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},

콘솔:

info:    app is running on port 3001

윈스턴에 대해서는 모르지만, 이건 제안입니다.나는 log4js를 로그에 사용하고 내 로그는 기본적으로 다음과 같습니다.

[2012-04-23 16:36:02.965] [INFO] Development - Node Application is running on port 8090
[2012-04-23 16:36:02.966] [FATAL] Development - Connection Terminated to  '127.0.0.1' '6379'

개발은 내 노드 프로세스의 환경이며 [INFO|FATAL]은 로그 수준입니다.

log4js에서는 로깅을 위해 서로 다른 프로필을 유지 관리할 수 있습니다.개발 및 생산 프로필을 가지고 있습니다.또한 롤링 파일 appender, 콘솔 appender 등의 로거 유형이 있습니다.로그 파일은 로그 수준 [추적, 정보, 디버그, 오류, 치명적]에 따라 색상이 달라집니다.

log4js가 console.log를 재정의합니다. 이제 0.5+에서 구성 가능한 매개 변수입니다.

을 사용하여 레벨을 할 수 .require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')

자세한 내용은 https://github.com/starak/node-console-stamp 를 참조하십시오.

경우에 따라 기본 타임스탬프 형식이 사용자에게 적합하지 않을 수 있습니다.구현을 통해 이를 재정의할 수 있습니다.

대신에

var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
  new (winston.transports.Console)({'timestamp':true})
]
});

당신은 쓸 수 있습니다.

var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
  new (winston.transports.Console)({
     'timestamp': function() {
        return <write your custom formatted date here>;
     }
  })
]
});

자세한 내용은 https://github.com/winstonjs/winston#custom-log-format 를 참조하십시오.

또 다른 해결책은 로거를 logger.info syslogger.errors 등과 같은 일부 기능을 내보내는 파일로 래핑한 다음 모든 메시지 로그에 전송할 추가 키를 전달하는 것입니다.

loggerService.js

const logger = winston.createLogger({ ... })

function handleLog(message, level) {
  const logData = {
    timestamp: Date.now(),
    message,
  }

  return logger[level](logData)
}

function info(message) {
  handleLog(message, 'info')
}

function error(message) {
  handleLog(message, 'error')
}

function warn(message) {
  handleLog(message, 'warn')
}

module.exports = {
  info,
  error,
  warn
}

임의 파일.js

const logger = require('./services/loggerService')

logger.info('Hello World!')

your-log.log

{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}

언급URL : https://stackoverflow.com/questions/10271373/node-js-how-to-add-timestamp-to-logs-using-winston-library

반응형