Stdout রোটেশন লগ?


53

আমার কাছে একটি লিনাক্স প্রোগ্রাম রয়েছে যা স্টাডআউট এবং স্ট্ডারগুলিতে তথ্য লিখতে পারে।

আমার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা সেই আউটপুটটিকে কোনও ফাইলে পুনঃনির্দেশ করে /var/log। (মাধ্যমে >>এবং 2>&1।)

লগ ফাইলটি ঘোরানোর কোনও উপায় আছে কি? (সর্বাধিক আকার, তারপরে একটি আলাদা ফাইলে স্যুইচ করুন, কেবলমাত্র সীমিত সংখ্যক ফাইল রাখুন)

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


1
কেন আপনি কেবল স্ক্রিপ্টটি সংশোধন করতে পারবেন না যা ঘূর্ণনের জন্য যুক্তি যুক্ত করতে আউটপুটটিকে পুনর্নির্দেশ করে?
ম্যাক্লিওড

আমি পারতাম, যদি কেউ আমাকে বলতে পারে যে কীভাবে কোনও লগফিলের আকার সনাক্ত করতে পারি এবং সেই প্রক্রিয়াটি বিঘ্নিত না করে কোনও প্রক্রিয়াটির স্ট্যান্ডআউট থেকে আবর্তিত করতে পারি। আমি চাই না আছে ব্যবহার করতে logrotateএকটি ভালো বিকল্প, যে শুধু আলোচনার জন্য একটি সুবিধাজনক আদ্যস্থল মত ধুত যদি।
মিরাল

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

ঠিক আমার বক্তব্য। তাহলে কি চলমান প্রক্রিয়াটির পুনঃনির্দেশিত স্টাডআউট দিয়ে লোগ্রোটেটের কাজ করার কোনও উপায় আছে?
মিরাল

উত্তর:


44

বিকল্প হিসাবে, আপনি আকার-ক্যাপড, স্বয়ংক্রিয়ভাবে ঘোরানো, লগ ফাইল সেটগুলি বজায় রাখার প্রাথমিক উদ্দেশ্যে ডিজাইন করা সরঞ্জামগুলির মাধ্যমে আউটপুটটি পাইপ করতে পারেন:

  • ড্যান বার্নস্টেইনের multilogডিমনটোল থেকে
  • ব্রুস multilogগেন্টার এর ডিমনটোলস-এনকোর থেকে
  • এস s6-log6 থেকে লরেন্ট বারকোটের
  • Gerrit Pape, এর svlogdrunit থেকে
  • ওয়েইন মার্শাল tinylogহতাশ থেকে
  • নশcyclog থেকে আমার

তারপরে প্রক্রিয়া করার সরঞ্জামগুলির মধ্যে multilogফর্ম্যাট লগ ফাইল সেটগুলি অন্যদের মধ্যে অন্তর্ভুক্ত:

আরও পড়া


1
ধন্যবাদ, multilogআমার যা প্রয়োজন ঠিক তেমন দেখাচ্ছে।
মিরাল

মাল্টলোগটি ডিবিয়ানের একমাত্র প্লাগ-ও-প্লে সলিউশন বলে মনে হয় (ডেমোনটোলগুলির একটি অফিশিয়াল প্যাকেজ রয়েছে)। তবে আমার বিশেষ ক্ষেত্রে, যেখানে আমি লগগুলি ফ্যাট 32 পার্টিশনে সংরক্ষণ করতে চেয়েছিলাম, ঘূর্ণায়মান কাজ করে না, যেহেতু মাল্টলগ একটি সিমলিংক ব্যবহার করতে চায়। আমার জন্য কোনও প্লাগ এবং খেলুন :)
আরনআউট

এটি সত্য হতে পারে না, কারণ multilogকোথাও প্রতীকী লিঙ্ক তৈরি বা দাবি করা হয়নি demands এটি তাদের সম্মানের সাথে সম্পূর্ণ নিরপেক্ষ।
JdeBP

"এই শতাব্দীতে লোগ্রোটেট বা নিউজলাইগ ব্যবহার করবেন না" এর ইউআরএলটিতে অতিরিক্ত বিন্দু রয়েছে
দুয়ারে

15

rotatelogsApache সঙ্গে জাহাজে (ইন টুল binDir) (দেখুন ডক্স ) কিছু সময় নির্দিষ্ট পরিমাণ পরে লগ stdin এবং rotates থেকে ইনপুট নেয়


14

যদি আপনি এটি স্ট্যান্ডার্ড লগ স্ট্রিমগুলির একটিতে যেতে পারেন (সিসলগ, ডেমন, ক্রোন, ব্যবহারকারী, সুরক্ষা, মেল, ইত্যাদি) আপনি এর loggerপরিবর্তে কমান্ড এবং পাইপটি ব্যবহার করতে পারেন ।

echo "Hello." | logger -p daemon.info

অন্যথায়, আপনি আপনার লগ করা সামগ্রীটিকে হ্যান্ডল করার জন্য কোনও কাস্টম প্রোগ্রাম বা স্ক্রিপ্টে পাইপ করা থেকে ভাল হতে পারেন বা logrotateকনফিগারেশন সেটআপ করার দিকে তাকিয়ে থাকতে পারেন ।

সম্পাদনা: জেডিবিপি-র উত্তরটিতে আপনি যা খুঁজছেন তা মনে হচ্ছে।


2
সরলতার জন্য +1। বিটিডাব্লু, আপনি মানকগুলির পরিবর্তে একটি কাস্টম সুবিধা (লোকাল0) কনফিগার করতে পারেন (উদাহরণ হিসাবে ডেমমন)
রজার কীগুলি

14

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

কৌশলটি কেবল তখনই কাজ করে যদি " > " (তৈরি) এর পরিবর্তে " >> " (সংযোজন) দিয়ে পুনর্নির্দেশ করা হয় ।

কনফিগার ফাইল (truncate.cfg):

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

পরীক্ষা প্রোগ্রাম (কখনও ফাইল দেয় না)। আপনি এটি ডিস্ক ভরাট দেখতে পাচ্ছেন এবং লগফাইলে মোছা কাজ করতে দেখা দিলেও এটি ডিস্কের কোনও স্থান খালি করবে না:

cat /dev/urandom >> /tmp/temp.log

চলমান লগ ঘোরান:

logrotate truncate.cfg

এটি একটি দুর্দান্ত তত্ত্ব, তবে এটি চেষ্টা করে এমন কোনও সিস্টেমে এটি আসলে কাজ করে না। ফাইলটি আসলে কাটা হয় না এবং প্রোগ্রামটি এতে আগের মতো সংযোজন অবিরত করে। (এবং হ্যাঁ, এটি >> এর মাধ্যমে সম্পন্ন পুনঃনির্দেশের সাথেও রয়েছে () ((বিটিডাব্লু, ইতিমধ্যে এই উত্তরটি ইতিমধ্যে দেওয়া হয়েছিল)))
মিরাল

1
লোগ্রোটেটে আলোচিত হিসাবে আসল ফাইলটি ছিন্ন করা হবে না (আমাদের ইউনিক্স এবং লিনাক্স সাইটে)। এছাড়াও, echo /dev/urandom >> /tmp/temp.log13 টি ডিস্ট্রিমেন্টিক অক্ষর লিখবেন /tmp/temp.logএবং তারপরে অবিলম্বে প্রস্থান করুন। মানে cat /dev/urandom?
জি-ম্যান

2
সবেমাত্র এখানে পরীক্ষা করা হয়েছে এবং এটি কাজ করে বলে মনে হচ্ছে। ফাইলের সামগ্রীগুলি নতুন লগ ফাইলে অনুলিপি করা হয়। আসল ফাইলটি প্রক্রিয়া দ্বারা খোলা রাখা হয় এবং কেটে ফেলা হয় (আকার এখন 0 দেখায়)।
ফিলিপ

1
কপিরেন্টকাউন্টের সাথে সম্ভাব্য ডেটা হ্রাস সম্পর্কে সতর্কতা অবলম্বন করুন।
wanghq

1
+1 যদিও "নোট করুন যে ফাইলটি অনুলিপি করা এবং এটি কেটে ফেলার মধ্যে খুব অল্প সময়ের স্লাইস রয়েছে, যাতে কিছু লগিং ডেটা হারাতে পারে।"
তাগর

3

তাহলে কি চলমান প্রক্রিয়াটির পুনঃনির্দেশিত স্টাডআউট দিয়ে লোগ্রোটেটের কাজ করার কোনও উপায় আছে?

হ্যাঁ! লোগ্রোটেট দ্বারা প্রদত্ত "কপিরাইটঙ্কট" নির্দেশিকাটি দেখুন। লোগ্রোটেটকে এই পরিস্থিতিটি পরিচালনা করতে নির্দেশ করে তা নির্দিষ্ট করে: একটি সাধারণ প্রোগ্রাম যা তার লগ ফাইলটিকে অনির্দিষ্টকালের জন্য খোলা রাখে।

একটি সতর্কতা আপনার পরিস্থিতিতে সমস্যা হতে পারে বা নাও হতে পারে:

নোট করুন যে ফাইলটি অনুলিপি করা এবং এটি কেটে ফেলার মধ্যে খুব অল্প সময়ের স্লাইস রয়েছে, যাতে কিছু লগিং ডেটা হারিয়ে যেতে পারে।

উপাখ্যান্তভাবে, আমি কিছু "রিয়েল ওয়ার্ল্ড" লগ সোর্স দেখেছি যা ব্যবহারকারীদের এই নির্দেশকে প্রয়োগ করতে উত্সাহিত করে। এখানে এই বিকল্পের কিছু আলোচনা আছে


3

বিভক্ত ব্যবহার করুন, এটি কোরিউটিলের অংশ। এটি স্টিন নিতে এবং এটিকে খণ্ডগুলিতে বিভক্ত করতে পারে (খণ্ডের আকার বা লাইনগুলির সংখ্যা ইত্যাদির উপর ভিত্তি করে)।

উদাহরণ:

app | split --bytes 1G - /var/logs/put-prefix-here

নোট ড্যাশ (-) ফাইলের পরিবর্তে স্টিডিন ব্যবহার করতে "বিভক্ত" নির্দেশ দেয়।


কীভাবে এটি করা যায় তা বর্ণনা করতে আপনি নিজের উত্তরটি প্রসারিত করতে পারেন? ধন্যবাদ।
ফিক্সার 1234

সবেমাত্র উদাহরণ সহ আমার উত্তর আপডেট।
নজর

1 জি একটি নির্বিচার আকার, এর পরে এটি একটি নতুন ফাইল শুরু করে?
ফিক্সার 1234

1
এটি সমস্যার একটি নির্দিষ্ট দিক থেকে ভাল সমাধান নয় কারণ এর অর্থ আপনি একটি ফাইলের অর্ধেক বার্তা এবং পরের অর্ধেক অংশে শেষ করতে পারেন। splitএকটি বড় বাফার হতে পারে এমন ডেটা থাকলে মেশিনটি ক্রাশ হয়ে গেলে ডেটা ক্ষতির আশঙ্কাও রয়েছে। এমন একাধিক সরঞ্জাম রয়েছে যা এই সমস্যাটিকে সঠিকভাবে সমাধান করে, এই ধরণের রোল-আপনার নিজের সমাধানটি কোনও প্রস্তাবিত হতে পারে বলে আমি মনে করি না।
ডেভিড রিচার্বি

1
@ ডেভিড রিচার্বি- আনফার্ডার জন্য ইউ-কে যুক্ত করবেন?
নিক

3

আমি multilogআমার ব্যবহারের ক্ষেত্রে পছন্দ করি তবে আমার ব্যবহারের ক্ষেত্রে এতটাই তুচ্ছ / সহজ যে ডক্স / উদাহরণগুলিতে আমি খুঁজে পেয়েছি তা খুব সহজভাবে সাজানো হয়নি। এখানে একটি সাধারণ মাল্টলগ ঘোরানোর উদাহরণ রয়েছে:

mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1

কিছু নোট:

  • এই / tmp / myapp / ডিরেক্টরিতে লগগুলি ডাম্প করে
  • s10000 10,000 বাইট প্রতিনিধিত্ব করে *
  • n5 5 টি ফাইলকে প্রতিনিধিত্ব করে * 'বর্তমান' লগটি ফাইলগুলির মধ্যে একটি হিসাবে গণনা করে, তাই এতে 4 টি পুরানো লগ + 'বর্তমান' অন্তর্ভুক্ত রয়েছে
  • এটি ভিত্তিতে তৈরি করা হয়েছে, এখানে ফ্রান্সোইস বিউসোলিলের দেওয়া উদাহরণগুলি: http://blog.teksol.info/pages/daemontools/best-practices- এর দেওয়া উদাহরণগুলি থেকে অভিযোজিত
  • আমি অনেকগুলি বিকল্প বুঝতে পারি না - আমি আপনাকে প্রসারিত করার জন্য বিভিন্ন ডকুমেন্টেশনগুলিতে উল্লেখ করি ...
  • ডকস সতর্ক করে দেয়: "Note that running processor may block any program feeding input to multilog."যেখানে 'প্রসেসর' '!tai64nlocal'কমান্ডের অংশ

* অনেক অ্যাপ্লিকেশনগুলির জন্য, এগুলি দীর্ঘমেয়াদী ব্যবহারের জন্য পছন্দ নয়। তারা আপনাকে লগগুলি বড় লগের চেয়ে বেশি দ্রুত পূরণ এবং ঘোরানোর আচরণ পর্যবেক্ষণ করতে দেয়।

পরিশেষে, প্রয়োজন হলে nohup ভুলবেন না! Nohup সহ, আপনার 2>&1(s = 10e6 এবং n = 30 এখানে দরকার নেই):

mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &

এই আদেশটি আপনাকে শুরু করা উচিত।


1

আমি কেবল উপরের স্যাম হেন্ডলির মন্তব্যে যুক্ত করতে চেয়েছি:

কৌশলটি কেবল তখনই কাজ করে যদি (তৈরি) >>পরিবর্তে (সংযোজন) দিয়ে পুনঃনির্দেশ করা হয়ে থাকে >

আমি একই সমস্যার মধ্যে দৌড়েছি যেখানে আপনি >(তৈরি) ব্যবহার করেন তবে আসল ফাইলটি কেবল বাড়তে থাকে তবে আপনি যদি >>(সংযোজন) ব্যবহার করেন তবে লোগ্রোটেট কপিরাইটআরঙ্কেটটি সুন্দর এবং প্রত্যাশার মতো কাজ করে। মূল ফাইলটি শূন্য বাইটে ফিরে যায় এবং প্রোগ্রামটি লেখা চালিয়ে যায়।

ঘোরানো লগফাইলে STDOUT এবং STDERR পুনর্নির্দেশ:

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. /etc/logrotate.dআমার ক্ষেত্রে আউটপুট_ল যাই হোক না কেন, এর অধীনে লোগ্রোটেট কনফিগারেশন ফাইল তৈরি করুন ।

    আমার ক্ষেত্রে নমুনা কনফিগারেশন:

    /tmp/output.txt {
        notifempty
        missingok
        size 1G
        copytruncate
        start 0
        rotate 15
        compress
    }
    
  3. /etc/crontabফাইলের অভ্যন্তরে আপনার ক্রোন জব সেটআপ করুন

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
    

    এটি প্রতি মিনিটে ফাইলটি পরীক্ষা করবে। আপনি আপনার প্রয়োজন অনুসারে সামঞ্জস্য করতে পারেন।

  4. এটা শুরু করো:

    $> service crond restart
    
  5. এটাই

দ্রষ্টব্য: SELinux সেট করাতে SELINUX=enforcingআমারও সমস্যা ছিল তাই আমি এটি সেট করেছিলাম SELINUX=disabled


1

আমি এই সপ্তাহান্তে একটি লোগ্রোটি লিখেছি । আমি সম্ভবত জেডিবিপি-র দুর্দান্ত উত্তরটি এবং পড়তে পারি না multilog

আমি এটিকে হালকা ওজনযুক্ত এবং এর আউটপুট খণ্ডগুলি যেমন bzip2 করতে সক্ষম হয়ে ফোকাস করেছি:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

যদিও এখনও অনেক কিছু করা এবং পরীক্ষা করা দরকার।

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