모든 콘솔 메시지에 타임스탬프 추가
전체적으로 console.log() 및 console.error() 문이 많은 완전한 배포형 Express 기반 프로젝트가 있습니다.프로젝트는 forever를 사용하여 실행되며 stdout과 stderr를 두 개의 개별 파일로 보냅니다.
모든 것이 잘 작동하지만, 오류가 발생한 시기를 정확히 알기 위해 타임스탬프가 누락되었습니다.
코드 전체에서 검색/교체를 수행하거나 각 파일의 콘솔을 재정의하는 npm 모듈을 사용할 수 있지만, 필요한 경우가 아니면 모든 모델/루트 파일을 만지고 싶지 않습니다.
발신되는 모든 통화에 타임스탬프를 추가할 수 있는 Express 미들웨어와 같은 방법이 있습니까? 아니면 수동으로 추가해야 합니까?
app.js 파일의 맨 위에 있는 콘솔 기능을 재정의하고 다른 모든 모듈에서 이 기능을 적용할 수 있는 것으로 나타났습니다.내 모듈 중 하나가 분기되어 있기 때문에 혼합된 결과를 얻었습니다.child_process
그 파일의 맨 위에도 줄을 복사하면 모든 것이 작동합니다.
참고로 모듈 콘솔-스탬프(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
...
모듈 로그 타임 스탬프는 저에게 적합합니다.
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
다음을 사용하여 파일을 만듭니다.
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);
다른 외부 종속성이 없는 솔루션을 원하지만 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 함수를 수정하여 원하는 날짜 형식을 지정할 수 있습니다.
이 코드는 주 자바스크립트 파일 위에 한 번만 작성하면 됩니다.
console.log("he%s", "y")
다음과 같은 내용을 인쇄합니다.
[12:22:55.053] hey
로그 타임 스탬프 패키지를 사용할 수도 있습니다.매우 간단하고 사용자 지정도 가능합니다.
이 구현은 간단하고 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 );
};
원하는 경우 노드의 빌드인 "콘솔" 클래스를 확장하여 응용 프로그램에 대한 사용자 지정 로거를 만들 수 있습니다.다음 구현을 참조하십시오.
"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);
외부 모듈을 설치하지 않기 위한 보다 기본적인 접근 방식은 다음과 같은 간단한 기능을 구현하는 것일 수 있습니다.
function timeStamp(message){
console.log ( '[' + new Date().toISOString().substring(11,23) + '] -', message )
}
그런 다음 간단히 이렇게 부릅니다.
timeStamp('this is my logline!!');
결과는 다음과 같습니다.
LOG [15:22:30.682] - this is my logline!!
물론 당신은 당신이 필요로 하는 가장 좋은 형식으로 날짜를 포맷할 수 있고, console.error, debug 등으로 기능을 확장할 수 있습니다.
이것은 직접적인 대답은 아니지만, winston.js에 대해 알아봤습니까?json 파일 또는 데이터베이스에 대한 로깅을 포함하여 훨씬 더 많은 로깅 옵션이 있습니다.기본적으로 타임스탬프는 항상 있습니다.생각일 뿐이야.
app.use(morgan('[:date[web]] :method :url :status :res[content-length] - :remote-addr - :response-time ms'))
2022년에 적합한 답변
const log = console.log;
console.log = function(){
log.apply(console, [new Date(), ...arguments]);
};
할 수 있습니다.util.log
https://nodejs.org/api/util.html 에서 확인할 수 있습니다.
버전 6.0.0 이후에는 더 이상 사용되지 않습니다.
상위 버전의 경우 "대신 타사 모듈 사용"해야 합니다.
저는 그것을 덮어쓰는 중입니다.console
- 잘 것 . object - 잘작는것같다니습하동.사용하려면 아래 코드를 파일에 저장한 다음 가져오기를 수행하여 프록시 개체를 덮어쓰고 정상적으로 사용합니다.
하지 않습니다.Proxy
생성자(예: IE 11).
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
전화가 걸려오는 전화.
이벤트 청취자를 이렇게 사용합니다.
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)
});
해피 코딩 :)
언급URL : https://stackoverflow.com/questions/18814221/adding-timestamps-to-all-console-messages
'programing' 카테고리의 다른 글
실행 중인 SetInterval 간격 변경 (0) | 2023.08.14 |
---|---|
JQuery.handleError를 던지는 Ajax 업로드 플러그인을 찾을 수 없습니다. (0) | 2023.08.14 |
Oracle 클라이언트 및 네트워킹 구성 요소를 찾을 수 없습니다. (0) | 2023.08.14 |
fork() 뒤에 있는 'file descriptor'에 대한 간단한 설명 찾기 (0) | 2023.08.14 |
스프링 부트 - 다중 파트 파일 최대 업로드 크기 예외 (0) | 2023.08.14 |