সমস্ত কনসোল বার্তায় টাইমস্ট্যাম্প যুক্ত করা


93

আমার কাছে একটি সম্পূর্ণ, মোতায়েন করা , এক্সপ্রেস-ভিত্তিক প্রকল্প রয়েছে, যার মধ্যে অনেকগুলি কনসোল.লগ () এবং কনসোল.অরর () বিবৃতি রয়েছে। প্রকল্পটি চিরকালের জন্য ব্যবহার করে চলেছে, স্টডআউট এবং স্ট্ডারকে 2 টি পৃথক ফাইলে পরিচালিত করে।

এগুলি বেশ ভালভাবে কাজ করে তবে এখন আমি টাইমস্ট্যাম্পগুলি অনুপস্থিত errors ত্রুটিগুলি কখন ঘটেছে ঠিক তা জানতে।

আমি আমার কোড জুড়ে কিছু প্রকারের অনুসন্ধান / প্রতিস্থাপন করতে পারি বা প্রতিটি ফাইলের মধ্যে কনসোলকে ওভাররাইড করে এমন কিছু এনপিএম মডিউল ব্যবহার করতে পারি, তবে আমি প্রতিটি মডেল / রুট ফাইল স্পর্শ করতে চাই না, যদি না আমার একেবারে না থাকে।

কোনও উপায় আছে, সম্ভবত একটি এক্সপ্রেস মিডলওয়্যার, এটি আমাকে যে সমস্ত কল করা হয়েছে তার জন্য টাইমস্ট্যাম্প যোগ করতে দেয় বা আমাকে নিজেই এটি যুক্ত করতে হবে?


উত্তর:


116

দেখা যাচ্ছে, আপনি app.js ফাইলের শীর্ষে কনসোল ফাংশনগুলি ওভাররাইড করতে পারেন এবং এটি প্রতিটি অন্যান্য মডিউলে কার্যকর করতে পারেন। আমি মিশ্র ফলাফল পেয়েছি কারণ আমার একটি মডিউল একটি হিসাবে কাঁটাযুক্ত child_process। একবার আমি সেই ফাইলটির শীর্ষে লাইনটি অনুলিপি করেছি, সমস্ত কাজ করে।

রেকর্ডের জন্য, আমি মডিউলটি কনসোল-স্ট্যাম্প ( npm install console-stamp --save) ইনস্টল করেছি এবং এই লাইনটি app.js এবং চাইল্ডপ্রসেস.জেএস এর শীর্ষে যুক্ত করেছি:

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

এখন আমার সমস্যাটি হ'ল :dateসংযুক্ত লগারটির ফর্ম্যাটটি ইউটিসি ফর্ম্যাট ব্যবহার করে, আমি অন্য কনসোল কলগুলিতে ব্যবহার করছি তার চেয়ে। এটি সহজেই আমার নিজের সময় বিন্যাসটি নিবন্ধন করে ঠিক করা হয়েছিল (এবং পার্শ্ব প্রতিক্রিয়া হিসাবে , অন্যটি ইনস্টল না করে পরিবর্তিত 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
...

4
আমি এর জন্য দস্তাবেজগুলি খুঁজে পেলাম না, তবে মনে হচ্ছে ": মিমি" মাসটি উল্লেখ করবে এবং ": এমএম" এমন ফর্ম্যাট যা আপনি আসলে ব্যবহার করতে চান
লরেন্ট সিগাল

4
আপনি @ ব্যবহারকারী 603124 যা বলছেন তার অনুসারে মিনিটের অংশটি চেঁচিয়ে উঠবেন। কয়েক মিনিটের জন্য স্ট্রিংটি হ'ল : এমএম ( github.com
তারক

মন্তব্যের জন্য ধন্যবাদ. সংশোধিত!
ট্র্যাভেল টেক গাই

4
দেখে মনে হচ্ছে আপনার আর এইচ এইচ: এমএম: এসএসএল বন্ধনীতে আবৃত করতে হবে না
জেফ

4
এফওয়াইআই github.com/senchalabs/connect#middlewarelogger দ্বারা প্রতিস্থাপন করা হয়েছেmorgan
ভেটেলিয়ার

34

মডিউল: "লগ-টাইমস্ট্যাম্প" আমার জন্য কাজ করে।

দেখতে 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);

4
যদি এটি একই অ্যাপ্লিকেশন / প্রক্রিয়া না হয়। কনসোল একটি গ্লোবাল অবজেক্ট তাই আপনি যদি এর মতো একটি ফাংশন হাইজ্যাক করেন তবে এটি সেই সমস্ত ফাইলের জন্য হাইজ্যাক করা থাকবে যা সেই বিশ্বব্যাপী অবজেক্টটি ভাগ করে share
Andreas Hultgren

সুতরাং এটিকে / app.js ফাইলটিতে স্থাপন করা উচিত?
ট্র্যাভেল টেক গাই

4
হ্যাঁ. <মিনিট 15 অক্ষর ...>
Andreas Hultgren

4
আমি পরিবর্তে কনসোল-স্ট্যাম্প ব্যবহার করার পরামর্শ দিচ্ছি
জেসেক পিটাল

4
এটি ভাল সমাধান নয় - এটি হয় ভেরিয়েবল সন্নিবেশ ধ্বংস করে (এভাবে প্রতিস্থাপন হিসাবে ব্যবহার করা যায় না), বা বিভিন্ন লাইনে তারিখ এবং লগ আউটপুট মুদ্রণ করে।
জর্জ ওয়াই।

16

আপনি যদি অন্য বাহ্যিক নির্ভরতা ছাড়াই সমাধান চান তবে কনসোল.লগের সম্পূর্ণ কার্যকারিতা রাখতে চান (একাধিক পরামিতি, ভেরিয়েবল সন্নিবেশ) আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

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));
};

আপনি যে তারিখটি চান তার ফর্ম্যাট করতে আপনি কনসোলডেট ফাংশন ফর্ম্যাটটি পরিবর্তন করতে পারেন।

এই কোডটি আপনার মূল জাভাস্ক্রিপ্ট ফাইলের শীর্ষে একবারে লেখা দরকার।

console.log("he%s", "y") এরকম কিছু মুদ্রণ করবে:

[12:22:55.053] hey

4
ধন্যবাদ, এই "কোনও নির্ভরতা নেই" উত্তরটি আমার প্রয়োজন মতো ছিল।
RdR


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

2

এই বাস্তবায়নটি সহজ, কনসোল.লগের মূল কার্যকারিতা সমর্থন করে (একটি একক অবজেক্ট এবং পরিবর্তনশীল প্রতিস্থাপন), বাহ্যিক মডিউলগুলি ব্যবহার করে না এবং কনসোল.লগে একক কলে সমস্ত কিছু মুদ্রণ করে:

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

আপনি যদি চান, আপনি "কনসোল" শ্রেণিতে নোডের বিল্ডটি বাড়িয়ে আপনার অ্যাপ্লিকেশনটির জন্য একটি কাস্টম লগার তৈরি করতে পারেন। দয়া করে নিম্নলিখিত বাস্তবায়ন দেখুন

"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

এটি সরাসরি উত্তর নয়, তবে আপনি উইনস্টন.জেএস-এ সন্ধান করেছেন? এটিতে একটি জসন ফাইল বা ডাটাবেসে লগিং সহ আরও একটি টন লগিং বিকল্প রয়েছে। এগুলির সর্বদা ডিফল্টরূপে টাইমস্ট্যাম্প থাকে। শুধু একটি ভাবনা.


আমি এখনই অনেকগুলি বিষয় সন্ধান করেছি, এখনই আমি একটি বিদ্যমান, মোতায়েন করা প্রকল্পে কিছু যুক্ত করতে চাই
ট্র্যাভেলিং টেক গাই

1

আপনি https://nodejs.org/api/util.htmlutil.log থেকে কোনও ফাংশন ব্যবহার করতে পারেন

সচেতন থাকুন যে এটি সংস্করণ 6.0.0 থেকে অবহেলা করা হয়েছে।

উচ্চতর সংস্করণগুলির জন্য আপনার "পরিবর্তে তৃতীয় পক্ষের মডিউল ব্যবহার করা উচিত "।


4
অবচিত: তৃতীয় পক্ষের মডিউল ব্যবহার করুন use
জোশ উঙ্গার

1

আমি consoleঅবজেক্টটি ওভাররাইট করার চেষ্টা করছি - মনে হচ্ছে এটি ভাল কাজ করছে। ব্যবহার করতে, একটি ফাইলে নীচের কোডটি সংরক্ষণ করুন এবং তারপরে প্রক্সি অবজেক্টটি ওভাররাইট করতে আমদানি করুন এবং তারপরে স্বাভাবিক হিসাবে ব্যবহার করুন।

(নোট করুন এটির জন্য বাবেল প্রতিস্থাপনের প্রয়োজন এবং এটি এমন পরিবেশে কাজ করবে না যা জাভাস্ক্রিপ্ট Proxyকনস্ট্রাক্টর যেমন আইই ১১ সমর্থন করে না )।

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],
  }
)

মূলত আমি জাভাস্ক্রিপ্ট প্রক্সি অবজেক্টের সাথে কনসোল অবজেক্টটি ওভাররাইট করি। আপনি যখন ফোন করবেন .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.