নোড.জেএস লাইব্রেরি উইনস্টোন ব্যবহার করে আমি কীভাবে লগগুলিতে টাইমস্ট্যাম্প যুক্ত করতে পারি?


94

আমি লগগুলিতে টাইমস্ট্যাম্প যুক্ত করতে চাই। এই অর্জন করার জন্য সবচেয়ে ভাল উপায় কি?


এটি খুব বিস্তৃত থেকে যায় কারণ আপনি ক্লায়েন্ট মেশিন থেকে এটি করতে পারবেন না।
জোশুয়া

উত্তর:


113

আমি নিজেই একই বিষয়টি নিয়ে কাজ করছিলাম। দুটি উপায় আছে যা আমি এটি করতে সক্ষম হয়েছি।

আপনি যখন উইনস্টনকে অন্তর্ভুক্ত করবেন তখন এটি সাধারণত কনসোল পরিবহন যুক্ত করার চেয়ে ডিফল্ট হয়। এই ডিফল্ট ক্ষেত্রে কাজ করার জন্য টাইমস্ট্যাম্পগুলি পেতে, আমার প্রয়োজন হয়:

  1. কনসোল পরিবহন সরান এবং টাইমস্ট্যাম্প বিকল্পের সাথে আবার যুক্ত করুন।
  2. সত্যতে সেট করা টাইমস্ট্যাম্প বিকল্পের সাহায্যে আপনার নিজের লগার অবজেক্টটি তৈরি করুন।

প্রথম:

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

কনসোল পরিবহনের জন্য অন্যান্য কয়েকটি বিকল্প এখানে পাওয়া যাবে :

  • স্তর: এই পরিবহণে লগ হওয়া উচিত এমন বার্তাগুলির স্তর (ডিফল্ট 'ডিবাগ')।
  • নীরব: আউটপুট (ডিফল্ট মিথ্যা) দমন করতে হবে কিনা তা নির্দেশ করে বুলিয়ান পতাকা।
  • কালারাইজ করা: বুলিয়ান পতাকাটি নির্দেশ করে যে আমাদের আউটপুটকে রঙিন করা উচিত (ডিফল্ট মিথ্যা)।
  • টাইমস্ট্যাম্প: বুলিয়ান পতাকা ইঙ্গিত দিচ্ছে যে আমাদের টাইমস্ট্যাম্পগুলির সাথে আউটপুট প্রিপেন্ড করা উচিত (ডিফল্ট মিথ্যা)। যদি ফাংশনটি নির্দিষ্ট করা থাকে তবে এর রিটার্ন মান টাইমস্ট্যাম্পের পরিবর্তে ব্যবহৃত হবে।

4
একই সময়ে আশ্চর্যজনক এবং সাধারণ। ধন্যবাদ!
কলি

7
এটা অসাধারণ. আমি সাধারণত এটি একটি ডেডিকেটেড ফাইলে মুড়ে রাখি যাতে সহজেই যে কোনও ফাইল থেকে আমার কনফিগার করা লগারটি পেতে পারি, অর্থাত, আমি উপরের কোডটি (বিকল্প 2) একটি নতুন ফাইল লগার.জেজে রেখেছি, তারপরে মডিউল.এক্সপোর্টগুলি = লগার; তারপরে যে কোনও ফাইল থেকে আমি var logger = প্রয়োজনীয় ('./ logger.js') করি এবং তারপরে যে কোনও ফাইল থেকে logger.info ('হ্যালো') করতে পারি এবং উইনস্টনের একই কনফিগারেশনটি পেতে পারি।
JHH


84

উপরের উত্তরগুলি আমার পক্ষে কার্যকর হয়নি। আপনি যদি উইনস্টনের সর্বশেষতম সংস্করণ - 3.0.0-আরসি 1 ব্যবহার করে আপনার লগগুলিতে টাইমস্ট্যাম্প যুক্ত করার চেষ্টা করছেন তবে এটি মনোযোগের মতো কাজ করেছে:

    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 ()' ব্যবহার করেছি। যেহেতু আমার সমস্ত ট্রান্সপোর্টে টাইমস্ট্যাম্পের দরকার ছিল তাই আমি প্রতিটি পরিবহণের পরিবর্তে ক্রিয়েটলগারের মধ্যে বিন্যাস বিকল্পটি যুক্ত করেছিলাম। কনসোল এবং ফাইল (কার্যকলাপ.লগ) এ আমার ফলাফল নিম্নরূপ:

{"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'})

16

আমরা এটির মতোও করতে পারি

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লগ বার্তায় অন্তর্ভুক্ত পেয়েছি বলে মনে হয় না ।
সামথিং

4
আমি someObjectনিম্নলিখিত মুদ্রণ বিবৃতি ব্যবহার করে অন্তর্ভুক্ত করতে সক্ষম হয়েছি ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}। এটিতে স্তর, টাইমস্ট্যাম্প এবং বার্তা অন্তর্ভুক্ত রয়েছে যা আমি অনুমান করি যে আমি মুছতে পারি।
কিছু

9

বিল্ট-ব্যবহার করতে পারেন util এবং সব সময় প্রবেশ করুন আপনার nodejs সার্ভারের জন্য timestap সঙ্গে লগিং অর্জন করা। আপনি যখন কোনও সার্ভার শুরু করেন প্যারামিটারের অংশ হিসাবে লগ আউটপুট যুক্ত করুন:

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

এবং তারপরে আপনি আপনার সার্ভার.জেজে ব্যবহার করতে পারেন

server.js

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

আউটপুটটি আউট.লগ ফাইলের মতো দেখতে কিছু লাগবে:

আউট.লগ

15 Mar 15:09:28 - something with timestamp

4
দুর্ভাগ্যক্রমে, util.error()আউটপুট টাইমস্ট্যাম্পিং এড়িয়ে যায়।
সারান

4

যদিও আমি উইনস্টন সম্পর্কে সচেতন নই, এটি একটি পরামর্শ। আমি লগইনের জন্য লগ 4js ব্যবহার করি এবং আমার লগগুলি ডিফল্টরূপে দেখতে লাগে

[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] লগ স্তর

লগ করার জন্য বিভিন্ন প্রোফাইল বজায় রাখা লগ 4 জজে সম্ভব in আমার কাছে ডেভলপমেন্ট এবং প্রোডাকশন প্রোফাইল রয়েছে। এছাড়াও রোলিং ফাইল অ্যাপেন্ডার, কনসোল অ্যাপেন্ডার ইত্যাদির মতো লগারের ধরণ রয়েছে etc.

লগ 4js আপনার কনসোলকে ওভাররাইড করবে log লগ এটি এখন একটি কনফিগারযোগ্য প্যারামিটার 0.5+ তে


এফওয়াইআই: লগ 4js-নোডের নতুন সংস্করণ (0.5+) স্বয়ংক্রিয়ভাবে কনসোল.লগকে ওভাররাইড করে না।
জেফ হিল্টজ

@ জেফিল্টজ ইয়া আপনি ঠিক বলেছেন :) এখন এটি একটি কনফিগারযোগ্য প্যারামিটার
তামিল

3

আমরা বিদ্যমান কনসোলে টাইমস্ট্যাম্প এবং লগ স্তর যুক্ত করতে কনসোল-স্ট্যাম্প ব্যবহার করতে পারি: require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')

বিশদ জানতে https://github.com/starak/node-console-stamp দেখুন


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 দেখুন


1

আরেকটি সমাধান হ'ল লগারকে এমন একটি ফাইলে আবৃত করে যা কিছু ফাংশন যেমন logger.info (), logger.error () ইত্যাদি রফতানি করে তবে আপনি প্রতিটি বার্তার লগতে প্রেরণের জন্য একটি অতিরিক্ত কী পাস করেন।

লগার সার্ভিস.জেএস

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
}

যাইহোক - file.js

const logger = require('./services/loggerService')

logger.info('Hello World!')

আপনার লগ.লগ

{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}

1

আমি বিশ্বদেবের উত্তর নিয়েছি এবং একটি স্ট্রিংফাইড জেএসওএন অবজেক্ট তৈরি করেছি। এইভাবে যদি আমাকে লগগুলি পরে প্রক্রিয়া করা প্রয়োজন তবে এটি একটি সুগঠিত বিন্যাসে হবে।

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

আউটপুট:

তথ্য.লগ ফাইল:

{"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.