আমি কি কনফিগার করতে পারি console.logযাতে কনসোলে মুদ্রণের পরিবর্তে কোনও ফাইলে লগগুলি লেখা হয়?
আমি কি কনফিগার করতে পারি console.logযাতে কনসোলে মুদ্রণের পরিবর্তে কোনও ফাইলে লগগুলি লেখা হয়?
উত্তর:
আপডেট 2013 - এটি নোড v0.2 এবং v0.4 এর আশেপাশে লেখা হয়েছিল; লগিংয়ের আশেপাশে এখন আরও অনেক ভাল ইউটিলিটি রয়েছে। আমি উইনস্টনকে অত্যন্ত প্রস্তাব দিই
লেট 2013 আপডেট করুন - আমরা এখনও উইনস্টন ব্যবহার করি, তবে এখন কাস্টম অবজেক্টস এবং ফর্ম্যাটিংয়ের লগিংয়ের কার্যকারিতা মোড়ানোর জন্য একটি লগার লাইব্রেরি সহ। এখানে আমাদের লগার.জেএসসের একটি নমুনা https://gist.github.com/rtgibbons/7354879
এই হিসাবে সহজ হতে হবে।
var access = fs.createWriteStream(dir + '/node.access.log', { flags: 'a' })
, error = fs.createWriteStream(dir + '/node.error.log', { flags: 'a' });
// redirect stdout / stderr
proc.stdout.pipe(access);
proc.stderr.pipe(error);
console.log(whatever);এখনও কনসোলে যায়, ফাইল হয় না।
process.__defineGetter__('stderr', function() { return fs.createWriteStream(__dirname + '/error.log', {flags:'a'}) })
আপনি কেবলমাত্র ডিফল্ট কনসোল.লগ ফাংশনটি ওভারলোড করতে পারেন:
var fs = require('fs');
var util = require('util');
var log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'w'});
var log_stdout = process.stdout;
console.log = function(d) { //
log_file.write(util.format(d) + '\n');
log_stdout.write(util.format(d) + '\n');
};
উপরে উদাহরণস্বরূপ debug.log এবং stdout লগ করা হবে।
সম্পাদনা করুন: এই পৃষ্ঠায় ক্লামেন্টের মাল্টিপ্যারামিটার সংস্করণটি দেখুন ।
আপনি যদি প্রোডাকশনের জন্য কিছু খুঁজছেন তবে উইনস্টন সম্ভবত সেরা পছন্দ।
যদি আপনি কেবল ডেভ স্টাফগুলি দ্রুত করতে চান, সরাসরি কোনও ফাইলে আউটপুট করুন (আমার মনে হয় এটি কেবল * নিক্স সিস্টেমে কাজ করে):
nohup node simple-server.js > output.log &
>পুনঃনির্দেশ করতে ব্যবহার করে উইন্ডোজেও STDOUT কাজ করে। nohupনা।
nohup* নিক্স ছাড়াই সুখে কাজ করে node simple-server.js > output.log। তারপরে আপনি যদি লগটি কেবল তার লিখিত হিসাবে অনুসরণ করতে চানtail -f output.log
আমি প্রায়শই কনসোল.লগ () এবং কনসোল.অরার () ব্যবহার করতে অনেক যুক্তি ব্যবহার করি , সুতরাং আমার সমাধানটি হবে:
var fs = require('fs');
var util = require('util');
var logFile = fs.createWriteStream('log.txt', { flags: 'a' });
// Or 'w' to truncate the file every time the process starts.
var logStdout = process.stdout;
console.log = function () {
logFile.write(util.format.apply(null, arguments) + '\n');
logStdout.write(util.format.apply(null, arguments) + '\n');
}
console.error = console.log;
উইনস্টন একটি খুব জনপ্রিয় এনপিএম-মডিউল যা লগিংয়ের জন্য ব্যবহৃত হয়।
এখানে একটি কিভাবে।
আপনার প্রোজেক্টে উইনস্টন ইনস্টল করুন:
npm install winston --save
আমি আমার প্রকল্পগুলিতে প্রায়শই ব্যবহারগুলির অধীনে লগার.জে হিসাবে ব্যবহার করি না এমন একটি বাক্স আউট-বক্স ব্যবহারের জন্য প্রস্তুত একটি কনফিগারেশন এখানে।
/**
* Configurations of logger.
*/
const winston = require('winston');
const winstonRotator = require('winston-daily-rotate-file');
const consoleConfig = [
new winston.transports.Console({
'colorize': true
})
];
const createLogger = new winston.Logger({
'transports': consoleConfig
});
const successLogger = createLogger;
successLogger.add(winstonRotator, {
'name': 'access-file',
'level': 'info',
'filename': './logs/access.log',
'json': false,
'datePattern': 'yyyy-MM-dd-',
'prepend': true
});
const errorLogger = createLogger;
errorLogger.add(winstonRotator, {
'name': 'error-file',
'level': 'error',
'filename': './logs/error.log',
'json': false,
'datePattern': 'yyyy-MM-dd-',
'prepend': true
});
module.exports = {
'successlog': successLogger,
'errorlog': errorLogger
};
এবং তারপরে কেবল যেখানে প্রয়োজন সেখানে আমদানি করুন:
const errorLog = require('../util/logger').errorlog;
const successlog = require('../util/logger').successlog;
তারপরে আপনি সাফল্যটি লগ ইন করতে পারেন:
successlog.info(`Success Message and variables: ${variable}`);
এবং ত্রুটিগুলি:
errorlog.error(`Error Message : ${error}`);
আপনি এখানে দেখতে পারেন যেমন এটি লগ ডিরেক্টরিতে তারিখ অনুসারে কোনও ফাইলটিতে সমস্ত সাফল্য-লগ এবং ত্রুটি-লগগুলি লগ করে।

winston& winston-daily-rotate-file) দেখুন। এগুলি logsপ্রকল্পের মূল ডিরেক্টরিতে থাকা ফোল্ডারের ভিতরে তৈরি করা উচিত । বিলম্বিত উত্তরের জন্য আমাকে ক্ষমা করুন।
const winston = require('winston'); const winstonRotator = require('winston-daily-rotate-file'); এবং const errorLog = require('../util/logger').errorlog; const successlog = require('../util/logger').successlog; যেখানেই আপনি কিছু লগইন করতে চান তা যুক্ত করতে ভুলবেন না ।
const fs = require("fs");
const {keys} = Object;
const {Console} = console;
/**
* Redirect console to a file. Call without path or with false-y
* value to restore original behavior.
* @param {string} [path]
*/
function file(path) {
const con = path ? new Console(fs.createWriteStream(path)) : null;
keys(Console.prototype).forEach(key => {
if (path) {
this[key] = (...args) => con[key](...args);
} else {
delete this[key];
}
});
};
// patch global console object and export
module.exports = console.file = file;
এটি ব্যবহার করতে, এমন কিছু করুন:
require("./console-file");
console.file("/path/to.log");
console.log("write to file!");
console.error("also write to file!");
console.file(); // go back to writing to stdout
Console.prototypeকীগুলি লুপিংয়ের পরিবর্তে কেবল স্পষ্টভাবে this.errorকেবল সেট করুন ।
console.log। এটি তার আচরণ পরিবর্তন করে, যদিও আপনি কল করে পুরানো আচরণটি পুনরুদ্ধার করতে পারেন console.file()।
এটি যদি কোনও অ্যাপ্লিকেশনটির জন্য হয় তবে লগিং মডিউলটি ব্যবহার করে আপনি সম্ভবত ভাল। এটি আপনাকে আরও নমনীয়তা দেবে। কিছু পরামর্শ।
এখনো উল্লেখ করা আরেকটি সমাধান hooking দ্বারা Writableমধ্যে স্ট্রিম process.stdoutএবং process.stderr। এইভাবে আপনাকে স্টডআউট এবং স্ট্ডার আউটপুট যে সমস্ত কনসোল ফাংশন ওভাররাইড করতে হবে না । এই প্রয়োগটি স্টডআউট এবং স্ট্ডার উভয়ই লগ ফাইলে পুনঃনির্দেশ করে:
var log_file = require('fs').createWriteStream(__dirname + '/log.txt', {flags : 'w'})
function hook_stream(stream, callback) {
var old_write = stream.write
stream.write = (function(write) {
return function(string, encoding, fd) {
write.apply(stream, arguments) // comments this line if you don't want output in the console
callback(string, encoding, fd)
}
})(stream.write)
return function() {
stream.write = old_write
}
}
console.log('a')
console.error('b')
var unhook_stdout = hook_stream(process.stdout, function(string, encoding, fd) {
log_file.write(string, encoding)
})
var unhook_stderr = hook_stream(process.stderr, function(string, encoding, fd) {
log_file.write(string, encoding)
})
console.log('c')
console.error('d')
unhook_stdout()
unhook_stderr()
console.log('e')
console.error('f')
এটি কনসোলে মুদ্রণ করা উচিত
a
b
c
d
e
f
এবং লগ ফাইলে:
c
d
আরও তথ্যের জন্য, এই টুকরোটি পরীক্ষা করুন ।
সাধারণ ক্ষেত্রে, আমরা স্ট্যান্ডার্ড আউট (STDOUT) এবং স্ট্যান্ডার্ড ত্রুটি (এসটিডিআরআর) স্ট্রিমগুলি সরাসরি '>' এবং '2> & 1' এ ফাইলে পুনর্নির্দেশ করতে পারতাম
উদাহরণ:
// test.js
(function() {
// Below outputs are sent to Standard Out (STDOUT) stream
console.log("Hello Log");
console.info("Hello Info");
// Below outputs are sent to Standard Error (STDERR) stream
console.error("Hello Error");
console.warn("Hello Warning");
})();
নোড টেস্ট.জেএস> টেস্ট.লগ 2> & 1
পসিক্স স্ট্যান্ডার্ড অনুসারে, 'ইনপুট', 'আউটপুট' এবং 'ত্রুটি' স্ট্রিমগুলি ধনাত্মক পূর্ণসংখ্যা ফাইল বর্ণনাকারী (0, 1, 2) দ্বারা চিহ্নিত করা হয় । উদাহরণস্বরূপ, স্ট্ডিন 0, স্ট্ডআউট 1, এবং স্ট্ডার 2 হয়।
'2> & 1' 2 (স্টাডার) থেকে 1 (স্টাডআউট) এ পুনঃনির্দেশ করবে
'>' ফাইলটি (টেস্ট.লগ) এ 1 (স্টডআউট) থেকে পুনঃনির্দেশ করবে
ওভার রাইটিং কনসোল.লগ যাওয়ার উপায়। এটি প্রয়োজনীয় মডিউলগুলিতে কাজ করার জন্য আপনাকে এটিকে রফতানি করতে হবে।
module.exports = console;
নিজেকে লগ ফাইল, ঘোরানো এবং স্টাফ লেখার ঝামেলা বাঁচাতে আপনি উইনস্টনের মতো সাধারণ লগার মডিউলটি ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন:
// Include the logger module
var winston = require('winston');
// Set up log file. (you can also define size, rotation etc.)
winston.add(winston.transports.File, { filename: 'somefile.log' });
// Overwrite some of the build-in console functions
console.error = winston.error;
console.log = winston.info;
console.info = winston.info;
console.debug = winston.debug;
console.warn = winston.warn;
module.exports = console;
globalঅবজেক্টে কনসোল বৈশিষ্ট্যগুলি ওভাররাইট করতে পারেন । কেন module.exports?
পদ্ধতি স্টাডুট এবং স্টেডিআর
এই পদ্ধতি আপনাকে সহায়তা করতে পারে (আমি আমার প্রকল্পগুলিতে অনুরূপ কিছু ব্যবহার করি) এবং কনসোল.লগ, কনসোল.ওয়ার্ন, কনসোল.অররর, কনসোল.ইন.ও সহ সমস্ত পদ্ধতির জন্য কাজ করে can
এই পদ্ধতিতে স্টডআউট এবং স্টার্ডারে লিখিত বাইটগুলি ফাইল করতে হবে। কনসোল.লগ, কনসোল.ওয়ার্ন, কনসোল.অরর, কনসোল.আইনফো পদ্ধতি পরিবর্তনের চেয়ে আরও ভাল, কারণ আউটপুট এই পদ্ধতির আউটপুটের মতো হুবহু হবে
var fs= require("fs")
var os= require("os")
var HOME= os.homedir()
var stdout_r = fs.createWriteStream(HOME + '/node.stdout.log', { flags: 'a' })
var stderr_r = fs.createWriteStream(HOME + '/node.stderr.log', { flags: 'a' })
var attachToLog= function(std, std_new){
var originalwrite= std.write
std.write= function(data,enc){
try{
var d= data
if(!Buffer.isBuffer(d))
d= Buffer.from(data, (typeof enc === 'string') ? enc : "utf8")
std_new.write.apply(std_new, d)
}catch(e){}
return originalwrite.apply(std, arguments)
}
}
attachToLog(process.stdout, stdout_r)
attachToLog(process.stderr, stderr_r)
// recommended catch error on stdout_r and stderr_r
// stdout_r.on("error", yourfunction)
// stderr_r.on("error", yourfunction)
কনসোলে নোডেজের এপিআই ডক্স থেকে সরাসরি
const output = fs.createWriteStream('./stdout.log');
const errorOutput = fs.createWriteStream('./stderr.log');
// custom simple logger
const logger = new Console(output, errorOutput);
// use it like console
const count = 5;
logger.log('count: %d', count);
// in stdout.log: count 5
আপনি এখন ক্যাটারপিলার ব্যবহার করতে পারেন যা স্ট্রিম ভিত্তিক লগিং সিস্টেম যা আপনাকে এতে লগ ইন করতে দেয়, তারপরে আউটপুটটিকে বিভিন্ন রূপান্তর এবং অবস্থানগুলিতে বন্ধ করে দেয়।
কোনও ফাইলে আউটপুটিং করা যেমন সহজ:
var logger = new (require('./').Logger)();
logger.pipe(require('fs').createWriteStream('./debug.log'));
logger.log('your log message');
ক্যাটারপিলার ওয়েবসাইটে সম্পূর্ণ উদাহরণ
আপনি এই এনপিএম মডিউলটিও দেখতে পারেন: https://www.npmjs.com/package/noogger
সহজ এবং সোজা এগিয়ে ...
আমি আউটপুট স্ট্রিমটিকে আমার স্ট্রিমের মধ্যে বদলানোর ধারণাটি গ্রহণ করেছি।
const LogLater = require ('./loglater.js');
var logfile=new LogLater( 'log'+( new Date().toISOString().replace(/[^a-zA-Z0-9]/g,'-') )+'.txt' );
var PassThrough = require('stream').PassThrough;
var myout= new PassThrough();
var wasout=console._stdout;
myout.on('data',(data)=>{logfile.dateline("\r\n"+data);wasout.write(data);});
console._stdout=myout;
var myerr= new PassThrough();
var waserr=console._stderr;
myerr.on('data',(data)=>{logfile.dateline("\r\n"+data);waserr.write(data);});
console._stderr=myerr;
loglater.js:
const fs = require('fs');
function LogLater(filename, noduplicates, interval) {
this.filename = filename || "loglater.txt";
this.arr = [];
this.timeout = false;
this.interval = interval || 1000;
this.noduplicates = noduplicates || true;
this.onsavetimeout_bind = this.onsavetimeout.bind(this);
this.lasttext = "";
process.on('exit',()=>{ if(this.timeout)clearTimeout(this.timeout);this.timeout=false; this.save(); })
}
LogLater.prototype = {
_log: function _log(text) {
this.arr.push(text);
if (!this.timeout) this.timeout = setTimeout(this.onsavetimeout_bind, this.interval);
},
text: function log(text, loglastline) {
if (this.noduplicates) {
if (this.lasttext === text) return;
this.lastline = text;
}
this._log(text);
},
line: function log(text, loglastline) {
if (this.noduplicates) {
if (this.lasttext === text) return;
this.lastline = text;
}
this._log(text + '\r\n');
},
dateline: function dateline(text) {
if (this.noduplicates) {
if (this.lasttext === text) return;
this.lastline = text;
}
this._log(((new Date()).toISOString()) + '\t' + text + '\r\n');
},
onsavetimeout: function onsavetimeout() {
this.timeout = false;
this.save();
},
save: function save() { fs.appendFile(this.filename, this.arr.splice(0, this.arr.length).join(''), function(err) { if (err) console.log(err.stack) }); }
}
module.exports = LogLater;
আন্ড্রেস রিওফ্রিওর উন্নতি করুন, যেকোন সংখ্যক যুক্তি পরিচালনা করতে
var fs = require('fs');
var util = require('util');
var log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'w'});
var log_stdout = process.stdout;
console.log = function(...args) {
var output = args.join(' ');
log_file.write(util.format(output) + '\r\n');
log_stdout.write(util.format(output) + '\r\n');
};
আমি এটি করার জন্য একটি প্যাক তৈরি করেছি, আশা করি আপনি এটি পছন্দ করেছেন;) https://www.npmjs.com/package/writelog
আমি কেবল উইনস্টন থেকে উদাহরণটি গ্রহণ করেছি এবং log(...)পদ্ধতিটি যুক্ত করেছি (কারণ উইনস্টন এর নাম দিয়েছে info(..):
Console.js:
"use strict"
// Include the logger module
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
//
// - Write to all logs with level `info` and below to `combined.log`
// - Write all logs error (and below) to `error.log`.
//
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
// Add log command
logger.log=logger.info;
module.exports = logger;
তারপরে আপনার কোডটিতে কেবল ব্যবহার করুন:
const console = require('Console')
এখন আপনি কেবল আপনার ফাইলে সাধারণ লগ ফাংশনগুলি ব্যবহার করতে পারেন এবং এটি একটি ফাইল তৈরি করবে এবং এটি আপনার কনসোলে লগ করবে (ডিবাগিং / বিকাশকালে)। কারণ if (process.env.NODE_ENV !== 'production') {(যদি আপনি এটি উত্পাদন ক্ষেত্রেও চান) ...