Node.js 라이브러리 Winston을 사용하여 로그에 타임 스탬프를 추가하려면 어떻게해야합니까?


93

로그에 타임 스탬프를 추가하고 싶습니다. 이를 달성하는 가장 좋은 방법은 무엇입니까?


클라이언트 시스템에서 할 수 없기 때문에 너무 광범위합니다.
여호수아

답변:


112

나도 같은 문제를 다루고 있었다. 두 가지 방법이 있습니다.

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 :이 전송이 기록해야하는 메시지 수준 (기본값 'debug').
  • silent : 출력을 억제할지 여부를 나타내는 부울 플래그 (기본값 false).
  • colorize : 출력을 색상 화해야하는지 여부를 나타내는 부울 플래그 (기본값 false).
  • timestamp : 출력 앞에 타임 스탬프를 추가해야하는지 여부를 나타내는 부울 플래그 (기본값 false). 함수가 지정되면 타임 스탬프 대신 반환 값이 사용됩니다.

1
동시에 놀랍고 단순합니다. 감사합니다!
kolrie

7
이것은 훌륭합니다. 나는 보통이 파일을 전용 파일로 감싸서 어떤 파일에서든 쉽게 구성된 로거를 가져올 수 있습니다. 즉, 위 코드 (옵션 2)를 새 파일 logger.js에 넣은 다음 module.exports = logger; 그런 다음 모든 파일에서 var logger = require ( './ logger.js')를 수행 한 다음 모든 파일에서 logger.info ( 'hello')를 수행하고 Winston과 동일한 구성을 얻을 수 있습니다.
JHH

오류 : (중간 값) 함수 아니다
Urasquirrel

80

위의 답변은 저에게 효과적이지 않았습니다. 최신 버전의 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'})

14

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

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;

이것도 작동합니까 logger.info('Message', someObject)? 결합을 사용하여 사용자 지정 형식을 설정했는데 someObject로그 메시지에 포함 되지 않는 것 같습니다 .
SomethingOn

1
someObject다음 printf 문을 사용하여 포함 시킬 수있었습니다 ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}. 여기에는 삭제할 수있는 수준, 타임 스탬프 및 메시지가 포함됩니다.
SomethingOn

9

내장 된 유틸리티영원히 사용 하여 nodejs 서버에 대한 타임 탭으로 로깅을 달성 할 수 있습니다. 서버를 시작할 때 매개 변수의 일부로 로그 출력을 추가하십시오.

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

그런 다음 server.js에 util을 작성할 수 있습니다.

server.js

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

출력은 out.log 파일에 다음과 같이 표시됩니다.

out.log

15 Mar 15:09:28 - something with timestamp

1
불행히도 util.error()출력 타임 스탬프를 건너 뜁니다.
Saran

4

나는 윈스턴을 모르지만 이것은 제안입니다. 로깅에 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에서 로깅을 위해 다른 프로필을 유지할 수 있습니다. 개발 및 생산 프로필이 있습니다. 또한 롤링 파일 어 펜더, 콘솔 어 펜더 등과 같은 로거 유형이 있습니다. 애드온으로서 로그 파일은 로그 수준 [Trace, Info, Debug, Error, Fatal]에 따라 색상이 지정됩니다.

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


참고 : 최신 버전의 log4js-node (0.5+)는 console.log를 자동으로 재정의하지 않습니다.
Jeff Hiltz

@jeffhiltz 그래 당신 말이 맞아요 :) 지금은 구성 가능한 매개 변수입니다
타밀어

2

때로는 기본 타임 스탬프 형식이 편리하지 않을 수 있습니다. 구현으로 재정의 할 수 있습니다.

대신에

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 을 참조 하십시오.



0

또 다른 해결책은 logger.info (), logger.error () 등과 같은 일부 함수를 내보내는 파일로 로거를 래핑 한 다음 모든 메시지 로그에 보낼 추가 키를 전달하는 것입니다.

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
}

whatever-file.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"}

0

Biswadev의 답변을 받아 문자열 화 된 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.