مقدمه
در این آموزش، بخشهای مختلف مکانیزم لاگگیری لینوکس را بررسی میکنیم.
مدیران سیستم لینوکس اغلب برای عیبیابی به بررسی فایلهای لاگ نیاز دارند. این یکی از اولین اقداماتی است که یک مدیر سیستم انجام میدهد.
لینوکس و برنامههایی که روی آن اجرا میشوند، انواع پیامها را تولید میکنند که در فایلهای لاگ ذخیره میشوند. لاگگیری لینوکس از مجموعهای از فایلهای پیکربندی، دایرکتوریها، برنامهها، دستورات و دیمنها برای ایجاد، ذخیره و بازیافت این پیامهای لاگ استفاده میکند. دانستن مکان ذخیره فایلهای لاگ و نحوه استفاده از دستورات مرتبط میتواند زمان ارزشمندی را در عیبیابی صرفهجویی کند.
توجه: دستورات لاگگیری لینوکس این آموزش روی نصبهای خالص CentOS 9، Ubuntu 22.10 و Debian 11 تست شدهاند.
مرحله اول: بررسی مکان پیشفرض فایلهای لاگ
مکان پیشفرض فایلهای لاگ در لینوکس دایرکتوری /var/log است. برای مشاهده لیست فایلهای لاگ در این دایرکتوری، از دستور زیر استفاده کنید:
ls -l /var/log
در سیستم CentOS، خروجی مشابه زیر خواهید دید:
[root@centos-9-trim ~]# ls -l /var/log total 49316 drwxr-xr-x. 2 root root 6 Sep 27 19:17 anaconda drwx------. 2 root root 99 Jan 3 08:23 audit -rw-rw----. 1 root utmp 1234560 Jan 3 16:16 btmp -rw-rw----. 1 root utmp 17305344 Jan 1 00:00 btmp-20230101 drwxr-x---. 2 chrony chrony 6 Aug 10 2021 chrony -rw-r--r--. 1 root root 130466 Dec 8 22:12 cloud-init.log -rw-r-----. 1 root adm 10306 Dec 8 22:12 cloud-init-output.log -rw-------. 1 root root 36979 Jan 3 16:03 cron -rw-------. 1 root root 27360 Dec 10 23:15 cron-20221211 -rw-------. 1 root root 94140 Dec 17 23:07 cron-20221218 -rw-------. 1 root root 95126 Dec 24 23:14 cron-20221225 -rw-------. 1 root root 95309 Dec 31 23:04 cron-20230101 …
مرحله دوم: مشاهده محتوای فایلهای لاگ
برخی از فایلهای لاگ رایج در دایرکتوری /var/log عبارتند از:
wtmputmpdmesgmessagesmaillogیاmail.logspoolerauth.logیاsecure
فایلهای wtmp و utmp ورود و خروج کاربران به سیستم را ردیابی میکنند. نمیتوانید محتوای این فایلها را مستقیماً با دستور cat در ترمینال بخوانید – دستورات خاصی برای این کار وجود دارد که در ادامه استفاده خواهید کرد.
برای دیدن کاربرانی که در حال حاضر به سرور لینوکس وارد شدهاند، از دستور who استفاده کنید. این دستور اطلاعات خود را از فایل /var/run/utmp (برای CentOS و Debian) یا /run/utmp (برای Ubuntu) دریافت میکند.
مثالی از Ubuntu:
root@ubuntu-22:~# who root pts/0 2023-01-03 16:23 (198.211.111.194)
در این مورد، ما تنها کاربر سیستم هستیم.
دستور last تاریخچه ورود کاربران را نشان میدهد:
root@ubuntu-22:~# last root pts/0 198.211.111.194 Tue Jan 3 16:23 still logged in reboot system boot 5.19.0-23-generi Thu Dec 8 21:48 still running wtmp begins Thu Dec 8 21:48:51 2022
میتوانید از دستور last با pipe (|) و grep برای جستجوی کاربران خاص استفاده کنید.
برای بررسی آخرین زمان ریاستارت سیستم، دستور زیر را اجرا کنید:
last reboot
خروجی در Debian ممکن است شبیه این باشد:
root@debian-11-trim:~# last reboot reboot system boot 5.10.0-11-amd64 Thu Dec 8 21:49 still running wtmp begins Thu Dec 8 21:49:39 2022
برای دیدن آخرین زمان ورود یک کاربر به سیستم، از دستور lastlog استفاده کنید:
lastlog
در سرور Debian، خروجی ممکن است شبیه این باشد:
root@debian-11-trim:~# lastlog Username Port From Latest root pts/0 162.243.188.66 Tue Jan 3 16:23:03 +0000 2023 daemon **Never logged in** bin **Never logged in** sys **Never logged in** sync **Never logged in** games **Never logged in** man **Never logged in** lp **Never logged in** mail **Never logged in** news **Never logged in** uucp **Never logged in** proxy **Never logged in** www-data **Never logged in** backup **Never logged in** list **Never logged in** irc **Never logged in** gnats **Never logged in** nobody **Never logged in** _apt **Never logged in** messagebus **Never logged in** uuidd **Never logged in** …
برای سایر فایلهای لاگ متنی، میتوانید از دستورات cat، head یا tail برای خواندن محتوا استفاده کنید.
در مثال زیر، 10 خط آخر فایل /var/log/messages را در سرور Debian مشاهده میکنید:
sudo tail /var/log/messages
خروجی شبیه این خواهد بود:
root@debian-11-trim:~# tail /var/log/messages Jan 1 00:10:14 debian-11-trim rsyslogd: [origin software="rsyslogd" swVersion="8.2102.0" x-pid="30025" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Jan 3 16:23:01 debian-11-trim DropletAgent[808]: INFO:2023/01/03 16:23:01 ssh_watcher.go:65: [SSH Watcher] Port knocking detected. Jan 3 16:23:01 debian-11-trim DropletAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:43: [DO-Managed Keys Actioner] Metadata contains 1 ssh keys and 1 dotty keys Jan 3 16:23:01 debian-11-trim DropletAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:49: [DO-Managed Keys Actioner] Attempting to update 1 dotty keys Jan 3 16:23:01 debian-11-trim DropletAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:70: [DO-Managed Keys Actioner] Updating 2 keys Jan 3 16:23:01 debian-11-trim DropletAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:75: [DO-Managed Keys Actioner] Keys updated
مرحله سوم: استفاده از دیمن rsyslog
در مرکز مکانیزم لاگگیری، دیمن rsyslog قرار دارد. این سرویس وظیفه گوش دادن به پیامهای لاگ از بخشهای مختلف سیستم لینوکس و هدایت آنها به فایل لاگ مناسب در دایرکتوری /var/log را بر عهده دارد. همچنین میتواند پیامهای لاگ را به سرور لینوکس دیگری فوروارد کند.
فایل پیکربندی rsyslog
دیمن rsyslog اطلاعات پیکربندی خود را از فایل rsyslog.conf در دایرکتوری /etc دریافت میکند.
فایل rsyslog.conf مشخص میکند که پیامهای لاگ کجا ذخیره شوند. این دستور از خطوط دو بخشی در فایل تشکیل شده است.
در Ubuntu، این فایل در rsyslog.d/50-default.conf قرار دارد.
دستور دو بخشی شامل یک selector و یک action است که با فضای خالی از هم جدا میشوند.
بخش selector منبع و اهمیت پیام لاگ را مشخص میکند و بخش action تعیین میکند که با پیام چه باید کرد.
selector خود به دو بخش تقسیم میشود که با نقطه (.) از هم جدا شدهاند. بخش اول قبل از نقطه facility (منبع پیام) و بخش دوم بعد از نقطه priority (شدت پیام) نامیده میشود.
ترکیب facility/priority و action به rsyslog میگوید که هنگام تولید پیامی مطابق با معیارها چه باید کرد.
بخشی از فایل /etc/rsyslog.conf در CentOS را میتوانید با دستور زیر مشاهده کنید:
cat /etc/rsyslog.conf
خروجی شبیه این خواهد بود:
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### GLOBAL DIRECTIVES ####
# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")
# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
#### MODULES ####
module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
SysSock.Use="off") # Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
module(load="imjournal" # provides access to the systemd journal
StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
…
برای درک بهتر، انواع facilityهای شناختهشده توسط لینوکس را بررسی میکنیم:
- auth یا authpriv: پیامهای مربوط به رویدادهای احراز هویت و امنیتی
- kern: پیامهای دریافتشده از کرنل لینوکس
- mail: پیامهای تولیدشده توسط زیرساخت ایمیل
- cron: پیامهای مربوط به دیمن cron
- daemon: پیامهای دریافتشده از دیمنها
- news: پیامهای مربوط به زیرساخت اخبار شبکه
- lpr: پیامهای لاگ مربوط به چاپ
- user: پیامهای لاگ از برنامههای کاربر
- local0 تا local7: رزرو شده برای استفاده محلی
لیست اولویتها به ترتیب صعودی:
- debug: اطلاعات دیباگ از برنامهها
- info: پیام اطلاعاتی ساده – نیازی به مداخله نیست
- notice: شرایطی که ممکن است نیاز به توجه داشته باشد
- warn: هشدار
- err: خطا
- crit: شرایط بحرانی
- alert: شرایطی که نیاز به مداخله فوری دارد
- emerg: شرایط اضطراری
حالا خط زیر از فایل را بررسی میکنیم:
# Log cron stuff cron.* /var/log/cron
این خط به دیمن rsyslog دستور میدهد تمام پیامهای دریافتشده از دیمن cron را در فایلی به نام /var/log/cron ذخیره کند. علامت ستاره (*) بعد از نقطه یعنی پیامهای با تمام اولویتها لاگ میشوند. اگر facility بهصورت ستاره باشد، به معنای همه منابع است.
facilityها و اولویتها میتوانند به روشهای مختلفی مرتبط شوند.
در حالت پیشفرض، وقتی فقط یک اولویت بعد از نقطه مشخص شده، تمام رویدادهای برابر یا بالاتر از آن اولویت ثبت میشوند. بنابراین دایرکتیو زیر پیامهای زیرساخت mail با اولویت warning یا بالاتر را در یک فایل خاص در /var/log لاگ میکند:
mail.warn /var/log/mail.warn
این پیامهای با اولویت برابر یا بالاتر از warn را لاگ میکند، اما پیامهای با اولویت پایینتر را نادیده میگیرد. بنابراین پیامهای با اولویت err، crit، alert یا emerg نیز در این فایل ثبت میشوند.
استفاده از علامت مساوی (=) بعد از نقطه فقط اولویت مشخصشده را لاگ میکند. برای مثال، برای ثبت فقط پیامهای info از زیرساخت mail:
mail.=info /var/log/mail.info
برای ثبت همه چیز از زیرساخت mail به جز پیامهای info:
mail.!info /var/log/mail.info
یا
mail.!=info /var/log/mail.info
در حالت اول، فایل mail.info شامل پیامهای با اولویت کمتر از info خواهد بود. در حالت دوم، شامل پیامهای با اولویت بالاتر از info است.
چندین facility در یک خط با کاما و چندین منبع (facility.priority) با سمیکالن جدا میشوند.
وقتی action بهصورت ستاره باشد، یعنی همه کاربران. این ورودی در فایل rsyslog.conf CentOS همین را میگوید:
# Everybody gets emergency messages *.emerg :omusrmsg:*
فایل rsyslog.conf سیستم خود را بررسی کنید. بخشی از یک سرور Debian:
# /etc/rsyslog.conf configuration file for rsyslog # # For more information install rsyslog-doc and see # /usr/share/doc/rsyslog-doc/html/configuration/index.html ################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") ########################### #### GLOBAL DIRECTIVES #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # # Set the default permissions for all log files. # $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 …
Debian پیامهای سطح امنیتی/احراز هویت را در /var/log/auth.log و CentOS در /var/log/secure ذخیره میکند.
پیکربندیهای rsyslog میتوانند از فایلهای سفارشی در دایرکتوریهای /etc/rsyslog.d گرفته شوند. فایل rsyslog.conf این دایرکتوریها را با دایرکتیو $IncludeConfig شامل میکند.
در Ubuntu:
# # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf
محتوای دایرکتوری /etc/rsyslog.d را بررسی کنید:
ls -l /etc/rsyslog.d
خروجی:
-rw-r--r-- 1 root root 314 Sep 19 2021 20-ufw.conf -rw-r--r-- 1 root root 255 Sep 30 22:07 21-cloudinit.conf -rw-r--r-- 1 root root 1124 Nov 16 2021 50-default.conf
مقصد پیام لاگ لزوماً نباید فایل باشد؛ میتواند به کنسول کاربر ارسال شود. در این حالت، action شامل نام کاربری است. اگر چندین کاربر باید پیام را دریافت کنند، نامها با کاما جدا میشوند. برای پخش به همه کاربران، از ستاره (*) در action استفاده میشود.
دیمن rsyslog میتواند پیامهای لاگ را به سرور لینوکس دیگری فوروارد کند یا بهعنوان مخزن برای سیستمهای دیگر عمل کند. دیمن در پورت UDP 514 به پیامهای لاگ گوش میدهد. مثال زیر پیامهای بحرانی کرنل را به سروری به نام “texas” فوروارد میکند:
kern.crit @texas
مرحله چهارم: ایجاد و آزمایش پیامهای لاگ
برای ایجاد فایلهای لاگ خود:
- مشخصات فایل لاگ را به
/etc/rsyslog.confاضافه کنید - دیمن
rsyslogرا ریاستارت کنید - پیکربندی را با ابزار logger آزمایش کنید
در مثال زیر، دو خط جدید به فایل rsyslog.conf در سیستم CentOS اضافه میشود. هر کدام از facility به نام local4 با اولویتهای متفاوت هستند:
vi /etc/rsyslog.conf
خروجی:
… # New lines added for testing log message generation local4.crit /var/log/local4crit.log local4.=info /var/log/local4info.log
سرویس را ریاستارت کنید:
/etc/init.d/rsyslog restart
برای تولید پیام لاگ، برنامه logger را فراخوانی کنید:
logger -p local4.info " This is a info message from local 4"
در دایرکتوری /var/log، دو فایل جدید خواهید دید:
… -rw------- 1 root root 0 Jan 3 11:21 local4crit.log -rw------- 1 root root 72 Jan 3 11:22 local4info.log …
حجم فایل local4info.log غیرصفر است. با باز کردن آن، پیام ثبتشده را میبینید:
cat /var/log/local4info.log
Jan 3 11:22:32 TestLinux root: This is a info message from local 4
مرحله پنجم: چرخش فایلهای لاگ
هرچه اطلاعات بیشتری به فایلهای لاگ نوشته شود، حجم آنها افزایش مییابد که میتواند مشکلات عملکردی و مدیریتی ایجاد کند.
لینوکس از مفهوم چرخش لاگ (log rotation) به جای حذف فایلها استفاده میکند. در چرخش، فایل لاگ جدید ایجاد میشود، فایل قدیمی تغییر نام داده و بهصورت اختیاری فشرده میشود. فایل لاگ میتواند چندین نسخه قدیمی آنلاین داشته باشد که backlog را نشان میدهند. وقتی تعداد مشخصی backlog تولید شد، چرخش جدید قدیمیترین فایل را حذف میکند.
چرخش توسط ابزار logrotate انجام میشود.
فایل پیکربندی logrotate
ابزار logrotate به فایل پیکربندی logrotate.conf در دایرکتوری /etc وابسته است.
محتوای فایل logrotate.conf در سرور Debian:
cat /etc/logrotate.conf
# see "man logrotate" for details # global options do not affect preceding include directives # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file #dateext # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may also be configured here.
بهصورت پیشفرض، فایلهای لاگ هفتگی چرخانده میشوند و چهار backlog آنلاین نگهداری میشود. هنگام اجرای برنامه، فایل لاگ جدید و خالی ایجاد شده و فایلهای قدیمی بهصورت اختیاری فشرده میشوند.
استثنا برای فایلهای wtmp و btmp است. فایل wtmp ورودهای سیستم و btmp تلاشهای ورود ناموفق را ردیابی میکند. این فایلها هر ماه چرخانده میشوند و اگر فایل قبلی پیدا نشود، خطایی برنمیگردد.
پیکربندیهای سفارشی چرخش لاگ در /etc/logrotate.d ذخیره میشوند و با دایرکتیو include در logrotate.conf گنجانده شدهاند. محتوای دایرکتوری در Debian:
ls -l /etc/logrotate.d
total 32 -rw-r--r-- 1 root root 120 Jan 30 2021 alternatives -rw-r--r-- 1 root root 173 Jun 10 2021 apt -rw-r--r-- 1 root root 130 Oct 14 2019 btmp -rw-r--r-- 1 root root 160 Oct 19 2021 chrony -rw-r--r-- 1 root root 112 Jan 30 2021 dpkg -rw-r--r-- 1 root root 374 Feb 17 2021 rsyslog -rw-r--r-- 1 root root 235 Feb 19 2021 unattended-upgrades -rw-r--r-- 1 root root 145 Oct 14 2019 wtmp
محتوای فایل rsyslog نحوه بازیافت فایلهای لاگ را نشان میدهد:
cat /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
فایل messages هر روز مقداردهی مجدد میشود و چهار روز لاگ آنلاین نگهداری میشود. سایر فایلهای لاگ هفتگی چرخانده میشوند.
دایرکتیو postrotate مشخص میکند که پس از اتمام چرخش لاگ چه اقدامی انجام شود.
مرحله ششم: آزمایش چرخش لاگ
ابزار logrotate را میتوان بهصورت دستی برای بازیافت یک یا چند فایل اجرا کرد. فایل پیکربندی مربوطه را بهعنوان آرگومان مشخص کنید.
لیست جزئی از فایلهای لاگ در دایرکتوری /var/log در سرور آزمایشی CentOS:
ls -l /var/log
total 49324 … -rw-------. 1 root root 84103 Jan 3 17:20 messages -rw-------. 1 root root 165534 Dec 10 23:12 messages-20221211 -rw-------. 1 root root 254743 Dec 18 00:00 messages-20221218 -rw-------. 1 root root 217810 Dec 25 00:00 messages-20221225 -rw-------. 1 root root 237726 Dec 31 23:45 messages-20230101 drwx------. 2 root root 6 Mar 2 2022 private drwxr-xr-x. 2 root root 6 Feb 24 2022 qemu-ga lrwxrwxrwx. 1 root root 39 Mar 2 2022 README -> ../../usr/share/doc/systemd/README.logs -rw-------. 1 root root 2514753 Jan 3 17:25 secure -rw-------. 1 root root 2281107 Dec 10 23:59 secure-20221211 -rw-------. 1 root root 9402839 Dec 17 23:59 secure-20221218 -rw-------. 1 root root 8208657 Dec 25 00:00 secure-20221225 -rw-------. 1 root root 7081010 Dec 31 23:59 secure-20230101 drwxr-x---. 2 sssd sssd 6 Jan 17 2022 sssd -rw-------. 1 root root 0 Dec 8 22:11 tallylog -rw-rw-r--. 1 root utmp 2688 Jan 3 16:22 wtmp
بخشی از فایل logrotate.conf:
cat /etc/logrotate.conf
# see "man logrotate" for details # global options do not affect preceding include directives # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may also be configured here.
دستور logrotate را اجرا کنید:
logrotate -fv /etc/logrotate.conf
پیامهایی هنگام تولید فایلهای جدید یا مواجهه با خطاها نمایش داده میشود. سپس فایلهای جدید mail، secure یا messages را بررسی کنید:
ls -l /var/log/mail*
-rw------- 1 root root 0 Dec 17 18:34 /var/log/maillog -rw-------. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216 -rw------- 1 root root 359 Dec 17 18:25 /var/log/maillog-20131217
ls -l /var/log/messages*
-rw------- 1 root root 148 Dec 17 18:34 /var/log/messages -rw-------. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216 -rw------- 1 root root 30554 Dec 17 18:25 /var/log/messages-20131217
ls -l /var/log/secure*
-rw------- 1 root root 0 Jan 3 12:34 /var/log/secure -rw-------. 1 root root 4187 Jan 3 16:41 /var/log/secure-20230103 -rw------- 1 root root 591 Jan 3 18:28 /var/log/secure-20230103
هر سه فایل لاگ جدید ایجاد شدهاند. فایلهای maillog و secure هنوز خالی هستند، اما فایل messages دادههایی دارد.
نتیجهگیری
این آموزش باید ایدههایی درباره لاگگیری لینوکس به شما داده باشد. سیستمهای توسعه یا آزمایشی خود را بررسی کنید تا درک بهتری پیدا کنید. با آشنایی با مکان فایلهای لاگ و تنظیمات پیکربندی، از این دانش برای پشتیبانی از سیستمهای تولیدی استفاده کنید. میتوانید aliasهایی برای اشاره به این فایلها ایجاد کنید تا در تایپ صرفهجویی کنید.
درباره نویسندهها
صادقال حسین
متخصص فناوری اطلاعات با بیش از هجده سال تجربه در فناوریهای مختلف.
میلیشیا مکگرگور
نویسنده فنی ارشد در DigitalOcean.
تگها
- لینوکس
- لاگگیری
- Ubuntu
- Debian
- CentOS
- rsyslog
- logrotate
- عیبیابی