Logrotate

Logrotate
logrotate — ხელსაწყო, ჟურნალიზაციის ფაილების ადმინისტრირებისთვის. მისი ძირითადი დანიშნულებაა შეკუმშოს, შეინახოს ან წაშალოს ფაილი, მისი არსებობის ხანგრძლივობის ან ზომის მიხედვით.
ჟურნალიზაციის ყოველი ფაილისთვის logrotate ასრულებს ორ ოპერაციას ერთდროულად:
compression (შეკუმშვა): ჟურნალიზაციის ფაილების შეკუმშვა (გარკვეული ალგორითმით ფაილის ზომის შემცირება, იმ პირობით რომ სურვილის შემთხვევაში შიგთავსი აღდგება მაქსიმალური სიზუსტით).
rotate (ბრუნვა): შეკუმშული ფაილისთვის სახელის მინიჭება გარკვეული გაფართოებით (შეიძლება იყოს რიცხვი ან თარიღი), ამასთან, საჭიროების შემთხვევაში უფრო ძველი ფაილების განადგურება.
logrotate_ის გამოყენების დადებითი მხარე, მყარ დისკზე ჟურნალიზაციის ფაილების მიერ დაკავებული ადგილის შემცირებაა, რაც იცავს ფიზიკურ მოწყობილობას გადავსებისგან. თუმცა, უნდა აღინიშნოს, რომ ამ პროცესს მეტი რესურსი სჭირდება, ვიდრე უბრალოდ ინფორმაციის ფაილში ჩაწერას. კერძოდ, ის მოითხოვს მეტი მეხსიერებისა და პროცესორის გამოყენებას.
ინსტალაცია
როგორც წესი, logrotate თავიდანვე დაყენებულია ოპერაციულ სისტემაზე, მაგრამ თუ არ არის, მაშინ საჭიროა logrotate პაკეტის ინსტალაცია, მაგალითად, Debian-ის ან Ubuntu-სთვის შემდეგნაირად:apt-get install logrotateიმაში დასარწმუნებლად, რომ ეს პაკეტი დაყენებულია, გაუშვით ბრძანებაlogrotateბრძანების ასეთი სახით გაშვება მხოლოდ ინფორმაციას მოგაწვდით და არ ექნება ზეგავლენა სხვა რაიმე პროცესზე. შედეგი კი შეიძლება იყოს შემდეგი ტექსტი, სადაც მოცემულია მცირედი ინფორმაცია: logrotate_ს ვერსია, ლიცენზიის ტიპი და პარამეტრების ჩამონათვალი.logrotate 3.8.7 - Copyright (C) 1995-2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License
Usage: logrotate [-dfv?] [-d|--debug] [-f|--force] [-m|--mail=command] [-s|--state=statefile]
[-v|--verbose] [--version] [-?|--help] [--usage] [OPTION...] <configfile>logrotate _ზე უფრო ვრცელი ინფომარმაციის ნახვა შესაძლბელია man logrotate, info logrotate, logrotate --help და სხვ. ბრძანებების დახმარებით.
კონფიგურაცია
კონფიგურაციის ფაილები განსაზღვრავენ კონკრეტული ჟურნალიზაციის ფაილის ან ფაილების როტაციისა და შეკუმშვის მიმდინარეობის პროცესს.
ვნახოთ ერთ-ერთი მათგანი /etc/logrotate.conf. მასში აღწერილია კონფიგურაციის ფაილის პარამეტრების დანიშნულება და ნაჩვენებია /var/log/wtmp და /var/log/btmp კონფიგურაცია. # see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured hereკონფიგურაციის ფაილების შიგთავსი, ჩვეულებრივ, მომხმარებლებისთვის ხელმისაწვდომია, მათ შეუძლიათ წაკითხვა, მაგრამ ცვლილებების შეტანის უფლება მხოლოდ root _ ს აქვს. მაგალითისთვის შეგიძლია ნახოთ ზემოთ ნაჩვენები ფაილის უფლებელი:ls -l /etc/logrotate.conf
-rw-r--r-- 1 root root 703 May 6 2015 /etc/logrotate.confზოგიერთი აპლიკაციის ჟურნალიზაციის შესახებ კონკრეტული ინფორმაცია მოცემულია დირექტორიაში '/etc/logrotate.d/'
კონფიგურაციის ფაილის მაგალითი
ავიღოთ ერთ-ერთი ფაილი /etc/logrotate.d-დან და განვიხილოთ. მაგალითად dpkg (debien_ის პაკეტ-მენეჯერი ) კონფიგურაციის ფაილი შეიძლება ასე გამოიყურებოდეს:/var/log/dpkg.log {
monthly
rotate 12
compress
delaycompress
missingok
notifempty
create 644 root root
}
/var/log/dpkg.log ნიშნავს, რომ dpkg-ს კონფიგურაციის ფაილი „მეთვალყურეობს“ /var/log დირექტორიაში განთავსებულ ჟურნალიზაციის ფაილს dpkg.log-ს
monthly — „როტაციის ინტერვალი", logrotate აკეთებს როტაციას თვეში ერთხელ
rotate 12 — ინახავს ჟურალიზაციის ფაილს 12 თვის განმავლობაში
compress — კუმშავს ჟურნალიზაციის ფაილს. შესაძლებელია გამოყენებული იყოს gzip ფორმატი—
delaycompress — ფუნქციონირებს მხოლოდ მაშინ თუ თან სდევს compress პარამეტრიც, იგი აყოვნებს შეკუმშვის პროცესს შემდეგ როტაციამდე
missingok — შეცდომების მიუხედავად არ წყვეტს პროცესს
notifempty — არ აკეთებს როტაციას თუ ჟურნალიზაციის ფაილი logrotate_ს ცარიელი დახვდება
create 644 root root — ქმნის ჟურნალიზაციის ფაილს, რომელსაც ექნება უფლებები 644, მისი მფლობელი იქნება root და მისი მფლობელი ჯგუფის სახელი იქნება root
ჟურნალიზაციის ფაილების დახარისხება
გამოვიყენოთ შემდეგი ბრძანება, dpkg_ს ჟურნალიზაციის ფაილების სიის სანახავად:ls -l /var/log/dpkg*შედეგი შეიძლება იყოს ასეთი:-rw-r--r-- 1 root root 27942 Jul 27 21:53 /var/log/dpkg.log
-rw-r--r-- 1 root root 2472 Jun 23 16:32 /var/log/dpkg.log.1
-rw-r--r-- 1 root root 944 May 9 12:29 /var/log/dpkg.log.2.gz
-rw-r--r-- 1 root root 7474 Apr 29 15:49 /var/log/dpkg.log.3.gz
-rw-r--r-- 1 root root 2484 Mar 26 21:12 /var/log/dpkg.log.4.gz
-rw-r--r-- 1 root root 801 Feb 17 21:14 /var/log/dpkg.log.5.gz
-rw-r--r-- 1 root root 451 Dec 5 2018 /var/log/dpkg.log.6.gz
-rw-r--r-- 1 root root 534 Nov 28 2018 /var/log/dpkg.log.7.gz
-rw-r--r-- 1 root root 2704 Apr 28 2018 /var/log/dpkg.log.8.gz
-rw-r--r-- 1 root root 155297 Mar 30 2018 /var/log/dpkg.log.9.gzფაილებს მართლაც 644 ატრიბუტები აქვთ, ისინი ეკუთვნიან root და ჯგუფიც root_ისაა ანუ create შესრულებულია. ls გულისხმობის პრინციპით დროითი მაჩვენებლის მიხედვით ალაგებს ფაილებს, ამიტომ მარტვი შესამჩნევია, რომ ფაილები დალაგებულია ახლიდან ძველის მიმართულებით, იგი იქნებოდა ყოველთვე. მიმდინარე ფაილს, რომელშიც ამჟამად იწერება ინფორმაცია რიცხვითი გაფართოება არ აქვს, ხოლო დანარჩენების შემთხვევაში იგი იზრდება იმის მიხედვით, თუ რამდენად ძველია, ანუ მარტივად, თარიღების შეუმოწმებლადაც შეგვიძლია მივხვდეთ, რომ /var/log/dpkg.log.1 უფრო ახალ ინფორმაციას შეიცავს ვიდრე, მაგალითად /var/log/dpkg.log.4.
ფაილების დასახელების ზოგადი შაბლონი ასეთია name.log.number.gz . ყოველთვიურად ინფორმცია ახლდება ამ ფაილებში, მაგრამ თავად სახელები უცვლელი რჩება. მორიგი განახლებისას /var/log/dpkg.log_ში ჩაწერილი შიგთავსი ჩაიწერება /var/log/dpkg.log.1_ში, ხოლო ამ უკანასკნელის /var/log/dpkg.log.2 _ში და ასე გრძელდება სანამ /var/log/dpkg.log.9.gz _ის შიგთავსამდე არ მივა, ეს შიგთავსი კი წაიშლება. შედეგად მივიღებთ ცარიელ /var/log/dpkg.log_ს, რომელიც მზად იქნება ინფორმაციის მისაღებად და წაშლილ ყველაზე ძველ მონაცემებს.
/var/log/dpkg.log.1_სა და /var/log/dpkg.log.2.gz_ის განსხვავებაა gz, ეს გამოწვეულია delaycompress პარამეტრით. იგი უზრუნველყოფს ყველაზე ახალი, არამიმდინარე ფაილის შენარჩუნებას შეუკუმშავი სახით.
სტატუსი და შეწომება
რათა დარწმუნდეთ, რომ ჟურნალიზაციის ფაილის როტაცია სწორად მიმდინარეობს ან რათა შეამოწმოთ როტაციის დრო და თარიღი , ეწვიეთ ფაილს /var/lib/logrotate/status. იგი ადვილად იკითხება და შეიცავს ჟურნალიზაციის ფაილის სახელსა და თარიღს, რომელშიც მან განიცადა ბოლო როტაცია.
cat /var/lib/logrotate/status
"/var/log/lpr.log" 2013-4-11
"/var/log/dpkg.log" 2013-4-11
"/var/log/pm-suspend.log" 2013-4-11
"/var/log/syslog" 2013-4-11
"/var/log/mail.info" 2013-4-11
"/var/log/daemon.log" 2013-4-11
"/var/log/apport.log" 2013-4-11
cron
სისტემაში , როგორც წესი ნაგულისხმები მნიშვენლობით არსებობს /etc/cron.daily/logrotate. თუ /etc/logrotate.d/_ში ჩავწერთ კონფიგურაციის ფაილს, მაშინ ეს სკრიპტი დაინახავს მას და ავტომატურად შეასრულებს ყოველდღე.
ჟურნალიზაციის ფაილის შექმნა და logrotate_ით მართვა
ვთქვათ, თავად გვინდა შევქმათ ჟურნალიზაციის ფაილი, რომელშიც ყოველ წამში ჩაიწერება test დირექტორიაში შემავალი ფაილების სახელების სია. ცხადია, გარკვეული დროის შემდეგ ჟურნალიზაციის ფაილის ზომა მკვეთრად გაიზრდება, ამიტომ მყარი დისკის გადავსების თავიდან ასაცილებლად, საჭიროა, ფაილის შეკუმშვა და ძველი ინფორმაციის დროულად წაშლა, ამასთან დროის ფაქტორის გარდა გასათვალისწინებელია ჟურნალიზაციის ფაილის ზომაც, მაგალითად, თუ ზომა აღემატება 10მბ მოხდეს როტაცია და შეკუმშვა.
ამოცანის შესასრულებლად, პირველ რიგში, დავწეროთ სკრიპტი _ dir_list.sh, რომელიც გადაამისამართებს ჟურნალიზაციის ფაილში ინფორმაციას (ჟურნალიზაციის ფაილში ჩასაწერად საჭიროა root_ის უფლებები) :#/bin/bash
while :
do
ls -l ~/test >> /var/log/list_file.log
sleep 1
doneმეორე ნაბიჯი დირექტორია /etc/logrotate.d -ში კონფიგურაციის ფაილის შექმნაა, ამიტომ უმჯობესი იქნება თუ შექმნილ ფაილს .conf გაფართოებას მივანიჭებთ. dir_list.conf ასე გამოიყურება:/var/log/list_file.log
{
daily
size 10M
rotate 300
delaycompress
notifempty
create 644 user user
}თავდაპირველად იწერება ფაილის (ან ფაილების) სახელი, რომლის "მეთვალყურეობაც" კონფიგურაციის ფაილს ევალება. განსხვავება dpkg_სა და dir_list.conf_ს შორის ზომის პარამეტრშია, კერძოდ size 10M.
უკვე შეგვიძლია dir_list.sh სკრიპტი გავუშვათ და გადავდგათ მესამე ნაბიჯი ანუ გავუშვათ ბრძანებაlogrotate -f /etc/logrotate.d/dir_list პარამეტრი -f უზრუნველყოფს ჟურნალიზაციის ფაილის შემოწმებას ამ ბრძანების გაშვებისთანავე. ცხადია, თუ ამ დროს ფაილის file_list.log ზომა აღემატება 10 მბ, logrotate აღარ დაელოდება დღის გასვლას და მაშინვე შექმნის file_list.log.1 _ს, მაგრამ არ შეკუმშავს, რადგან კონფიგურაციის ფაილში მითითებული გვაქვს delaycompress პარამეტრი. მოსალოდნელი შედეგის სისწორე კი შეგვიძლია შევამოწმოთ /var/lib/logrotate/status _ში:cat /var/lib/logrotate/status | grep list_file.logზომებთან დაკავშირებით ერთ პრობლემას შეიძლება გადავაწყდეთ, კერძოდ, თუ ამავე დღეს ჟურნალიზაციის ფაილის ზომა ისევ გადააჭარბებს 10მბ_ს, logrotate არ შეამოწმებს ფაილს და შესაბამისად რეაგირება არ ექნება, ის დაელოდება მომდევნო დღეს და მხოლოდ ამის შემდეგ შეკუმშავს მას. რა თქმა უნდა, ჩვენ შეგვიძლია თავად ვადევნოთ თვალი ზომის ცვლილებას და თუ საჭიროდ ჩავთვლით ხელახლა გავუშვათ logrotate -f /etc/logrotate.d/dir_list, მაგრამ ეს ძალიან მოუხერხებელი მიდგომა იქნება. ამ სიტუაციიდან სხვა გამოსავალიც არსებობს და ეს crontab-ია.იგი ყოველ საათში გაუშვებს ბრძანებას და იმოქმედებს ზომის შესაბამისად, ხოლო ყოველ ახალ დღეს ზომის მიუხედავად (თუნდა არ აღემატებოდეს 10მბ ) მაინც გააკეთებს როტაციას.