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> logrotat-ზე უფრო ვრცელი ინფომარმაციის ნახვა შესაძლებელია 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 სისტემაში , როგორც წესი ნაგულისხმები მნიშვენლობით არსებობს /etc/cron.daily/logrotate. თუ /etc/logrotate.d/_ში ჩავწერთ კონფიგურაციის ფაილს, მაშინ ეს სკრიპტი დაინახავს მას და ავტომატურად შეასრულებს ყოველდღე. ვთქვათ, თავად გვინდა შევქმათ ჟურნალიზაციის ფაილი, რომელშიც ყოველ წამში ჩაიწერება 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მბ ) მაინც გააკეთებს როტაციას.