모든 콘솔 메시지에 타임스탬프 추가
전체적으로 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.loghttps://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 |