একটি কমান্ডের আউটপুট একটি রিং-বাফারে সংরক্ষণ করুন


16

আমি একটি দীর্ঘ-চলমান কমান্ড পেয়েছি যা স্টডআউটে প্রচুর আউটপুট উত্পন্ন করে। আমি উদাহরণস্বরূপ, কেবলমাত্র শেষ তিন দিন বা শেষ গিবিবাইট (মাঝখানে রেখাগুলি কাটা এড়ানো) সংরক্ষণ করতে সক্ষম হব এবং যদি সম্ভব হয় তবে ফাইল মাইন্ডে 20 এমআইবি-র চেয়ে বেশি নয়। প্রতিটি ফাইল অংশের নাম সংখ্যাসূচক প্রত্যয় বা একটি টাইমস্ট্যাম্পের সাথে নামকরণ করা হচ্ছে।

কিছুটা এইরকম:

my-cmd | magic-command --output-file-template=my-cmd-%t \
                       --keep-bytes=1G \
                       --keep-time=3d \
                       --max-chunk-size=20M \
                       --compress=xz

লিখবেন:

my-cmd-2014-09-05T10:04:23Z

এটি যখন 20M এ পৌঁছায়, এটি এটি সংকোচিত করে একটি নতুন ফাইল খুলবে এবং এরকম কিছুক্ষণ পরে এটি পুরানো ফাইলগুলি মুছতে শুরু করবে।

এ জাতীয় আদেশ কি বিদ্যমান?

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


"গিবিবিট" কী?
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন উইকিপিডিয়া: গিবিবাইট
jw013

উত্তর:


6

আপনি পাইপলগের মাধ্যমে যা চান তা থেকে কিছু পেতে পারেন , যা "চলমান প্রক্রিয়াটির লগটিকে মধ্যবর্তী মাধ্যমে পাইপ দিয়ে ঘোরানো বা সাফ করার অনুমতি দেয় যা বাহ্যিক সংকেতগুলিতে সাড়া দেয়", যেমন:

spewstuff | pipelog spew.log -p /tmp/spewpipe.pid -x "gzip spew.log.1"

তারপরে আপনি পিডটি পেতে পারেন /tmp/spewpipe.pidএবং:

kill -s USR1 $(</tmp/spewpipe.pid)

তবে আপনাকে ক্রোন বা কিছু দিয়ে সেট আপ করতে হবে। তবে এটির একটি ধরা আছে। আমি লক্ষ্য করবো gzip spew.log.1- কারণ -xলগটি ঘোরার পরে কমান্ডটি কার্যকর করা হয়। সুতরাং আপনি spew.log.1.gzgzip করতে একটি ছোট স্ক্রিপ্ট না লিখে ফাইলটি পরে সরিয়ে না নিয়ে প্রতিবার ওভাররাইট করার আরও সমস্যা রয়েছে এবং -xকমান্ড হিসাবে এটি ব্যবহার করুন ।

সম্পূর্ণ প্রকাশ: আমি এটি লিখেছি তাই এটি অবশ্যই পুরোপুরি কার্যকর হয় । ;) আমি একটি সংকোচন বিকল্পটি মনে রাখব, বা এটির আরও সহজতর করার জন্য এমন কিছু সংস্করণ 0.2 এর জন্য (এর উদ্দেশ্যযুক্ত উদ্দেশ্যটি -xকিছুটা আলাদা তবে এটি উপরে হিসাবে কাজ করবে)। অটোমেটেড রোলওভারটিও একটি ভাল ধারণা ... প্রথম সংস্করণটি ইচ্ছাকৃতভাবে ন্যূনতম, কারণ প্রয়োজনীয় বৈশিষ্ট্যগুলি যুক্ত করার প্রলোভনটিকে আমি প্রতিহত করেছি (সর্বোপরি, এর জন্য ক্রোন জব স্থাপন করা এত কঠিন নয়)।

নোট করুন এটি পাঠ্য আউটপুট জন্য উদ্দেশ্যে ; যদি সম্ভাব্য নাল বাইট থাকে তবে আপনার ব্যবহার করা উচিত -z- যা শূন্যকে অন্য কিছু দিয়ে প্রতিস্থাপন করে। বাস্তবায়নকে সহজ করার জন্য এটি ছিল একটি বাণিজ্য।


ধন্যবাদ। আমি pipelog-0.3;-) অপেক্ষায় আছি আমি metacpan.org/release/File-Writ-Rotate জুড়ে এসেছি । নোট করুন ক্রোন জব ফাইলগুলি ফাইলের আকারের উপর ভিত্তি করে ঘোরানোর জন্য খুব বেশি সহায়তা করবে না।
স্টাফেন চেজেলাস

আকারের উপর ভিত্তি করে ঘোরানো হচ্ছে!?! এটি আউটপুটটিকে ফ্লাশ করে রাখে, যাতে আপনি ফাইলগুলি বিরতিতে স্থির করতে পারেন ...
স্বর্ণিলকস

আপনি আকারটি 20 এম এর নিচে রাখতে পারবেন না (যেমন আমার প্রশ্নের প্রয়োজনীয়তার হিসাবে) নির্ভরযোগ্যভাবে সেভাবে।
স্টাফেন চ্যাজেলাস

অন্য জিনিসটি হ'ল এটি কেবলমাত্র পাঠ্য (আমি এ সম্পর্কে একটি চূড়ান্ত অনুচ্ছেদ যুক্ত করেছি)।
স্বর্ণলোকস

4

ড্যান বার্নস্টেইনের মাল্টলগ স্পষ্টতই এটি করতে পারে - বা সম্ভবত এটির বেশিরভাগ ক্ষেত্রে ! ফাইল প্রসেসরের মাধ্যমে আউটলেট সরবরাহ করার সময় আপনার পছন্দমতো পার্থক্য তৈরি করতে - যদিও 20 এম / 1 জি আকারের স্পেসিফিকেশনগুলি 16 এম এর মতো বলে মনে হচ্ছে কিছুটা চূড়ান্ত হতে পারে লগ প্রতি সীমা বাইরে। নিম্নলিখিতটি কি, বেশিরভাগ ক্ষেত্রে, উপরের লিঙ্কটি থেকে একটি অনুলিপি + পেস্ট নির্বাচন, যদিও লিঙ্কটি অন্যান্য বিকল্পগুলির বিবরণ যেমন লাইন প্রতি টাইমস্ট্যাম্পিং, [একটি] অন্যান্য ফাইল [গুলি] কেবলমাত্র সাম্প্রতিক লাইনের সাথে মিলে যাওয়ার প্যাটার্ন এবং আরও অনেক কিছু রাখে details ।

ইন্টারফেস

 multilog script

... স্ক্রিপ্টে বহু সংখ্যক যুক্তি রয়েছে of প্রতিটি যুক্তি একটি ক্রিয়া নির্দিষ্ট করে। প্রতিটি ইনপুট লাইনের জন্য ক্রিয়াগুলি সম্পন্ন করা হয়।

লাইন নির্বাচন করা হচ্ছে

প্রতিটি লাইন প্রাথমিকভাবে নির্বাচিত হয়। কর্ম ...

-pattern

... প্যাটার্ন লাইনের সাথে মিলে গেলে রেখাকে অনির্বাচিত করে। কর্ম ...

+pattern

প্যাটার্ন লাইনের সাথে মিলে গেলে লাইনটি নির্বাচন করে ।

... প্যাটার্ন হ'ল তারা এবং অ-তারাগুলির একটি স্ট্রিং। এটি একই ক্রমে সমস্ত তারা এবং নন-তারকাদের সাথে মিলেছে যে কোনও স্ট্রিংয়ের সাথে মেলে। একটি নন-স্টার নিজেই মেলে। প্যাটার্ন শেষ হওয়ার আগে একটি তারা কোনও স্ট্রিংয়ের সাথে মেলে যা পরের অক্ষরটিতে নিদর্শন অন্তর্ভুক্ত করে না। প্যাটার্নের শেষে থাকা একটি তারা কোনও স্ট্রিংয়ের সাথে মেলে।

স্বয়ংক্রিয়ভাবে ঘোরানো লগ

দির যদি বিন্দু বা স্ল্যাশ দিয়ে শুরু হয় তবে ক্রিয়া ...

 dir

... প্রতিটি নির্বাচিত লাইন দির নামের লগে যুক্ত করে । তাহলে Dir বিদ্যমান নয়, multilogএটা সৃষ্টি করে।

লগ ফর্ম্যাটটি নিম্নরূপ:

  1. dir একটি ডিরেক্টরি যা এর ক্রিয়াকলাপের উপর নজর রাখার জন্য বেশ কয়েকটি পুরানো লগ ফাইল, কারেন্ট নামের একটি লগ ফাইল এবং অন্যান্য ফাইল multilogসমন্বিত।

  2. প্রতিটি পুরানো লগ ফাইলের একটি নাম @ দিয়ে শুরু হয় , ফাইলটি শেষ হওয়ার সময় একটি নির্দিষ্ট টাইমস্ট্যাম্প দিয়ে অবিরত থাকে এবং নিম্নলিখিত কোডগুলির মধ্যে একটি দিয়ে শেষ হয়:

    • .s : এই ফাইলটি সম্পূর্ণ প্রক্রিয়াজাত হয় এবং নিরাপদে ডিস্কে লিখিত হয়।
    • .u : এই ফাইলটি বিভ্রাটের মুহুর্তে তৈরি করা হয়েছিল। এটি কেটে গেছে। এটি প্রক্রিয়া করা হয়নি।

কর্ম ...

 ssize

... পরবর্তী dir ক্রিয়াগুলির জন্য সর্বাধিক ফাইলের আকার নির্ধারণ করে । multilogযে সিদ্ধান্ত নেবে বর্তমান বড় যথেষ্ট যদি বর্তমান হয়েছে আকার বাইট। ( multilogএটি আরও স্থির করবে যে এটি যদি সর্বাধিক ফাইলের আকারের 2000 বাইটের মধ্যে একটি নতুন লাইন দেখে; তবে লাইন সীমানায় লগ ফাইলগুলি শেষ করার চেষ্টা করে।) আকারটি 4096 এবং 16777215 এর মধ্যে হওয়া উচিত The ডিফল্ট সর্বাধিক ফাইলের আকার 99999।

সংস্করণ 0.75 এবং উপরোক্ত -এ: multilogএকটি গ্রহণ ALRM সংকেত তা অবিলম্বে সিদ্ধান্ত নেয় যে বর্তমান , বড় হলে যথেষ্ট বর্তমান nonempty হয়।

(দ্রষ্টব্য: আমি সন্দেহ করি যে zsh scheduleবিল্টিনগুলি ALRMপ্রয়োজনবোধে নির্দিষ্ট বিরতিতে সহজেই প্রেরণে প্ররোচিত হতে পারে ))

কর্ম ...

 nnum

... পরবর্তী dir ক্রিয়াগুলির জন্য লগ ফাইলের সংখ্যা নির্ধারণ করে । পুনঃনামকরনের পর বর্তমান , যদি multilogদেখেন NUM বা তার বেশি বয়সী লগ ফাইল, এটা ক্ষুদ্রতম টাইমস্ট্যাম্প সাথে সাক্ষাত করুন লগ ফাইল সরিয়ে ফেলা হয়। NUM হতে হবে 2. অন্তত লগ ফাইল এর ডিফল্ট সংখ্যা 10।

কর্ম ...

 !processor

... পরবর্তী dir ক্রিয়াগুলির জন্য একটি প্রসেসর সেট করে। multilogভোজন হবে বর্তমান মাধ্যমে প্রসেসর এবং পরিবর্তে একটি পুরানো লগ ফাইল হিসাবে আউটপুট সংরক্ষণ বর্তমানmultilogপ্রসেসর যে কোনও আউটপুটও ডেস্ক্রিপ্টর 5-এ লিখে রাখে এবং সেগুলি পরবর্তী লগ ফাইলে প্রসেসর চালিত হলে বিবরণকারী 4 এ আউটপুট পাঠযোগ্য করে তোলে। নির্ভরযোগ্যতার জন্য, প্রসেসরের অবশ্যই আউটপুট তৈরি করতে কোনও সমস্যা হলে ননজারো থেকে প্রস্থান করতে হবে; multilogতারপরে আবার এটি চালানো হবে। নোট করুন যে চলমান প্রসেসর এতে কোনও প্রোগ্রামের ফিডিং ইনপুটটিকে ব্লক করতে পারে multilog


2

কোডের বিশাল টুকরো লেখার সাথে জড়িত না এমন একটি সীমাবদ্ধতার হিসাবে আমি এ পর্যন্ত সেরাটি খুঁজে পেতে পারি zshcode

autoload zmv
mycmd |
  while head -c20M > mycmd.log && [ -s mycmd.log ]; do
    zmv -f '(mycmd.log)(|.(<->))(|.gz)(#qnOn)' '$1.$(($3+1))$4'
    {rm -f mycmd.log.1 mycmd.log.50.gz; (gzip&) > mycmd.log.1.gz} < mycmd.log.1
  done

এখানে বিভাজন এবং সর্বাধিক 51 20MiB বড় ফাইলগুলিতে ঘোরানো।


হতে পারে ... লুপমাউন্টস? btrfsএছাড়াও মাউন্ট করা যেতে পারে compress-force=zlib
মাইকজার্ভ

2

আপনি যা অনুরোধ করছেন তার মতো কিছু করার জন্য এখানে একটি হ্যাক-আপ অজগর স্ক্রিপ্ট রয়েছে:

#!/bin/sh
''':'
exec python "$0" "$@"
'''

KEEP = 10
MAX_SIZE = 1024 # bytes
LOG_BASE_NAME = 'log'

from sys import stdin
from subprocess import call

log_num = 0
log_size = 0
log_name = LOG_BASE_NAME + '.' + str(log_num)
log_fh = open(log_name, 'w', 1)

while True:
        line = stdin.readline()
        if len(line) == 0:
                log_fh.close()
                call(['gzip', '-f', log_name])
                break
        log_fh.write(line)
        log_size += len(line)
        if log_size >= MAX_SIZE:
                log_fh.close()
                call(['gzip', '-f', log_name])
                if log_num < KEEP:
                        log_num += 1
                else:
                        log_num = 0
                log_size = 0
                log_name = LOG_BASE_NAME + '.' + str(log_num)
                log_fh = open(log_name, 'w', 1)

1
সেখানে এটি একটি শেল স্ক্রিপ্ট যে হিসাবে আছে কি কোন কারণ আছে execপ্রথম জিনিস যেমন পাইথন ব্যবহার পরিবর্তে গুলি pythonবা env pythonhashbang?
পিটার্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.