रेल्स - रीडायरेक्टिंग कंसोल आउटपुट को एक फाइल में


81

बैश कंसोल पर, यदि मैं ऐसा करता हूं:

cd mydir
ls -l > mydir.txt

> ऑपरेटर मानक इनपुट को कैप्चर करता है और इसे एक फ़ाइल में रीडायरेक्ट करता है; इसलिए मुझे mydir.txtमानक आउटपुट के बजाय फाइलों की लिस्टिंग मिलती है ।

क्या रेल्स कंसोल पर कुछ ऐसा ही करने का कोई तरीका है?

मुझे एक रूखा बयान मिला है जो बहुत सारे प्रिंट (~ 8k लाइन्स) उत्पन्न करता है और मैं इसे पूरी तरह से देखने में सक्षम होना चाहता हूं, लेकिन कंसोल केवल अंतिम 1024 लाइनों या तो "याद" करता है। इसलिए मैंने एक फाइल पर पुनर्निर्देशन के बारे में सोचा - अगर किसी को एक बेहतर विकल्प पता है, तो मैं सभी कान हूं।

जवाबों:


107

आप $stdoutकंसोल आउटपुट को रीडायरेक्ट करने के लिए ओवरराइड का उपयोग कर सकते हैं :

$stdout = File.new('console.out', 'w')

आपको इसे एक बार भी कॉल करना पड़ सकता है:

$stdout.sync = true

यह फ़ाइल के सभी आउटपुट को रीडायरेक्ट करेगा। यदि आप आउटपुट को अस्थायी रूप से पुनर्निर्देशित करना चाहते हैं, तो सुनिश्चित करें कि आप मूल मूल्य को संग्रहीत करते हैं $stdoutताकि आप इसे वापस बदल सकें।


धन्यवाद! यही वह है जिसकी तलाश में मैं हूं।
किक्रेटो

2
यह मेरे लिए काम नहीं किया जब तक मैं जोड़ा $stdout.sync=true। संपादित।
पीटर डी वेज़

2
$stdout.reopen("my.log", "w")एक और अधिक सुंदर समाधान लगता है, इस पर देखा जाता है: stackoverflow.com/a/2480439/21217
dain

$stdout = File.new('console.out', 'w')वास्तव में बहुत समय लग रहा है। मैं खिड़कियों का उपयोग कर रहा हूं। निश्चित नहीं है कि क्या कारण है!
dhrubo_moy

138

एक त्वरित एक बंद समाधान:

irb:001> f = File.new('statements.xml', 'w')
irb:002> f << Account.find(1).statements.to_xml
irb:003> f.close

एक JSON स्थिरता बनाएँ:

irb:004> f = File.new(Rails.root + 'spec/fixtures/qbo/amy_cust.json', 'w')
irb:005> f << JSON.pretty_generate((q.get :customer, 1).as_json)
irb:006> f.close

इसने मुझे NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>या undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
मगें

5
फाइल statements.xmlसिस्टम में कहां सेव होती है। मुझे फ़ाइल नहीं मिली।
सुजीत

1
किसी अन्य मणि या प्लगइन को जोड़ने के लिए किसी को बताने के बजाय विशिष्ट रिकॉर्ड डंप को बचाने का तरीका दिखाने के लिए यह बेहतर उत्तर है (जब ज़रूरत न हो तो सॉफ़्टवेयर की सिफारिशों से थका हुआ) या फ़ाइल में कंसोल में सब कुछ डंप करना। वोट दिया।
bshea

@SujitS - फ़ाइल उस निर्देशिका में सहेजी जाती है जहाँ से आपने निष्पादित किया है rails console(सबसे अधिक संभावना है कि आपके ऐप की रूट निर्देशिका)। (कम से कम मेरे लिए यह मामला था।)
user664833

13

वीगर के जवाब के अलावा, इसे करने का एक और तरीका है जो कई अन्य अतिरिक्त विकल्प भी प्रदान करता है।

बस अपनी रेल परियोजना निर्देशिका खोलें और कमांड दर्ज करें:

rails c | tee output.txt

टी कमांड के पास कई अन्य विकल्प भी हैं जिन्हें आप नीचे देख सकते हैं:

man tee

1
यह मेरे लिए काम नहीं किया .. मैंने दौड़ने की कोशिश की rails server | tee file.txtऔर STDOUT या फ़ाइल के लिए कोई आउटपुट नहीं है। मुझे लगता है कि सर्वर इस मामले में शुरू करने में विफल रहता है।
kapad

सर्वर को लगता है कि मुझे लगता है कि वहाँ भी पुनर्निर्देशित करने के लिए टी कमांड में विकल्प होने चाहिए।
केविन

हां, कुछ ऐसा करें rails console 2>&1 | tee file.txt। टी में कोई विकल्प नहीं है, बस स्टडर के सिंपल रिडायरेक्शन को स्टडआउट करें ताकि दोनों आपकी फ़ाइल में समाप्त हों।
22

फ़ाइल कंसोल रंग कोड से भरा हुआ है। ppरंग कोड के बिना आउटपुट प्राप्त करने के लिए उपयोग करें ।
टिम एबेल

4

यदि आप अपनी पर्यावरण फ़ाइल में निम्न कोड लिखते हैं, तो यह काम करना चाहिए।

if "irb" == $0
  config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))
end

आप लॉग फ़ाइल का उपयोग करके भी घुमा सकते हैं

config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'), number_of_files, file_roation_size_threshold)

केवल सक्रिय रिकॉर्ड से संबंधित संचालन लॉग करने के लिए, आप कर सकते हैं

ActiveRecord::Base.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))

यह आपको अलग-अलग वातावरण के लिए अलग-अलग लॉगर कॉन्फिगर / फाइल भी देता है।


यह मददगार है, लेकिन दूसरा जवाब वह है जो मैं सरल तरीके से चाहता था। वैसे भी जवाब देने के लिए समय निकालने के लिए धन्यवाद।
किक्टो

3

हिर्ब का उपयोग करना, आप केवल हिर्ब आउटपुट को एक पाठ फ़ाइल में लॉग इन करना चुन सकते हैं। यह आपको अभी भी कंसोल विंडो में टाइप किए गए कमांड को देखने में सक्षम बनाता है, और बस मॉडल आउटपुट फ़ाइल में जाएगा।

हिर्ब फिर से :

हालाँकि डिफ़ॉल्ट रूप से विचारों को STDOUT में मुद्रित किया जाता है, उन्हें आसानी से कहीं भी लिखने के लिए संशोधित किया जा सकता है:

# Setup views to write to file 'console.log'.
>> Hirb::View.render_method = lambda {|output| File.open("console.log", 'w') {|f| f.write(output) } }

# Doesn't write to file because Symbol doesn't have a view and thus defaults to irb's echo mode.
>> :blah
=> :blah

# Go back to printing Hirb views to STDOUT.
>> Hirb::View.reset_render_method

इसके लिए धन्यवाद, वास्तव में मैं क्या देख रहा था!
संबोमी

2

हिर्ब का प्रयोग करें । यह स्वचालित रूप से irb में किसी भी आउटपुट को दिखाता है जो एक स्क्रीनफुल से अधिक लंबा है। इस कार्य को देखने के लिए इसे एक कंसोल सत्र में रखें:

>> require 'rubygems'
>> require 'hirb'
>> Hirb.enable

यह कैसे काम करता है, इसके बारे में अधिक जानने के लिए इस पोस्ट को पढ़ें


उत्तर देने के लिए धन्यवाद, लेकिन मैं पृष्ठन की तलाश में नहीं था; मैं सब कुछ एक ही पृष्ठ पर देखना चाहता था।
किकिटो

2

scriptयदि आप यूनिक्स-आधारित ओएस पर हैं, तो उपयोगिता का उपयोग करने का प्रयास करें ।

script -c "rails runner -e development lib/scripts/my_script.rb" report.txt

इससे मुझे रेल रनर स्क्रिप्ट की बहुत-बहुत लंबी आउटपुट आसानी से एक फ़ाइल पर कब्जा करने में मदद मिली।

मैंने एक फ़ाइल पर पुनर्निर्देशन का उपयोग करने की कोशिश की, लेकिन यह केवल स्क्रिप्ट के अंत में लिखा गया।

इससे मुझे कोई मदद नहीं मिली क्योंकि मेरी स्क्रिप्ट में कुछ इंटरेक्टिव कमांड थे।

तब मैंने बस का उपयोग किया scriptऔर फिर rails runnerस्क्रिप्ट सत्र में भाग गया लेकिन यह सब कुछ नहीं लिखा। तब मुझे यह मिला script -c "runner command here" output_fileऔर इसने सभी आउटपुट को बचा लिया जैसा कि वांछित था। यह Ubuntu 14.04 LTS पर था

संदर्भ:

/ubuntu/290322/how-to-get-and-copy-a-too-long-output-completely-in-terminal#comment1668695_715798

पाठ फ़ाइल में रूबी कंसोल आउटपुट लिखना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.