পোস্টগ্রিএসকিউএল কোয়েরিগুলি লগ কিভাবে করবেন?


371

পোস্টগ্র্রেএসকিউএল 8.3 দ্বারা কার্যকর করা সমস্ত এসকিউএল লগিং সক্ষম করবেন কীভাবে?

সম্পাদিত (আরও তথ্য) আমি এই লাইনগুলি পরিবর্তন করেছি:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

এবং পোস্টগ্রেএসকিউএল পরিষেবা পুনরায় চালু করুন ... তবে কোনও লগ তৈরি করা হয়নি ... আমি উইন্ডোজ সার্ভার 2003 ব্যবহার করছি।

কোন ধারনা?


15
এটি গুরুত্বপূর্ণ:logging_collector = on
বনিইই

এছাড়াও, সাবধান করুন যে কিছু জিএনইউ / লিনাক্স বিতরণে (যেমন ডিবিয়ান জেসি) systemctl restart postgresqlআপনার কনফিগার করা পোস্টগ্রিএসকিউএল পরিষেবাটি পুনরায় আরম্ভ করতে না পারে (কেন এখনও তা বুঝতে পারছি না), সুতরাং কনফিগারেশন ফাইলটিতে পরিবর্তনগুলি প্রয়োগ করা হবে না। এটি ব্যবহার করা নিরাপদ pg_ctl(বা pg_ctlclusterদেবিয়ানতে)।
স্কিপি লে গ্র্যান্ড গৌরো

4
আমি শুধু উবুন্টু 16,04 LTS এ এই পরীক্ষিত, পোস্টগ্রি 9.5 সঙ্গে, এবং systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadএবং service postgresql restartসমস্ত কনফিগারেশন কার্যকর পরিবর্তন রেন্ডার।
বেন জনসন

উত্তর:


464

আপনার data/postgresql.conf ফাইলে, log_statementসেটিংসটি এতে পরিবর্তন করুন 'all'


সম্পাদন করা

আপনার নতুন তথ্যটি দেখে, আমি বলব যাচাই করার জন্য আরও কয়েকটি সেটিংস থাকতে পারে:

  • আপনি চালু করেছেন তা নিশ্চিত করুন log_destination ভেরিয়েবল
  • আপনি চালু আছে তা নিশ্চিত করুন logging_collector
  • এছাড়াও নিশ্চিত যে log_directoryনির্দেশিকা ইতিমধ্যেই ভিতরে বিদ্যমান dataডিরেক্টরি, এবং postgres ব্যবহারকারী এটিকে লিখতে পারেন।

3
তাই কেবল কৌতূহল, এর মানে কি এই যে পোস্টগ্র্রেএসকিউএল আমি সার্ভারটি পুনরায় চালু না করে লগিং সক্ষম করতে পারি না? মাইএসকিউএলে এটি "এসইটি গ্লোবাল জেনারেল_লগ = 'চালু' এর মতোই সহজ;"
অ্যান্টনি

7
আমি নিজেই জানি না যে মাইএসকিউএল এর মতো এসকিউএল স্টেটমেন্ট ব্যবহার করে এটি করার কোনও উপায় আছে কিনা তবে আপনি কোনও চলমান সার্ভারকে pg_ctl reload
কনফিগারটি

9
পোস্টগ্রিএসকিউএল এর এসকিউএল স্টেটমেন্টের মাধ্যমে এখনও তার পরামিতিগুলি পরিবর্তন করার উপায় নেই (9.2 হিসাবে)। সর্বাধিক লগিং প্যারামিটারগুলি সম্পূর্ণ সার্ভার পুনরায় চালু না করে পরিবর্তিত করা যেতে পারে কেবল পরিবর্তে pg_ctl পুনরায় লোড করে। তবে লগিং_কলেক্টর পরিবর্তন করতে এটি পুনরায় চালু করতে লাগে।
গ্রেগ স্মিথ

6
Postgres 9.4 এবং নতুন ALTER SYSTEMকমান্ডের সাহায্যে একটি সুপারভাইজার এসকিউএল থেকে জিইউসি প্যারাম সেট করতে পারে।
এরউইন ব্র্যান্ডস্টেটর

6
dataডিরেক্টরি উত্তরে উদাহৃত তার আক্ষরিক নাম নয়; এটি data_directoryPostgreSQL কনফিগারেশন ফাইলের ভেরিয়েবলের জন্য নির্ধারিত পথটিকে বোঝায় refers ডেবিয়ান এবং উবুন্টু জিএনইউ / লিনাক্সে, এই ফাইলটি সাধারণত থাকে /etc/postgresql/$v/main/postgresql.confযেখানে $vসার্ভার সংস্করণ থাকে। এছাড়াও, পূর্বোক্ত সিস্টেমগুলিতে, কখন log_destination = 'stderr', আউটপুটটি লিখিত হয় /var/log/postgresql/postgresql-$v-main.log, $vসার্ভার সংস্করণটি কোথায় (কোনও জায়গার ভিতরে নেই data_directory)।
বেন জনসন

103

আপনার সম্পাদনা করুন /etc/postgresql/9.3/main/postgresql.confএবং নীচে লাইনগুলি পরিবর্তন করুন।

দ্রষ্টব্য : যদি আপনি postgresql.confফাইলটি খুঁজে না পান তবে কেবলমাত্র $locate postgresql.confএকটি টার্মিনাল টাইপ করুন

  1. #log_directory = 'pg_log' প্রতি log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' প্রতি log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' প্রতি log_statement = 'all'

  4. #logging_collector = off প্রতি logging_collector = on

  5. Ptionচ্ছিক :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart অথবা sudo service postgresql restart

  7. পোস্টগ্রেস্কলগুলিতে ফায়ার ক্যোয়ারী select 2+2

  8. বর্তমান লগ ইন সন্ধান করুন /var/lib/pgsql/9.2/data/pg_log/

লগ ফাইলগুলি একটি সময়ের সাথে অনেক বেড়ে যায় এবং আপনার মেশিনকে হত্যা করতে পারে। আপনার সুরক্ষার জন্য, একটি বাশ স্ক্রিপ্ট লিখুন যা লগগুলি মুছে ফেলবে এবং পোস্টগ্র্যাসকিএল সার্ভার পুনরায় চালু করবে।

ধন্যবাদ @ পল, @ জারেট হার্ডি, @ জোল্টন, @ রিক্স বেক, @ লাতিফ প্রিমণি


2
ডিবিয়ান প্রসারিত সময়ে, আমাকে # log_destination = 'stderr'এই কাজ করার আগে কনফিগারেশন ফাইলেও অসুবিধে করতে হয়েছিল।
ফিহাগ

আমি আপনার পদক্ষেপটি সাবধানে অনুসরণ করেছি এবং এটি কার্যকর হয় না। এটি আবার চালু করার দরকার আছে?
Yohanes এআই

2
আপনি যদি কোনও বাশ স্ক্রিপ্ট লিখতে না চান তবে লগগুলি কেবল মাসিক ওভাররাইট করতে চান: log_filename = 'postgresql-%d.log'এবং এটি প্রতিটি পুনঃসূচনা হওয়ার পরে ওভাররাইট হবে না, এটি প্রতিটি দিনের জন্য সংযোজন করা হবে এবং প্রতি মাসে ওভাররাইট হবে। অবশ্যই 28,29,30,31 মাসের উপর নির্ভর করে বিভিন্ন দিন রয়েছে - তবে আপনি ধারণাটি পাবেন।
sojim2

44
SELECT set_config('log_statement', 'all', true);

কোনও সংশ্লিষ্ট ব্যবহারকারীর সাথে ডান সংযোগের পরে উপরের ক্যোয়ারীটি ব্যবহার করতে পারে। এটি সেশন শেষ না হওয়া পর্যন্ত লগিংয়ের উপর প্রভাব ফেলবে।


7
সাধারণভাবে ব্যবহারের ক্লিনার এর SET log_statement = 'all'(লেনদেনের স্তরের জন্য) অথবা SET LOCAL log_statement = 'all'। আপনি সেটিংস client_min_messagesএবং log_min_messagesসেটিংসেও আগ্রহী হতে পারেন ।
ক্রেগ রিঞ্জার

1
এটি দুর্দান্ত, যেহেতু আমি আমার সংযোগের বার্তাগুলি লগ করতে চাই। দুর্ভাগ্যক্রমে আমি পেয়েছি: permission denied to set parameter "log_statement"যেহেতু আমার ব্যবহারকারীর সুপারভাইজার নেই।
গেটলি

3
আপনি ডিবি প্রশাসকের কাছে এই ক্রিয়াকলাপটি কার্যকর করার জন্য অনুদানের জন্য জিজ্ঞাসা করতে পারেন। GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
রিক্স বেক

35

আপনার পোস্টগ্র্রেএসকিউএলএ এই লাইনগুলি যুক্ত করতে হবে এবং সার্ভারটি পুনরায় চালু করতে হবে:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
লগিং_ক্লোলেক্টর = অন প্রয়োজনীয়
wjin

একটি যাদুমন্ত্র মত কাজ করে. কনফিগার ফাইলে মন্তব্য করে আমি বিভ্রান্ত হয়ে পড়েছিলাম Required to be on for csvlogs, এই বিকল্পটি ভেবেছিলাম কোয়েরি আউটপুটটি লগইন করা হয়েছিল এবং কেবল বিবৃতি নয়, তবে ঘটনাটি নয়।
জ্যাকোফার

আপনার ডেটা / postgresql.conf ফাইলে লগ_স্টেটমেন্ট সেটিংটি 'সব' তে পরিবর্তন করুন।
ফ্ল্যাভিভিভি

31

এফওয়াইআই: অন্যান্য সমাধানগুলি কেবলমাত্র ডিফল্ট ডেটাবেস থেকে বিবৃতিগুলি লগ করবে - সাধারণত postgresঅন্যদের লগ করতে; তাদের সমাধান দিয়ে শুরু; তারপর:

ALTER DATABASE your_database_name
SET log_statement = 'all';

রেফ: https://serverfault.com/a/376888 /log_statement



20

উপরের উত্তরগুলি +1। আমি নিম্নলিখিত কনফিগার ব্যবহার

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

10

এই ওয়েব পৃষ্ঠায় প্রাপ্ত নির্দেশাবলীর উপর ভিত্তি করে পোস্টগ্র্রেএসকিউএল 9.2 চালানো সেন্টোস 6.4 (রেড হ্যাট 4.4.7-3) এর জন্য আরও বিশদ থাকতে হবে :

  1. সেট (অকার্যকর) log_statement = 'all'এবং log_min_error_statement = errorইন /var/lib/pgsql/9.2/data/postgresql.conf
  2. PostgreSQL কনফিগারেশনটি পুনরায় লোড করুন। আমার জন্য, এটি দৌড় দিয়েই করা হয়েছিল /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/
  3. আজকের লগ ইন সন্ধান করুন /var/lib/pgsql/9.2/data/pg_log/

4
আপনাকে পুনঃসূচনা করার দরকার নেই - pg_ctl reloadএ যথেষ্ট, এবং সংযোগগুলিতে বাধা দেয় না। এই উত্তরটি ইতিমধ্যে এখানে যারা কিছু যুক্ত করে বিশ্বাস করে না।
ক্রেগ রিঞ্জার

1
@ ক্রেইগ্রিঞ্জার মন্তব্যটির জন্য ধন্যবাদ, এটি একটি গুরুত্বপূর্ণ বিষয়। আমি আপনার পরামর্শটি চেষ্টা করার পরে উত্তরটি আপডেট করব। আমি এই উত্তরটি প্রাথমিকভাবে নিজের জন্য রেফারেন্সের জন্য লিখেছিলাম, কারণ ইউএনআইএক্সের সাথে আমার খুব কম অভিজ্ঞতা ছিল, এবং আমি চাইতাম যে সমস্ত প্রয়োজনীয় তথ্য এক জায়গায় (যেমন postgresql.conf এবং লগ ফাইলগুলির অবস্থানগুলি) রয়েছে।
জোল্টন

0

প্রতিটি বিবৃতি লগ করতে আপনার এই পরামিতিটি সেট করা উচিত:

log_min_duration_statement = 0

0

আমি সেট করার চেষ্টা করছিলাম log_statement কিছু পোস্টগ্র্যাগ কনফিগারেশন ফাইলটিতে কিন্তু আসলে ফাইলটি আমাদের পোস্টগ্রাগস দ্বারা পড়া হয়নি।

আমি নিশ্চিত হয়েছি যে অনুরোধটি ব্যবহার করে:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

আমি এইভাবে https://stackoverflow.com/a/41912295/2294168 ব্যবহার করি

command: postgres -c config_file=/etc/postgresql.conf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.