2015-09-22 11 views
9

मैं बना लिया है:रीडायरेक्ट कर रहा है stdout फाइल करने के लिए NodeJS

var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' }); 

तब पहुंचाया:

process.stdout.pipe(access); 

फिर कोशिश की:

console.log("test"); 

और कुछ भी नहीं है/var में दिखाई दिया है/log/नोड/api.access.log। हालांकि इस तरह से काम कर रहा है:

process.stdout.pipe(access).write('test'); 

कोई समझा सकते हैं क्या मैं गलत कर रहा हूँ?

+0

हाँ मैं वास्तव में हैरान हूं कि आप बिना किसी त्रुटि के लिखने पर पाइप को कॉल कर सकते हैं, उसके साथ क्या चल रहा है? –

उत्तर

1

process.stdout एक लिखने योग्य है। https://nodejs.org/api/stream.html

आप process.stdout यहाँ के प्रलेखन देख सकते हैं: pipeReadable (सीएफ StreamAPI प्रलेखन की एक विधि है https://nodejs.org/api/process.html#process_process_stdout

यह आश्चर्य की बात है कि आप किसी भी त्रुटि के बिना process.stdout.pipe(...); क्या कर सकते हैं लेकिन मैं इस कॉल लगता है अभी कुछ भी नहीं।। एक नया लिखने योग्य धारा stdout में आबद्ध लौटने को छोड़कर (या शायद यह process.stdout ही रिटर्न नहीं विनिर्देश दस्तावेज में उस के लिए नहीं है।)

आप एक फाइल करने के लिए stdout रीडायरेक्ट करना चाहते हैं, तो आप कई समाधान है:।

  • बस ऐसा करने के लिए अपने आदेश पंक्ति का उपयोग करें। विंडोज़ शैली: node myfile.js > api.access.log
  • कंसोल ऑब्जेक्ट को अपनी ऑब्जेक्ट से बदलें। और आप कंसोल विधियों को फिर से लिख सकते हैं।
  • मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन यह अपनी खुद की धारा के साथ process.stdout को बदलने के लिए संभव हो सकता है (और आप जो कुछ भी इस के साथ चाहते हैं कर सकते हैं)
+0

धन्यवाद। आपका जवाब सहायक है। अभी के लिए मैंने console.log विधि को फिर से लिखने का फैसला किया है, लेकिन अधिक रचनात्मक समाधान खोजने की उम्मीद है। – Supervision

+0

हाँ मैं वास्तव में हैरान हूं कि आप एक त्रुटि के बिना एक लिखने पर पाइप को कॉल कर सकते हैं, उसके साथ क्या चल रहा है? –

+0

नोडज के अनुसार [आधिकारिक डॉक्टर] (https://nodejs.org/api/process.html#process_process_stdout) process.stdout एक डुप्लेक्स स्ट्रीम – Alex

15

मैं इस समस्या को निम्नलिखित तरीके से हल:

var access = fs.createWriteStream('/var/log/node/api.access.log'); 
process.stdout.write = process.stderr.write = access.write.bind(access); 

बेशक आप अगर चाहें तो स्टडआउट और स्टडर को भी अलग कर सकते हैं।

मैं भी दृढ़ता से ध्यान में न आया अपवाद को संभालने के लिए सिफारिश करेंगे:

  • process.stdout.write
  • process.stderr.write
  • :

    process.on('uncaughtException', function(err) { 
        console.error((err && err.stack) ? err.stack : err); 
    }); 
    

    यह निम्नलिखित स्थितियों को कवर किया जाएगा console.log

  • console.dir
  • console.error
  • someStream.pipe (प्रक्रिया।stdout);
  • नई त्रुटि फेंक दें ('क्रैश');
  • फेंक 'कभी ऐसा न करें';
  • अपरिभाषित फेंक;
+1

थके हुए रहें कि यदि आप 'process.stdout.write' को ओवरराइट कर रहे हैं तो आप कर सकते हैं अब कंसोल पर लिखना नहीं है। – richardpringle

+0

क्या 'uncaughtException' भाग उस लॉगिंग फ़ाइल में एक ही त्रुटि संदेश को डुप्लिकेट करने वाला नहीं है क्योंकि stderr को फ़ाइल में रीडायरेक्ट किया गया है? – user36476

+0

@ user36476 नहीं, क्योंकि नोड केवल उस संदेश को प्रिंट करता है यदि uncaughtException ईवेंट के लिए कोई श्रोता नहीं है। – user3173842

0

चेकआउट console.Console, सामान्य console की मूल कक्षा।

var myLogFileStream = fs.createWriteStream(pathToMyLogFile); 

var myConsole = new console.Console(myLogFileStream, myLogFileStream); 

आप कर सकते हैं तो आप का उपयोग myConsole.log, myConsole.error, myConsole.dir, आदि और अपनी फ़ाइल पर लिखते हैं।

तुम भी monkey patchprocess.stdout.write इस प्रकार कर सकते हैं के रूप में:

var fn = process.stdout.write; 

function write() { 
    fn.apply(process.stdout, arguments); 
    myLogFileStream.write.apply(myLogFileStream, arguments); 
} 

process.stdout.write = write; 

वहाँ भी एक फाइल करने के लिए stdout प्रवेश करने के लिए प्रेरणा के आधार पर console._stdout अधिलेखन के लिए अन्य विकल्प हैं।

संबंधित मुद्दे