কিভাবে লগ ফাইলের আকার সীমাবদ্ধ করবেন


24

>>200MB দিয়ে লেখা লগ ফাইলের আকারটি আমি কীভাবে সীমাবদ্ধ করতে পারি ?

$ run_program >> myprogram.log

1
আপনি কি 200 এমবি পরে প্রোগ্রামটি হত্যা করতে চান? অথবা আপনি কি বিট বালতিতে পুরানো সবকিছু সহ শেষ 200 এমবি চান?
অ্যারন ডি মারাকো

হ্যাঁ, ম্যানুয়ালি হত্যা না হওয়া পর্যন্ত প্রক্রিয়াটি থামতে পারে না
ডেভিড

লোগ্রোটেটে যাওয়ার সিদ্ধান্ত নিয়েছে, মূল্যবান ইনপুটগুলির জন্য প্রত্যেককে ধন্যবাদ
ডেভিড

উত্তর:


9

যদি আপনার অ্যাপ্লিকেশন (যেমন। run_program) লগ ফাইলের আকার সীমাবদ্ধ করতে সমর্থন না করে তবে আপনি বাহ্যিক অ্যাপ্লিকেশন বা স্ক্রিপ্টের সাহায্যে একটি লুপে পর্যায়ক্রমে ফাইলের আকার পরীক্ষা করতে পারেন।

আপনি logrotate(8)আপনার লগগুলি ঘোরানোর জন্যও এটি ব্যবহার করতে পারেন , এতে sizeপ্যারামিটার রয়েছে যা আপনি আপনার উদ্দেশ্যে ব্যবহার করতে পারেন:

এটির সাহায্যে, নির্দিষ্ট আকারটি পৌঁছে গেলে লগ ফাইলটি ঘোরানো হয়। আকার বাইটস (ডিফল্ট), কিলোবাইট (সাইজক), বা মেগাবাইটে (মাপ) নির্দিষ্ট করা যেতে পারে।


1
বারবার তথ্য সহ +1 লগফাইলগুলি প্রায়শই আকারের ক্রমগুলি সংকুচিত হতে পারে।
ব্যবহারকারী অজানা

লোগ্রোটেটে ফাইলগুলি ছাঁটাই করে, বা কেবল অনুলিপি করে বা সরানো হয়? কারণ এটি তখনই কাজ করবে যদি fd এর সাথে যুক্ত ফাইলটি কেটে ফেলা হয়। যদি এটি এমভি'ডি করা হয় তবে ফাইলটি বাড়তে থাকবে, যদি এটি লিঙ্কমুক্ত করা হয়, প্রক্রিয়াটি শেষ না হওয়া অবধি এটি কেবল উন্মুক্ত থাকবে এবং বাড়তে থাকবে ... আইআইআরসি লোগ্রোটেট অনুলিপিগুলি, লিঙ্কমুক্ত করা এবং একটি নতুন ফাইল তৈরি করে না, এ কারণেই যখন তাদের লগগুলি ঘোরানো হয় তখনই একজনকে প্রায়শই ড্যামনে সাইনআপ পাঠাতে হয়।
মাইকেল ট্র্যাশ

নোট করুন এটি কেটে ফেলা হলেও ফাইলটি অ্যাপেনড মোডে না খোলার সমস্যা রয়েছে (লগ ফাইলগুলি সর্বদা
অ্যাপেন্ড

লোগ্রোটেট ফাইলটি কোনও নির্দিষ্ট আকারে, দৈনিক, সাপ্তাহিক ইত্যাদিতে পৌঁছে গেলে এটি ঘোরানো যায় এবং এটি সংকোচন postscriptকরতে পারে এবং লোগ্রোটেট কনফিগারেশনটি SIGHUPপ্রোগ্রামে প্রেরণ করার জন্য বিকল্পটি ব্যবহার করতে পারেন ।
লেবেশাদে

12

যদি আপনার প্রোগ্রামে এই সীমাটির চেয়ে বড় আরও কোনও ফাইল লেখার প্রয়োজন না হয় তবে আপনি এই সীমাটির কার্নেলটি ব্যবহার করে অবহিত করতে পারেন ulimit। আপনি আপনার কমান্ড চালানোর আগে আপনার বর্তমান শেল সেশনে চলমান সমস্ত প্রক্রিয়াটির জন্য 200MB ফাইলের আকারের সীমা সেটআপ করতে এটি চালান:

ulimit -f $((200*1024))

এটি আপনার সিস্টেমকে সুরক্ষিত করবে তবে ফাইলটি লেখার জন্য প্রোগ্রামটি ব্যাহত হতে পারে। হিসাবে eyazici প্রস্তাব দেওয়া , সেট আপের কথা বিবেচনা logrotateখেজুর লগ ফাইলে একবার তারা একটি নির্দিষ্ট আকার বা বয়সে পৌঁছে। আপনি পুরানো ডেটা বাতিল করতে পারেন বা সংক্ষিপ্ত ফাইলগুলির একটি সিরিজে সময়ের জন্য এটি সংরক্ষণাগারভুক্ত করতে পারেন।


এটি প্রোগ্রাম দ্বারা লিখিত কোনও ফাইলের আকারকে সীমাবদ্ধ করে
কিম

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

6

আপনি একটি নতুন ফাইল সিস্টেম চিত্র তৈরি করতে পারেন, লুপ ডিভাইসটি ব্যবহার করে এটি মাউন্ট করতে পারেন এবং লগ ফাইলটি সেই ফাইল সিস্টেমে রেখে দিতে পারেন:

dd if=/dev/zero of=./200mb.img bs=1024 count=200000 # create new empty 200MB file
mkfs.ext2 200mb.img # or ext3, or whatever fits your needs
mkdir logs
sudo mount -t ext2 -o loop 200mb.img logs # only root can do '-o loop' by default
run_program >>logs/myprogram.log

tmpfsআপনার যদি পর্যাপ্ত মেমরি থাকে তবে আপনি কোনও ফাইলের পরিবর্তেও ব্যবহার করতে পারেন।


সৃজনশীল ধারণা ... যা এটি শেষ হয়ে যায় তখন কী করা উচিত তা প্রোগ্রামে ছেড়ে দেয়।
অ্যারন ডি মারাকো

6

আপনি এর সাথে আউটপুট কেটে ফেলতে পারেন head:

size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log

খুবই সৃজনশীল. কেবল একটি নোট যে এটি কেবলমাত্র নতুন ডেটা ফাইলে লেখা সীমাবদ্ধ করতে কাজ করবে, ফাইলটি ইতিমধ্যে কত বড় বা ছোট তা বিবেচনায় নেবে না।
কালেব

2
নোট করুন যে সম্ভবত এটি প্রোগ্রামটি (ত্যাগ করা SIGPIPE) একবার ডেটা ফেলে দেওয়ার পরিবর্তে আকারের সীমাতে পৌঁছে দেবে।
র্যান্ডম 832

1
আমি কিছু ddযাদু নিয়ে একই রকম চিন্তা করছিলাম তবে হ্যাঁ @ র্যান্ডম 832 ঠিক আছে, আপনি এটি / / ড্রপ SIGPIPEহিসাবে পাবেন । headddwhatever
অ্যারন ডি মারাকো

এটিকে এড়িয়ে যাওয়ার কী হবে trap '' SIGPIPE?
টাক্সেস

বা পরিবর্তে পাইপ { head -c "$size" >> log; cat > /dev/null; }
স্টাফেন চেজেলাস

5

প্যাকেজে apache2-utilsবর্তমান ইউটিলিটি বলা হয় rotatelogs, এটি আপনার পক্ষে সহায়ক হতে পারে।

সারমর্ম:

rotatelogs [-l] [-L LINKNAME ] [-p প্রোগ্রাম ] [-f] [-t] [-v] [-e] [-c] [-n সংখ্যা অফ ফাইল ] লগ ফাইল rotationtime | ফাইলসাইজ (বি | কে | এম | জি) [ অফসেট ]

উদাহরণ:

your_program | rotatelogs -n 5 /var/log/logfile 1M

সম্পূর্ণ ম্যানুয়াল আপনি এই লিঙ্কে পড়তে পারেন ।


লিঙ্কটি নেই।
আলেকজান্ডার গঞ্চি

1

আমি নিশ্চিত যে মূল পোস্টারটি একটি সমাধান পেয়েছে। অন্যদের জন্য এখানে অন্য একটি যা এই থ্রেডটি পড়তে পারে ...

কার্টাইল কোনও প্রোগ্রামের আউটপুটটির আকার সীমাবদ্ধ করে এবং নিম্নলিখিত কমান্ডের সাহায্যে আউটপুটের শেষ 200MB সংরক্ষণ করে:

$ run_program | curtail -s 200M myprogram.log

তথ্যসূত্র

দ্রষ্টব্য: আমি উপরের রেপোর রক্ষণাবেক্ষণকারী। কেবল সমাধানটি ভাগ করে নিচ্ছি ...


আমি কার্টেল ধারণা পছন্দ করি। আমি সি এর সাথে তেমন পরিচিত নই, সুতরাং এর জন্য বাইনারি সরবরাহ করার সুযোগ আছে কি? কীভাবে এটি ইনস্টল করবেন সে সম্পর্কে কমপক্ষে বিস্তারিত নির্দেশাবলী?
ফিলিপ

0

যেহেতু এটি পাঠ্য তাই আমি আপনার প্রিয় ভাষায় একটি স্ক্রিপ্ট লিখব এবং এটিতে পাইপ করব। এটি আই / ও ফাইলটি হ্যান্ডেল করুন (বা এটিকে সমস্ত স্মৃতিতে রাখুন এবং তারপরে এটিকে SIGHUPঅনুরূপ বা একইভাবে ফেলে দিন)। তার জন্য, আমি 200MB এর পরিবর্তে ট্র্যাক রাখতে একটি 'যুক্তিসঙ্গত' সংখ্যক লাইনের কথা ভাবব।


200MB লগ ডেটা মেমোরিতে রাখা অন্য কোনও কারণে কাটাতে সক্ষম হওয়া ছাড়া এটি সিস্টেম সংস্থানগুলির খুব ভাল ব্যবহার নয়। বা একটি বড় লগ ফাইল একটি লাইন গণনা করা হয় না। আমি এই জাতীয় syslogএবং এর জন্য নির্মিত সরঞ্জামগুলি ব্যবহার করার পরামর্শ দেব logrotate
কালেব

0

নিম্নলিখিত স্ক্রিপ্ট কাজ করা উচিত।

LOG_SIZE=500000
NUM_SEGM=2
while getopts "s:n:" opt; do
  case "$opt" in
    s)
      LOG_SIZE=$OPTARG
      ;;
    n)
      NUM_SEGM=$OPTARG
      ;;
  esac
done
shift $((OPTIND-1))
if [ $# == 0 -o -z "$1" ]; then
    echo "missing output file argument"
    exit 1
fi
OUT_FILE=$1
shift
NUM=1
while :; do
    dd bs=10 count=$(($LOG_SIZE/10)) >> $OUT_FILE 2>/dev/null
    SZ=`stat -c%s $OUT_FILE`
    if [ $SZ -eq 0 ]; then
        rm $OUT_FILE
        break
    fi
    echo -e "\nLog portion finished" >> $OUT_FILE
    mv $OUT_FILE $OUT_FILE.n$NUM
    NUM=$(($NUM + 1))
    [ $NUM -gt $NUM_SEGM ] && NUM=1
done

এটিতে বেশ কয়েকটি স্পষ্ট শর্ট-কাট রয়েছে, তবে সামগ্রিকভাবে এটি আপনি যা চেয়েছিলেন তা করে। এটি লগটিকে একটি সীমিত আকারের অংশে ভাগ করবে এবং খণ্ডের পরিমাণও সীমিত। কমান্ড-লাইন আর্গুমেন্টের মাধ্যমে সমস্ত নির্দিষ্ট করা যেতে পারে। লগ ফাইলটি কমান্ড লাইনের মাধ্যমেও নির্দিষ্ট করা হয়।

আপনি যদি ডিমনটির সাথে এটি ব্যাকগ্রাউন্ডে ফোরকে ব্যবহার করেন তবে একটি ছোট গোটচায় নোট করুন। পাইপ ব্যবহার করা ডেমনকে পটভূমিতে যেতে বাধা দেবে। এক্ষেত্রে সমস্যা এড়াতে একটি (সম্ভবত বাশ-নির্দিষ্ট) সিনট্যাক্স রয়েছে:

my_daemon | ( logger.sh /var/log/my_log.log <&0 & )

মনে রাখবেন <&0, আপাতদৃষ্টিতে অপ্রয়োজনীয় হওয়ার পরেও এটি কাজ করে না।

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