আউটপুট প্রবাহে কীভাবে বিজ্ঞপ্তি পাবেন?


20

আমার ফাংশনগুলিতে ডিবাগিং বার্তা রয়েছে। এই বার্তা মত উত্থাপিত হয়

RAISE NOTICE 'Value of id : %', id;

আমি আমার লগ ফাইলটি সেট করে দিয়েছি \o messages.txt

তারপরে আমার যা করার দরকার তা আমি করি \i process.sql

এবং মৃত্যুদন্ড কার্যকর হলে \o,।

সমস্যাটি হ'ল আমার কাছে নোটিশ বার্তাগুলি.টেক্সটে উত্থাপিত বার্তা নেই। বার্তাগুলি স্ক্রিনে প্রদর্শিত হয় তবে আমি তাদের বার্তাগুলি লিখতে চাই

আমি এটা কিভাবে করতে পারি?

আমি চেষ্টা করার চেষ্টা করেছি RAISE LOG...এবং বার্তাগুলি লগ ফাইলে লেখা আছে ... এটি আমি চাই না।

আমার প্রায় কাজ আছে

plsql -f /path/to/process.sql > messages.txt 2>&1

তবে আমি জানতে চাই যে আমি কীভাবে পিএলএসকিএল ক্লায়েন্টে \ i এবং \ o ব্যবহার করতে পারলাম the o তে নির্দিষ্ট করা ফাইলটিতে বার্তা রয়েছে

সাইগউইনে আমার ক্লায়েন্টটি পিএসকিএল (পোস্টগ্রিএসকিউএল) 8.2.11 এবং সার্ভার সংস্করণটি 9.0.7


1
আপনার সমস্যার কারণ না হয়েও, পিজি 9.0 এর বিপরীতে পিএসকিএল 8.2 ব্যবহার করা আপনাকে সিস্টেমের সমস্ত ক্যাটালগ স্কিমা পরিবর্তন এবং নতুন সার্ভার বৈশিষ্ট্যগুলির কারণে সমস্ত ধরণের শোকের কারণ হতে পারে। আপনি যদি অদ্ভুত বা অপ্রত্যাশিত সমস্যাগুলির মুখোমুখি হন তবে psql 9.x দিয়ে চেষ্টা করুন।
ক্রেগ রিঞ্জার

@ ক্রেইগ্রিঞ্জার সমস্যাটি হ'ল সাইগউইনের জন্য ক্লায়েন্টের পিএসকিএল পাওয়া যায় না। কমপক্ষে সর্বশেষবার আমি সাইগউইনে ক্লায়েন্টটিকে আপগ্রেড করার চেষ্টা করেছি। আমি function d কার্যকারিতাটি ব্যবহার করতে পারি না তবে সমস্ত কিছু ঠিক আছে বলে মনে হচ্ছে।
লুক এম

@ ক্রেইগ্রিঞ্জার জানেন না যে ক্লায়েন্টটি আর সমর্থিত নয়। ধন্যবাদ।
লুক এম

আমি কেবল এটি দ্বিগুণ পরীক্ষা করে দেখেছি; আমি ভেবেছিলাম সাইগউইন অসমর্থিত এবং আমি যুগে যুগে কেউ এটি ব্যবহার করার কথা শুনিনি, তবে দেখে মনে হচ্ছে লোকেরা এখনও বিল্ডফর্মে পোস্টগ্র্রেএসকিউএল 9.2 বিটা তৈরি করছে ; দেখতে brolga । এটার কাজ করা উচিত. আপনি যদি বর্তমান পিজি চান তবে আপনাকে সম্ভবত উত্স থেকে সংকলন করতে হবে, এটি কেবল বাইনারি সাইগউইন প্যাকেজগুলি হবে যা অবিস্মরণীয়। ভবিষ্যতের কোনও বিভ্রান্তি এড়াতে আমি সেই মন্তব্যটি মুছব।
ক্রেগ রিঞ্জার

যদিও প্রশ্নটি রয়ে গেছে: সাইগউইন কেন ব্যবহার করবেন psql? libpqআমি বুঝতে পারলাম আপনার কাছে বহনযোগ্য সফ্টওয়্যার রয়েছে যা সাইগউইনে চালিত করতে হবে, তবে psqlউইন্ডোজ যখন স্থানীয়ভাবে পাওয়া যায় তখন সাইগউইনে একটি প্রাচীন সংস্করণ চালানোর আবেদন কী?
ক্রেগ রিঞ্জার

উত্তর:


8

আমি ভয় করি যে আপনি এই উত্তরটি পছন্দ করবেন না তবে বর্তমানে এটি অসম্ভব বলে মনে হচ্ছে। থেকে psql ডকুমেন্টেশন :

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

"অনুসন্ধানের ফলাফলগুলিতে" সমস্ত টেবিল, কমান্ড প্রতিক্রিয়া এবং ডাটাবেস সার্ভার থেকে প্রাপ্ত নোটিশগুলি পাশাপাশি বিভিন্ন ব্যাকস্ল্যাশ কমান্ডের আউটপুট যা ডাটাবেসকে জিজ্ঞাসা করে (যেমন \ d), তবে ত্রুটি বার্তা নয়।

এবং যেমন আপনি লক্ষ্য করেছেন, psqlইন্টারেক্টিভভাবে ব্যবহার করার সময় ত্রুটি বার্তাগুলি পুনর্নির্দেশ করার কোনও উপায় নেই ।

(আমি kinds o থেকে কোনও রকমের লাভ না করে সমস্ত ধরণের পুনর্নির্দেশের সাথে ঘুরে বেড়াচ্ছি It মনে হচ্ছে ক্যোয়ারী আউটপুট চ্যানেলটি ত্রুটি বার্তাগুলি প্রাপ্ত হওয়ার চেয়ে আলাদা - এবং সার্ভারের ত্রুটিগুলিও এবং আপনার পদ্ধতিতে উত্থাপিত বিভিন্ন উপায়ে যায়) ।

test=# SHOW client_min_messages;
 client_min_messages
---------------------
 notice

-- added the above to show it's not a config problem

CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
    RAISE NOTICE 'notice';
    RETURN 1;
END;
$body$
LANGUAGE plpgsql;

test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE:  notice

test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE:  notice

out.sql থাকে

 raise_test
------------
          1
(1 row)

উভয় ক্ষেত্রেই. এই কারণেই কোনও প্রক্রিয়া থেকে উত্থাপিত বার্তাগুলি আউটপুট দেওয়ার জন্য কী চ্যানেল / ফাইল বর্ণনাকারী ব্যবহার করা হয় সে সম্পর্কে আমি নির্লিপ্ত))

(পোস্টগ্রিসএসকিউএল-হ্যাকারগুলির উপর একটি থ্রেড রয়েছে যা এই সমস্যাটিতে কিছুটা আলোকপাত করতে পারে: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

কি এক সম্ভবত কাজ করতে পারে শুরু হয়েছে psqlমত

psql test >/tmp/psql.out 2>&1

এবং এটি নির্দিষ্ট ফাইলে সমস্ত আউটপুট পুনর্নির্দেশ করবে। এটির সাথে একমাত্র সমস্যা আপনার প্রম্পট এমনকি নেই এবং কমান্ডলাইন সম্পাদনা ক্ষমতা হারাবেন।


1
না, আপনার উত্তরটি আমি পছন্দ করি না। :-)
লুক এম

চ্যানেল / ফাইল বর্ণনাকারী একটি প্রক্রিয়া থেকে উত্থাপিত বার্তা আউটপুট জন্য ব্যবহৃত হয় : এটি স্ট্যান্ডার্ড ত্রুটি। এর একটি নয় বরং \o | cat > out.sql 2>&1এর মানক ত্রুটিটি পুনর্নির্দেশ করে , সুতরাং এটি বিজ্ঞপ্তিগুলির জন্য কোনও কার্যকরী catনয় psql
ড্যানিয়েল ভ্যারিট

@ ডিজেসো, কীভাবে পিজিএডমিন বা অন্য কোনও জিইউআই সরঞ্জাম NOTICEতথ্য প্রদর্শন করে ?
স্পাইক

@ স্পাইক তারা শীর্ষে নেই psql, তাই সম্ভবত কোনও সমস্যা ছাড়াই।
dezso

@ ডেসো, হ্যাঁ আমি এটি পেয়েছি। আমার মতো একটি ইস্যু পেয়েছি, আমি আমার সেশনের মধ্যে সেট client_min_messageকরে debugরেখেছি এবং ( DO- কোনও ফাংশন তৈরি না করে) কিছু গতিশীল স্কেলগুলি চালিয়েছি , এটি পিএসএকএল দিয়ে নয় পিজিএডমিনে নোটিশ উত্থাপন করে। আমি বিবৃতিটি client_min_messageকার্যকর করার আগে মানটি মুদ্রণ করেছি DO। এটি দেখায় debug, তবে বার্তাটি কনসোলে মুদ্রণ করছে না।
স্পাইক

2

আমরা \!মেটা কমান্ড ব্যবহার করে সরাসরি পিএসকিএল থেকে শেল কমান্ড কার্যকর করতে পারি ।

লোকালহোস্ট: 5432 ব্যবহারকারী @ ডিবি = # \! পিএসকিএল-ইউ ব্যবহারকারী -h লোকাল হোস্ট করুন আপনার_ডাটাবেস - তিনি 'আপনার_ফাংশন_নাম ()'> ডিবাগ.টিএসটি 2> & 1 নির্বাচন করুন

খুলতে debug.txtসঙ্গে \e

লোকালহোস্ট: 5432 ব্যবহারকারী @ ডিবি = # \ ই ডিবাগ.টেক্সট

বার্তা বাড়াতে আপনার ডিফল্ট সম্পাদকে প্রদর্শিত হবে। কিছুটা জটিল, কমান্ডলাইন প্রেমিকের জন্য এখনও বেশ কার্যকর।


0

মূল প্রশ্নের সমাধান নয়, বরং ওপি-র কার্যবিধির সংযোজন (যা আমার পক্ষে কার্যকর হয়নি)


উত্থাপনের জন্য নিম্নলিখিতটি। Sql

BEGIN;

CREATE FUNCTION count_to_hundred() RETURNS VOID AS
$_$
BEGIN
    FOR i IN 1..100 
    LOOP
        RAISE NOTICE '%', i;
    END LOOP;

    RETURN;
END;
$_$
LANGUAGE plpgsql;


SELECT count_to_hundred();

ROLLBACK;



আমি নিশ্চিত নই, কেন ওপিতে উল্লিখিত ফাইলে আউটপুট লেখার কাজটি কার্যকর হয় না, তবে এটি টিতে পাইপ দেওয়া আসলে কাজ করে:

psql -f raiseTest.sql 2>&1 | tee messages.txt


টি স্টিনকে এক বা একাধিক ফাইলে এবং স্ট্যাডআউটে ফিরে আসে। সুতরাং আপনার কনসোল এবং আপনার সরবরাহ করা ফাইল (গুলি) -এ সমস্ত রাইস স্টেটমেন্ট থাকবে। (সিএফ। টি ম্যান পৃষ্ঠা )


কনফিগারেশন:

  • পোস্টগ্রিজ 8.4
  • সাইগউইন ২.০.২
  • টি 8.23

প্রশ্নটি NOTICEআপনি যখন ইন্টারেক্টিভ অধিবেশন এবং ব্যবহার করার সময় বার্তাটি উত্থাপন করার বিষয়ে ছিল\o
লস এম

ওহ, আপনি ঠিক সেখানে আছেন। আমি সেই অংশটি পুরোপুরি মিস করেছি, যেহেতু ওপিতে কাজটি আমার পক্ষে কাজ করে না এবং আমি কেবল এটিতে মনোনিবেশ করি।
ফাদার স্ট্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.