>>200MB দিয়ে লেখা লগ ফাইলের আকারটি আমি কীভাবে সীমাবদ্ধ করতে পারি ?
$ run_program >> myprogram.log
>>200MB দিয়ে লেখা লগ ফাইলের আকারটি আমি কীভাবে সীমাবদ্ধ করতে পারি ?
$ run_program >> myprogram.log
উত্তর:
যদি আপনার অ্যাপ্লিকেশন (যেমন। run_program) লগ ফাইলের আকার সীমাবদ্ধ করতে সমর্থন না করে তবে আপনি বাহ্যিক অ্যাপ্লিকেশন বা স্ক্রিপ্টের সাহায্যে একটি লুপে পর্যায়ক্রমে ফাইলের আকার পরীক্ষা করতে পারেন।
আপনি logrotate(8)আপনার লগগুলি ঘোরানোর জন্যও এটি ব্যবহার করতে পারেন , এতে sizeপ্যারামিটার রয়েছে যা আপনি আপনার উদ্দেশ্যে ব্যবহার করতে পারেন:
এটির সাহায্যে, নির্দিষ্ট আকারটি পৌঁছে গেলে লগ ফাইলটি ঘোরানো হয়। আকার বাইটস (ডিফল্ট), কিলোবাইট (সাইজক), বা মেগাবাইটে (মাপ) নির্দিষ্ট করা যেতে পারে।
postscriptকরতে পারে এবং লোগ্রোটেট কনফিগারেশনটি SIGHUPপ্রোগ্রামে প্রেরণ করার জন্য বিকল্পটি ব্যবহার করতে পারেন ।
যদি আপনার প্রোগ্রামে এই সীমাটির চেয়ে বড় আরও কোনও ফাইল লেখার প্রয়োজন না হয় তবে আপনি এই সীমাটির কার্নেলটি ব্যবহার করে অবহিত করতে পারেন ulimit। আপনি আপনার কমান্ড চালানোর আগে আপনার বর্তমান শেল সেশনে চলমান সমস্ত প্রক্রিয়াটির জন্য 200MB ফাইলের আকারের সীমা সেটআপ করতে এটি চালান:
ulimit -f $((200*1024))
এটি আপনার সিস্টেমকে সুরক্ষিত করবে তবে ফাইলটি লেখার জন্য প্রোগ্রামটি ব্যাহত হতে পারে। হিসাবে eyazici প্রস্তাব দেওয়া , সেট আপের কথা বিবেচনা logrotateখেজুর লগ ফাইলে একবার তারা একটি নির্দিষ্ট আকার বা বয়সে পৌঁছে। আপনি পুরানো ডেটা বাতিল করতে পারেন বা সংক্ষিপ্ত ফাইলগুলির একটি সিরিজে সময়ের জন্য এটি সংরক্ষণাগারভুক্ত করতে পারেন।
আপনি একটি নতুন ফাইল সিস্টেম চিত্র তৈরি করতে পারেন, লুপ ডিভাইসটি ব্যবহার করে এটি মাউন্ট করতে পারেন এবং লগ ফাইলটি সেই ফাইল সিস্টেমে রেখে দিতে পারেন:
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আপনার যদি পর্যাপ্ত মেমরি থাকে তবে আপনি কোনও ফাইলের পরিবর্তেও ব্যবহার করতে পারেন।
আপনি এর সাথে আউটপুট কেটে ফেলতে পারেন head:
size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
SIGPIPE) একবার ডেটা ফেলে দেওয়ার পরিবর্তে আকারের সীমাতে পৌঁছে দেবে।
ddযাদু নিয়ে একই রকম চিন্তা করছিলাম তবে হ্যাঁ @ র্যান্ডম 832 ঠিক আছে, আপনি এটি / / ড্রপ SIGPIPEহিসাবে পাবেন । headddwhatever
trap '' SIGPIPE?
{ head -c "$size" >> log; cat > /dev/null; }।
প্যাকেজে apache2-utilsবর্তমান ইউটিলিটি বলা হয় rotatelogs, এটি আপনার পক্ষে সহায়ক হতে পারে।
সারমর্ম:
rotatelogs [-l] [-L LINKNAME ] [-p প্রোগ্রাম ] [-f] [-t] [-v] [-e] [-c] [-n সংখ্যা অফ ফাইল ] লগ ফাইল rotationtime | ফাইলসাইজ (বি | কে | এম | জি) [ অফসেট ]
উদাহরণ:
your_program | rotatelogs -n 5 /var/log/logfile 1M
সম্পূর্ণ ম্যানুয়াল আপনি এই লিঙ্কে পড়তে পারেন ।
আমি নিশ্চিত যে মূল পোস্টারটি একটি সমাধান পেয়েছে। অন্যদের জন্য এখানে অন্য একটি যা এই থ্রেডটি পড়তে পারে ...
কার্টাইল কোনও প্রোগ্রামের আউটপুটটির আকার সীমাবদ্ধ করে এবং নিম্নলিখিত কমান্ডের সাহায্যে আউটপুটের শেষ 200MB সংরক্ষণ করে:
$ run_program | curtail -s 200M myprogram.log
দ্রষ্টব্য: আমি উপরের রেপোর রক্ষণাবেক্ষণকারী। কেবল সমাধানটি ভাগ করে নিচ্ছি ...
যেহেতু এটি পাঠ্য তাই আমি আপনার প্রিয় ভাষায় একটি স্ক্রিপ্ট লিখব এবং এটিতে পাইপ করব। এটি আই / ও ফাইলটি হ্যান্ডেল করুন (বা এটিকে সমস্ত স্মৃতিতে রাখুন এবং তারপরে এটিকে SIGHUPঅনুরূপ বা একইভাবে ফেলে দিন)। তার জন্য, আমি 200MB এর পরিবর্তে ট্র্যাক রাখতে একটি 'যুক্তিসঙ্গত' সংখ্যক লাইনের কথা ভাবব।
syslogএবং এর জন্য নির্মিত সরঞ্জামগুলি ব্যবহার করার পরামর্শ দেব logrotate।
নিম্নলিখিত স্ক্রিপ্ট কাজ করা উচিত।
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, আপাতদৃষ্টিতে অপ্রয়োজনীয় হওয়ার পরেও এটি কাজ করে না।