কীভাবে সমস্ত লগফাইল কেটে যাবে?


18

/var/log/ডিরেক্টরিতে সমস্ত লগফিল কেটে দেওয়ার জন্য কেউ কি আমাকে একটি সমাধান দিতে পারেন ?

এবং শুধু জ্ঞানের জন্য একটি প্রশ্ন, এটি একটি ভাল ধারণা বা না?

#!/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আপনার লগগুলি হ্যান্ডেল করতে ব্যবহার করেন তবে আপনি যদি এটির একাধিক বার করতে চান । সাধারণত এটি উবুন্টুতে ইনস্টল করা থাকে। একবার দেখুন man logrotate(বা আপনার যদি এটি ইনস্টল না করে থাকে তবে অনলাইন ম্যানপেজটি দেখুন বা এটি দিয়ে ইনস্টল করুন sudo apt-get install logrotate)

ম্যানপেজ থেকে:

লোগ্রোটেট এমন সিস্টেমগুলির প্রশাসনের সুবিধার্থে ডিজাইন করা হয়েছে যা প্রচুর সংখ্যক লগ ফাইল তৈরি করে। এটি লগ ফাইলগুলিকে স্বয়ংক্রিয় ঘূর্ণন, সংক্ষেপণ, অপসারণ এবং মেলিংয়ের অনুমতি দেয়। প্রতিটি লগ ফাইল দৈনিক, সাপ্তাহিক, মাসিক, বা যখন এটি খুব বড় হয় তখন পরিচালনা করা যেতে পারে।


এছাড়াও আপনি তাদের প্রতিধ্বনি ""> * লগ
এস্টেম

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

@DEN উত্তর অনুসরণ করুন

এটি সমস্ত লগ ফাইলগুলিতে সন্ধান করবে /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- সম্মতিযুক্ত OS এ প্রযোজ্য। সবচেয়ে সাধারণ যেটি আপনি শেল স্ক্রিপ্টিং দিয়ে দেখতে পাবেন তা হ'ল কিছু ( true > file.txtবা শেলের : > file.txtক্ষেত্রে bash, >পুনঃনির্দেশই একাই যথেষ্ট)। এটি ফ্ল্যাগগুলির >মাধ্যমে কীভাবে ফাইলগুলি খুলতে open()বা openat()সিস্কল করার মাধ্যমে 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()সিস্কেল রয়েছে যা আমরা পাশাপাশি ব্যবহার করতে পারি এবং ভেরিয়েবলের দৈর্ঘ্যে কোনও ফাইল কেটে ফেলতে পারি।

এখন, আপনি যদি সি এর অনুরাগী না হন তবে পাইথন আপনার পক্ষে সহজ হতে পারে। open()কমান্ড পাইথনের একই নীতিতে কাজ করে - লেখার জন্য ফাইল খোলার জন্য এবং ফাইলের নাম উপস্থিত থাকলে ট্রানকাটিংয়ের জন্য ফাইল। এইভাবে আমরা করতে পারি

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

সমস্ত .logফাইল সন্ধান করার জন্য , এটি ইতিমধ্যে অন্যান্য *উত্তরে beenাকা পড়েছে - গ্লোব বা প্রসারিত গ্লোব ব্যবহার করুন 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ফাইলের একটি বিশেষ চরিত্রের ডিভাইস ধরণের, আপনি অন্য কোথাও অনুলিপি করলে ফলাফল কমপক্ষে GNU সহ নিয়মিত ফাইল খালি থাকে cp। এইভাবে আমরা করতে পারি

cp /dev/null foo.txt

অথবা

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

অন্যান্য প্রস্তাবিত পড়া:


0

লোগ্রোটেট কার্যকারিতা সহ ঘোরানো / ভার / লগগুলিতে লগগুলি ঘোরানো ভাল অনুশীলন তবে আমরা যখনই করতে চাই না তা নয়। সিস্টেম লগগুলি তার মুদ্রণ করা হবে এবং তারা কোনও ব্যর্থতা ডিবাগ করার জন্য কার্যকর হবে।

যদি লোগ্রোটেট না ব্যবহার করার প্রয়োজন হয় তবে বিকল্পগুলি অন্বেষণ করা যেতে পারে। যদিও ইউনিক্স সিস্টেমের কয়েকটি স্বাদে কাটা কাটা সহজ বিকল্প, এই কমান্ডটি সহজেই পাওয়া যায় না, ইনস্টল করা দরকার f যদি নতুন কমান্ড ইনস্টল করার অনুমতি না দেওয়া হয় তবে নীচের লুপটি ব্যবহার করা যেতে পারে।

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

বাশ পিটফল # 1 : লুপের জন্য সেভাবে লিখবেন না। for logfile in /path/*.logপরিবর্তে ব্যবহার করুন।
পার্লডাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.