নোড.জেএস - মরগান এবং উইনস্টন লগিং / ব্যবহার করুন


102

আমরা morganআমাদের এক্সপ্রেস রূপান্তর লগ করতে ব্যবহার করি :

var morgan  = require('morgan');
morgan('combined');
// a format string
morgan(':remote-addr :method :url :uuid');
// a custom function
morgan(function (req, res) {
  return req.method + ' ' + req.url + ' ' + req.uuid;
})

এছাড়াও, আমরা winstonআমাদের অন্যান্য লগিং লগ করতে ব্যবহার করি :

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
         new (winston.transports.Console)({ level: 'info' }),
          new (winston.transports.File)({ filename: '/var/log/log-file.log' })
  ]
});

দুটি লগারকে একত্রিত করার কোনও উপায় আছে কি? পরিস্থিতি এখন সেটাইmorgan আমার স্ট্যান্ডার্ড আউটপুটটিতে winstonলেখার সময় এটি /var/log/log-file.log

আমি চাই যে লগার ফাইলটি এক্সপ্রেস ট্রান্সফর্মেশন তথ্য এবং অন্য তথ্যগুলি ( logger.info()) থেকে মিশ্রিত করবে ..


এটি করার অর্থ কী, আমি বলতে চাইছি, ভিক্ষার সময় আপনার কেন মর্গান দরকার ছিল, কেন কেবল এক্সপ্রেসের জন্য উইনস্টন মিডলওয়্যার লিখবেন না?
দিমিত্রি কোপ্রিভা

উত্তর:


142

আপনি যা করতে চান তার জন্য এই নিবন্ধটি একটি দুর্দান্ত কাজ করে।

http://tostring.it/2014/06/23/advanced-logging-with-nodejs/

আপনার নির্দিষ্ট কোডের জন্য আপনার সম্ভবত এর মতো কিছু দরকার:

var logger = new winston.Logger({
    transports: [
        new winston.transports.File({
            level: 'info',
            filename: './logs/all-logs.log',
            handleExceptions: true,
            json: true,
            maxsize: 5242880, //5MB
            maxFiles: 5,
            colorize: false
        }),
        new winston.transports.Console({
            level: 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        })
    ],
    exitOnError: false
});

logger.stream = {
    write: function(message, encoding){
        logger.info(message);
    }
};

app.use(require("morgan")("combined", { "stream": logger.stream }));

এটি কনসোলটিতে লগের পাশাপাশি একটি ফাইল লেখার জন্য উইনস্টনকে সেট আপ করবে। তারপরে আপনি মরগান মিডলওয়্যার থেকে উইনস্টনে আউটপুট পাস করার জন্য শেষ প্রকাশটি ব্যবহার করতে পারেন।


আমরা কি এই প্রক্রিয়াতে একটি টাইমস্ট্যাম্প ব্যবহার করতে পারি?
বোমায়াকান্ট

25
লগার.স্ট্রিমকে ওভাররাইড করা প্রয়োজন বলে মনে হচ্ছে না .. আমার ক্ষেত্রে, আমি করতে পেরেছিলামapp.use(morgan("combined", { stream: { write: message => logger.info(message) }}));
ডিভন স্যামস

19
আপনি যদি @ ডিভনস্যামস এর পদ্ধতি ব্যবহার করছেন তবে আপনি লগ করা লাইনের মধ্যে একটি খালি লাইন পাবেন কারণ মরগান এবং উইনস্টন উভয় লগ করা বার্তার শেষে একটি লাইন ব্রেক ব্রেক করছে ak আপনি কেবল বার্তাটি থেকে লাইনব্রেকটি ছাঁটাই করতে পারেনlogger.info(message.trim())
টিমো

4
যদি সার্ভারটি 500 এর সাথে সাড়া দেয় তবে আমি যদি logger.info এর পরিবর্তে logger.error ব্যবহার করতে চাই?
অ্যালেডরফ

4
জন্য winston: ^3.0.0ব্যবহার winston.createLoggerপরিবর্তেnew winston.Logger
streof

21

প্রকারভেদে:

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

class MyStream {
    write(text: string) {
        logger.info(text)
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));

কেন ছোট এবং একত্রিত হয় না?
অ্যানড্রয়েড

আমি আর এটি কাজ করতে সক্ষম ছিল না। দেখে মনে হচ্ছে টাইপিংগুলি ভুল। stackoverflow.com/questions/50048193/...
jpetitte

7

সতর্কতা অপসারণ করতে সর্বশেষ লাইনটি আপডেট করুন

app.use(require("morgan")("combined", { stream: logger.stream }));

3

টাইপস্ক্রিপ্টের জন্য ক্লাস তৈরির প্রয়োজন ছাড়াই এটির আরও একটি উপায়

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

const myStream = {
    write: (text: string) => {
        logger.info(text)
    }
}

app.use(morgan('combined', { stream: myStream }));

এই সমাধানটি এই গিথুব পৃষ্ঠা https://github.com/winstonjs/winston/issues/1385 থেকে নেওয়া হয়েছিল । তবে এটি লক্ষ করা গুরুত্বপূর্ণ যে আমাদের কোডগুলির মধ্যে সামান্য পার্থক্য রয়েছে। পরিবর্তে:

app.use(morgan('combined', { myStream }));

আমি ব্যবহার করি:

app.use(morgan('combined', { stream: myStream }));

ক্লাস তৈরি করতে খুব বেশি বড় না হওয়ায় এটি আমাকে সাহায্য করেছিল।


2

মরগানের বার্তাটি শেষ করার খারাপ অভ্যাস রয়েছে \nযাতে জিনিসগুলি সুশৃঙ্খলভাবে তৈরি করতে আপনি উইনস্টনকে লেখার আগে এটি মুছে ফেলতে চাইতে পারেন।

এটি অনেকগুলি বিভিন্ন উপায়ে করা যেতে পারে যেমন উইনস্টনের ফর্ম্যাট সাইডে, বা আপনার স্ট্রিমটি আপডেট না করে এটি না লিখে \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, ''));
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.