모든 콘솔 메시지에 타임 스탬프 추가


93

전체적으로 많은 console.log () 및 console.error () 문 이 포함 된 완전하고 배포 된 Express 기반 프로젝트가 있습니다. 프로젝트는 forever를 사용하여 실행되며 stdout 및 stderr를 2 개의 개별 파일로 지정합니다.

모두 잘 작동하지만 이제는 오류가 발생한시기를 정확히 알기 위해 타임 스탬프가 누락되었습니다.

내 코드 전체에서 일종의 검색 / 바꾸기를 수행하거나 각 파일에서 콘솔을 재정의하는 일부 npm 모듈을 사용할 수 있지만 꼭 필요한 경우가 아니라면 모든 모델 / 라우트 파일을 건드리고 싶지 않습니다.

모든 호출에 타임 스탬프를 추가 할 수있는 방법 (예 : Express 미들웨어)이 있습니까? 아니면 수동으로 추가해야합니까?


답변:


118

그것은 당신이 밝혀 app.js 파일의 상단에있는 콘솔 기능을 무시하고 다른 모든 모듈을 적용합니다. 내 모듈 중 하나가 child_process. 라인을 해당 파일의 맨 위에 복사하면 모두 작동합니다.

기록을 위해 console-stamp ( npm install console-stamp --save) 모듈을 설치하고 app.js 및 childProcess.js 상단에 다음 줄을 추가했습니다.

// add timestamps in front of log messages
require('console-stamp')(console, '[HH:MM:ss.l]');

내 문제는 이제 :date연결 로거의 형식이 다른 콘솔 호출에서 사용하는 형식이 아닌 UTC 형식을 사용한다는 것입니다. 내 자신의 시간 형식을 등록하여 쉽게 수정되었습니다 (부작용으로 다른 dateformat모듈을 console stamp설치하는 대신 함께 제공 되는 모듈이 필요함 ).

// since logger only returns a UTC version of date, I'm defining my own date format - using an internal module from console-stamp
express.logger.format('mydate', function() {
    var df = require('console-stamp/node_modules/dateformat');
    return df(new Date(), 'HH:MM:ss.l');
});
app.use(express.logger('[:mydate] :method :url :status :res[content-length] - :remote-addr - :response-time ms'));

이제 내 로그 파일이 정리 된 것처럼 보입니다 (더 나은 방법은 구문 분석 가능).

[15:09:47.746] staging server listening on port 3000
[15:09:49.322] connected to database server xxxxx successfully
[15:09:52.743] GET /product 200 - - 127.0.0.1 - 214 ms
[15:09:52.929] GET /stylesheets/bootstrap-cerulean.min.css 304 - - 127.0.0.1 - 8 ms
[15:09:52.935] GET /javascripts/vendor/require.js 304 - - 127.0.0.1 - 3 ms
[15:09:53.085] GET /javascripts/product.js 304 - - 127.0.0.1 - 2 ms
...

2
문서를 찾을 수 없지만 ": mm"은 월을 의미하고 ": MM"은 실제로 사용하려는 형식 인 것으로 보입니다
Laurent Sigal

2
@ user603124에 따라 분 부분을 변경하십시오. 분 동안 문자열은 : MM ( github.com/starak/node-console-stamp )
sucotronic 2014 년

댓글 주셔서 감사합니다. 수정되었습니다!
테크 가이 여행

2
더 이상 HH : MM : ss.l을 괄호로 묶을 필요가없는 것 같습니다. 자동으로 수행됩니다
Jeff


34

모듈 : "log-timestamp"가 저에게 효과적입니다.

참조 https://www.npmjs.com/package/log-timestamp를

npm install log-timestamp

사용이 간편

console.log('Before log-timestamp');
require('log-timestamp');
console.log('After log-timestamp');

결과

Before log-timestamp
[2012-08-23T20:08:32.000Z] After log-timestamp

26

다음을 사용하여 파일을 만듭니다.

var log = console.log;

console.log = function(){
  log.apply(console, [Date.now()].concat(arguments));
};

아무것도 기록하기 전에 앱에 필요합니다. console.error필요한 경우 동일한 작업을 수행 하십시오.

이 솔루션 console.log("he%s", "y") // "hey"은 사용중인 경우 변수 삽입 ( )을 파괴 합니다. 필요한 경우 먼저 타임 스탬프를 기록하십시오.

log.call(console, Date.now());
log.apply(console, arguments);

2
동일한 앱 / 프로세스라면 아닙니다. 콘솔은 전역 개체이므로 이와 같은 기능 중 하나를 탈취하면 해당 전역 개체를 공유하는 모든 파일에 대해 계속 탈취됩니다.
Andreas Hultgren 2013 년

그래서 이것은 app.js 파일에 넣어야합니까?
테크 가이 여행

1
예. <15 개 문자 분 ...>
안드레아스 Hultgren

1
내가 대신 콘솔 스탬프를 사용하는 것이 좋습니다
제이 섹 Pietal

1
이것은 좋은 해결책이 아닙니다. 변수 삽입을 파괴하거나 (따라서 대체로 사용할 수 없음) 날짜 및 로그 출력을 다른 행에 인쇄합니다.
George Y.

16

다른 외부 종속성이없는 솔루션을 원하지만 console.log의 전체 기능 (다중 매개 변수, 변수 삽입)을 유지하려면 다음 코드를 사용할 수 있습니다.

var log = console.log;

console.log = function () {
    var first_parameter = arguments[0];
    var other_parameters = Array.prototype.slice.call(arguments, 1);

    function formatConsoleDate (date) {
        var hour = date.getHours();
        var minutes = date.getMinutes();
        var seconds = date.getSeconds();
        var milliseconds = date.getMilliseconds();

        return '[' +
               ((hour < 10) ? '0' + hour: hour) +
               ':' +
               ((minutes < 10) ? '0' + minutes: minutes) +
               ':' +
               ((seconds < 10) ? '0' + seconds: seconds) +
               '.' +
               ('00' + milliseconds).slice(-3) +
               '] ';
    }

    log.apply(console, [formatConsoleDate(new Date()) + first_parameter].concat(other_parameters));
};

formatConsoleDate 함수를 수정하여 원하는 날짜 형식을 지정할 수 있습니다.

이 코드는 기본 JavaScript 파일 위에 한 번만 작성하면됩니다.

console.log("he%s", "y") 다음과 같이 인쇄됩니다.

[12:22:55.053] hey

4
감사합니다.이 "의존성 없음"대답은 정확히 제가 필요로하는 것입니다.
RdR

9

log-timestamp 패키지를 사용할 수도 있습니다 . 매우 간단하고 사용자 정의도 가능합니다.


3
app.use(morgan('[:date[web]] :method :url :status :res[content-length] - :remote-addr - :response-time ms'))

2

이 구현은 간단하고 console.log의 원래 기능 (단일 객체 전달 및 변수 대체)을 지원하며 외부 모듈을 사용하지 않으며 console.log에 대한 단일 호출로 모든 것을 인쇄합니다.

var origlog = console.log;

console.log = function( obj, ...placeholders ){
    if ( typeof obj === 'string' )
        placeholders.unshift( Date.now() + " " + obj );
    else
    {
        // This handles console.log( object )
        placeholders.unshift( obj );
        placeholders.unshift( Date.now() + " %j" );
    }

    origlog.apply( this, placeholders );
};

2

원하는 경우 "Console"클래스에서 Node의 빌드를 확장하여 응용 프로그램에 대한 사용자 정의 로거를 만들 수 있습니다. 다음 구현을 참조하십시오.

"use strict";

const moment = require('moment');
const util = require('util');
const Console = require('console').Console;

class Logger extends Console {
    constructor(stdout, stderr, ...otherArgs) {
        super(stdout, stderr, ...otherArgs);
    }

    log(...args) {
        super.log(moment().format('D MMM HH:mm:ss'), '-', util.format(...args));
    }

    error(...args) {
        super.error(moment().format('D MMM HH:mm:ss'), '-', util.format(...args));
    }
}

module.exports = (function() {
    return new Logger(process.stdout, process.stderr); 
}());

그 후에 코드에서 다음과 같이 사용할 수 있습니다.

const logger = require('./logger');

logger.log('hello world', 123456);
logger.error('some error occurred', err);


1

이것은 직접적인 대답은 아니지만 winston.js를 살펴 보셨습니까? json 파일 또는 데이터베이스에 대한 로깅을 포함하여 훨씬 더 많은 로깅 옵션이 있습니다. 기본적으로 항상 타임 스탬프가 있습니다. 그냥 생각.


너무 많은 코드의 건드리지 않고 - 나는 여러 가지로 검토 한 결과, 지금, 나는 기존의 배포 프로젝트에 무언가를 추가 할
테크 가이 여행


1

console개체를 덮어 쓰려고합니다 . 잘 작동하는 것 같습니다. 사용하려면 아래 코드를 파일에 저장 한 다음 가져 와서 프록시 개체를 덮어 쓴 다음 정상적으로 사용합니다.

(이 작업에는 바벨 트랜스 파일이 필요 Proxy하며 IE 11과 같은 JavaScript 생성자를 지원하지 않는 환경에서는 작동하지 않습니다 .)

import console from './console-shadow.js'

console.log(...)
console.warn(...)
console.error(...)
// console-shadow.js

// Only these functions are shadowed by default
const overwrites = ['log', 'warn', 'info', 'error']

export default new Proxy(
  // Proxy (overwrite console methods here)
  {},

  // Handler
  {
    get: (obj, prop) =>
      prop in obj
        ? obj[prop]
        : overwrites.includes(prop)
        ? (...args) => console[prop].call(console, new Date(), ...args)
        : console[prop],
  }
)

기본적으로 콘솔 개체를 JavaScript 프록시 개체로 덮어 씁니다. 당신이 호출 할 때 .log, .warn당신이 호출하는 함수의 경우는 모든 매개 변수 다음에 첫 번째 매개 변수로 로그 문에 날짜를 삽입합니다 그렇다면, 등을 덮어 콘솔, 확인합니다.

나는 그 console물체가 실제로 많은 일을 한다고 생각하며 완전히 이해하지 못합니다. 나는 그래서 단지 절편 console.log, console.info, console.warn, console.error호출합니다.


-1

이와 같은 이벤트 리스너를 사용하십시오.

process.on('error', function() { 
   console.log('Error Occurred.');

   var d = Date(Date.now()).toString();
   console.log.call(console, d); // Wed Aug 07 2019 23:40:07 GMT+0100 (GMT+01:00)
});

행복한 코딩 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.