मैं >>
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
जादू लेकिन हाँ @ Random832 सही है, तो आप एक मिल जाएगा SIGPIPE
के रूप में head
/ dd
/ whatever
यह चला जाता है।
trap '' SIGPIPE
?
{ head -c "$size" >> log; cat > /dev/null; }
।
पैकेज apache2-utils
में वर्तमान उपयोगिता कहा जाता है rotatelogs
, यह आपके लिए उपयोगी हो सकता है।
सारांश:
rotatelogs [-l] [एल linkname ] [-p कार्यक्रम ] [-f] [आयकर] [-v] [-e] [-c] [-n संख्या के- फ़ाइलें ] लॉगफ़ाइल rotationtime | filesize (B | K | M | G) [ ऑफसेट ]
उदाहरण:
your_program | rotatelogs -n 5 /var/log/logfile 1M
पूर्ण मैनुअल आप इस लिंक पर पढ़ सकते हैं ।
मुझे यकीन है कि मूल पोस्टर ने एक समाधान ढूंढ लिया है। यहां अन्य लोगों के लिए एक और है जो इस धागे को पढ़ सकता है ...
कर्टेल एक प्रोग्राम के आउटपुट के आकार को सीमित करता है और अंतिम कमांड के साथ अंतिम 200MB आउटपुट को संरक्षित करता है:
$ run_program | curtail -s 200M myprogram.log
नोट: मैं उपरोक्त रेपो का अनुचर हूं। बस समाधान साझा कर रहा हूं ...
चूंकि यह पाठ है, इसलिए मैं आपकी पसंदीदा भाषा में एक स्क्रिप्ट लिखूंगा और उसे उस पर पाइप करूंगा। क्या यह फ़ाइल I / O को संभालती है (या इसे सभी मेमोरी में रखें और फिर इसे 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
, जबकि अनावश्यक रूप से, यह इसके बिना काम नहीं करेगा।