Logrotate

**logrotate** — ხელსაწყო, ჟურნალიზაციის ფაილების ადმინისტრირებისთვის. მისი ძირითადი დანიშნულებაა შეკუმშოს, შეინახოს ან წაშალოს ფაილი, მისი არსებობის ხანგრძლივობის ან ზომის მიხედვით.

ჟურნალიზაციის ყოველი ფაილისთვის logrotate ასრულებს ორ ოპერაციას ერთდროულად:

# compression (შეკუმშვა): ჟურნალიზაციის ფაილების შეკუმშვა (გარკვეული ალგორითმით ფაილის ზომის შემცირება, იმ პირობით რომ სურვილის შემთხვევაში შიგთავსი აღდგება მაქსიმალური სიზუსტით).
# rotate (ბრუნვა):  შეკუმშული ფაილისთვის სახელის მინიჭება გარკვეული გაფართოებით (შეიძლება იყოს რიცხვი ან თარიღი), ამასთან, საჭიროების შემთხვევაში უფრო ძველი ფაილების განადგურება.

logrotate-ის გამოყენების დადებითი მხარე, მყარ დისკზე ჟურნალიზაციის ფაილების მიერ დაკავებული ადგილის შემცირებაა, რაც იცავს ფიზიკურ მოწყობილობას გადავსებისგან. თუმცა, უნდა აღინიშნოს, რომ ამ პროცესს მეტი რესურსი სჭირდება, ვიდრე უბრალოდ ინფორმაციის ფაილში ჩაწერას. კერძოდ, ის მოითხოვს მეტი  მეხსიერებისა და პროცესორის გამოყენებას.

## ინსტალაცია 
როგორც წესი, logrotate თავიდანვე დაყენებულია ოპერაციულ სისტემაზე, მაგრამ თუ არ არის, მაშინ საჭიროა ***logrotate*** პაკეტის ინსტალაცია, მაგალითად,  Debian-ის ან Ubuntu-სთვის შემდეგნაირად:
```shell
apt-get install logrotate
```
იმაში დასარწმუნებლად, რომ ეს პაკეტი დაყენებულია, გაუშვით ბრძანება
```shell
logrotate
```
ბრძანების ასეთი სახით გაშვება მხოლოდ ინფორმაციას მოგაწვდით და არ ექნება ზეგავლენა სხვა რაიმე პროცესზე. შედეგი კი შეიძლება იყოს შემდეგი ტექსტი, სადაც მოცემულია მცირედი ინფორმაცია: logrotate_ს ვერსია, ლიცენზიის ტიპი და პარამეტრების ჩამონათვალი.
```shell
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...] 
```
logrotat-ზე უფრო ვრცელი ინფომარმაციის ნახვა შესაძლებელია man logrotate, info logrotate, logrotate --help და სხვ. ბრძანებების დახმარებით.

## კონფიგურაცია 
კონფიგურაციის ფაილები განსაზღვრავენ კონკრეტული ჟურნალიზაციის ფაილის ან ფაილების როტაციისა და შეკუმშვის მიმდინარეობის პროცესს.

ვნახოთ ერთ-ერთი მათგანი ***/etc/logrotate.conf.*** მასში აღწერილია კონფიგურაციის ფაილის პარამეტრების დანიშნულება და ნაჩვენებია /var/log/wtmp და /var/log/btmp კონფიგურაცია. 
```shell
# 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 _ ს აქვს. მაგალითისთვის შეგიძლია ნახოთ ზემოთ ნაჩვენები ფაილის უფლებელი:
```shell
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_ის პაკეტ-მენეჯერი ) კონფიგურაციის ფაილი შეიძლება ასე გამოიყურებოდეს:
```sh
/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_ს ჟურნალიზაციის ფაილების სიის სანახავად:
```shell
ls -l  /var/log/dpkg*
```
შედეგი შეიძლება იყოს ასეთი:
```shell
-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**

```shell
"/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_ის უფლებები) :
```sh
#/bin/bash
while :
do
	ls -l ~/test >> /var/log/list_file.log
	sleep 1
done
```
მეორე ნაბიჯი  დირექტორია /etc/logrotate.d -ში კონფიგურაციის ფაილის შექმნაა, ამიტომ უმჯობესი იქნება თუ შექმნილ ფაილს .conf გაფართოებას მივანიჭებთ. dir_list.conf ასე გამოიყურება:
```sh
/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 სკრიპტი გავუშვათ და გადავდგათ მესამე ნაბიჯი ანუ გავუშვათ ბრძანება
```shell
logrotate -f /etc/logrotate.d/dir_list
```
პარამეტრი  -f  უზრუნველყოფს ჟურნალიზაციის ფაილის შემოწმებას ამ ბრძანების გაშვებისთანავე. ცხადია, თუ ამ დროს ფაილის file_list.log ზომა აღემატება 10 მბ, logrotate აღარ დაელოდება დღის გასვლას და მაშინვე შექმნის file_list.log.1 _ს, მაგრამ არ შეკუმშავს, რადგან კონფიგურაციის ფაილში მითითებული გვაქვს delaycompress პარამეტრი. მოსალოდნელი შედეგის სისწორე კი შეგვიძლია შევამოწმოთ /var/lib/logrotate/status _ში:
```shell
cat /var/lib/logrotate/status | grep list_file.log
```
ზომებთან დაკავშირებით ერთ პრობლემას შეიძლება გადავაწყდეთ, კერძოდ, თუ ამავე დღეს  ჟურნალიზაციის ფაილის ზომა ისევ გადააჭარბებს 10მბ_ს, logrotate არ შეამოწმებს ფაილს და შესაბამისად რეაგირება არ ექნება, ის დაელოდება მომდევნო დღეს და მხოლოდ ამის შემდეგ შეკუმშავს მას. რა თქმა უნდა, ჩვენ შეგვიძლია თავად ვადევნოთ თვალი ზომის ცვლილებას და თუ საჭიროდ ჩავთვლით ხელახლა გავუშვათ logrotate -f /etc/logrotate.d/dir_list, მაგრამ ეს ძალიან მოუხერხებელი მიდგომა იქნება. ამ სიტუაციიდან სხვა  გამოსავალიც არსებობს და ეს  crontab-ია.იგი ყოველ საათში გაუშვებს ბრძანებას და იმოქმედებს ზომის შესაბამისად, ხოლო ყოველ ახალ დღეს ზომის მიუხედავად ( თუნდა არ აღემატებოდეს 10მბ ) მაინც გააკეთებს როტაციას.