सभी लॉगफ़ाइलों को कैसे छोटा करना है?


18

किसी ने मुझे /var/log/निर्देशिका में सभी logfile को कम करने के लिए एक समाधान दे सकते हैं ?

और केवल ज्ञान के लिए एक प्रश्न, क्या यह एक अच्छा विचार है या नहीं?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done

1
यह एक अच्छा विचार नहीं है - /var/logयह वह जगह है जहां सिस्टम उन संदेशों को डालता है जिनकी आपको बाद में आवश्यकता हो सकती है। उबंटू पहले भी समस्या का सामना कर चुका है। पढ़ें man 8 logrotate;man logrotate.conf
वाल्टिनेटर

जवाबों:


34

इसे इस्तेमाल करे:

truncate -s 0 /var/log/*log

संपादित करें:

यदि आप logrotateअपने लॉग्स को संभालने के लिए एक से अधिक बार उपयोग करना चाहते हैं । आमतौर पर यह ubuntu में स्थापित है। पर एक नज़र है man logrotate(या यदि आपके पास यह ऑनलाइन मैनपेज पर देखने के लिए स्थापित नहीं है या इसके साथ स्थापित करें sudo apt-get install logrotate)

मैनपेज से:

logrotate को बड़ी संख्या में लॉग फाइल बनाने वाली प्रणालियों के प्रशासन को आसान बनाने के लिए डिज़ाइन किया गया है। यह स्वचालित रोटेशन, संपीड़न, हटाने और लॉग फ़ाइलों की मेलिंग की अनुमति देता है। प्रत्येक लॉग फ़ाइल को दैनिक, साप्ताहिक, मासिक, या जब यह बहुत बड़ा हो जाता है, तो संभाला जा सकता है।


भी आप उन्हें इको ""> * लॉग का उपयोग करके खाली कर सकते हैं
Astm

10

यदि आप अपनी सभी लॉग फ़ाइलों को साफ़ करना चाहते हैं , न कि केवल प्रथम-स्तरीय लॉग फ़ोल्डर में, आप उपयोग कर सकते हैं:

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

यह देखते हुए कि यदि आपके पास पहले से logrotateचल रहा है, तो आपको घुमाए गए .gzलॉग को भी साफ करना होगा :

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

इस के लिए एक वैध उपयोग वितरण के लिए एक वीएम उपकरण कंटेनर का निर्माण हो सकता है, उदाहरण के लिए।

आपको इसे नियमित रखरखाव के हिस्से के रूप में करने की आवश्यकता नहीं है: जैसा कि डेम ने काफी सही ढंग से सुझाव दिया है, उसके लिए उपयोग करें logrotate


1

जैसा कि @ उत्तर का पालन करें

यह सभी लॉग फ़ाइलों को /var/logखोजेगा और उन्हें 0 बाइट्स में विभाजित करेगा।

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0

1
मैं *.log*इसके बजाय उपयोग करूंगा, लेकिन मुझे यकीन नहीं है कि यह 100% सुरक्षित है, इसलिए मैंने इसे उत्तर में शामिल नहीं किया है। क्योंकि जैसी फाइलें हैं dovecot.log-20180930और हैं dovecot.log-20180923.gz
लुका

0

आम तौर पर सबसे POSIX- अनुरूप ओएस के लिए लागू एक फ़ाइल को पूरी तरह से छोटा करने के लिए कुछ तरीके हैं। शेल स्क्रिप्टिंग के साथ आप जो सबसे आम देखेंगे वह कुछ ऐसा है ( true > file.txtया शेल के : > file.txtमामले में bash, >पुनर्निर्देशन पर्याप्त है)। इस तरह >से झंडे के साथ open()या openat()syscall के माध्यम से फ़ाइलों को खोलता है कि जिस तरह से है O_WRONLY|O_CREAT|O_TRUNC- कि केवल पढ़ने के लिए बनाता है या फ़ाइल नाम मौजूद नहीं है, या मौजूदा फ़ाइल नाम ट्रंक करें।

इस बात को ध्यान में रखते हुए, हम सी में कुछ इस तरह से लागू कर सकते हैं:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

इस कोड को संग्रहीत करने वाली फ़ाइल को नाम दें trunc.cऔर उसके साथ संकलित करें gcc trunc.c -o trunc, और आपके पास स्वयं की एक छोटी सी उपयोगिता है जो एक फ़ाइलनाम तर्क को काट देगा जो इसमें प्रदान किया गया है trunc ./foobar.txt। बेशक, यह कोड अन्य चेक नहीं करता है, यह केवल पहले स्थितीय पैरामीटर को छोटा करता है। मैं इसे पाठकों तक छोड़ने के लिए पता लगाऊंगा कि एक से अधिक स्थितीय मापदंडों से कैसे निपटना है। साइड नोट पर, truncate()syscall है जिसे हम अच्छी तरह से उपयोग कर सकते हैं, और एक फ़ाइल को चर लंबाई में काट सकते हैं।

अब, यदि आप C के प्रशंसक नहीं हैं, तो Python आपके लिए आसान हो सकता है। open()पाइथन में एक ही सिद्धांत पर कमांड संचालित होता है - फाइलिंग मौजूद होने पर लिखने और छंटनी के लिए फ़ाइल खोलना। इस प्रकार हम कर सकते हैं

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

सभी .logफ़ाइलों को खोजने के लिए , जो पहले से ही अन्य उत्तरों में शामिल है - *ग्लोब या विस्तारित ग्लोब का उपयोग करें bash। वहाँ भी है find -type f -name "*.log", जिसमें -execकमांड चलाने के लिए झंडा है (इस विशेष मामले sh -c ''में >क्योंकि लाभ लेने के >लिए एक शेल ऑपरेटर है और बाहरी निष्पादन योग्य नहीं है)। इस प्रकार आप कर सकते हैं

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

यह भी निर्देशिका में है कि लॉग फाइल ध्यान देने योग्य है जैसे /var/logअक्सर logrotate सेवा तक घुमाया जाता है, इसलिए वहाँ के रूप में फ़ाइल नाम इस तरह हो जाएगा /var/log/service.log, /var/log/service.log.1,, आदि तो आप उपयोग कर सकते हैं *.log.[1-9]पैटर्न के बजाय


अन्य बातों के अलावा, हम /dev/nullवांछित फ़ाइल में कॉपी कर सकते हैं । अजीब तरह से पर्याप्त है, भले ही /dev/nullएक विशेष चरित्र डिवाइस प्रकार की फ़ाइल है, जब आप कॉपी करते हैं कि कहीं और परिणाम खाली नियमित फ़ाइल है, कम से कम जीएनयू के साथ cp। इस प्रकार हम कर सकते हैं

cp /dev/null foo.txt

या

dd if=/dev/null of=foo.txt

अन्य सुझाए गए पढ़ने:


0

लॉग / इन / लॉग में लॉग को घुमाने के लिए लॉगोट्रेट कार्यक्षमता के साथ घूमना अच्छा है, लेकिन जब भी हम ऐसा करना चाहते हैं। सिस्टम लॉग उसे प्रिंट किया जाएगा और वे किसी भी विफलताओं को डिबग करने के लिए आसान होंगे।

यदि यह लॉगोट्रेट का उपयोग नहीं करने की आवश्यकता है, तो विकल्प तलाशे जा सकते हैं। हालांकि ट्रंकट यूनिक्स प्रणाली के कुछ स्वादों में आसान विकल्प है, यह कमांड आसानी से उपलब्ध नहीं है, इसे स्थापित करने की आवश्यकता है। यदि नई कमांड को स्थापित करने की अनुमति नहीं है तो नीचे लूप का उपयोग किया जा सकता है।

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done

बैश ख़तरा # 1 : इस तरह से छोरों के लिए मत लिखो। for logfile in /path/*.logइसके बजाय उपयोग करें ।
पर्लडक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.