مرجع سریع دستورات لاگگیری
این سند یک مرجع سریع برای پرکاربردترین دستورات لاگگیری در سیستمعامل لینوکس است. اگر میدانید بهدنبال چه چیزی هستید ولی نمیدانید کدام دستور را باید بزنید، اینجا را نگاه کنید. هر دستور با یک توضیح کوتاه فارسی همراه شده تا کاربرد آن سریعاً مشخص باشد.
این سند مکمل راهنمای راهنمای ذهنی لاگگیری در Rocky Linux است. آن راهنما به شما یاد میدهد چطور فکر کنید، و این سند دستورات دقیق را در اختیارتان میگذارد.
مکانهای اصلی لاگ در لینوکس
قبل از هر چیز، بدانید لاگها کجا ذخیره میشوند. بیشتر لاگها در /var/log/ قرار دارند، ولی بعضی سرویسها مسیر اختصاصی خودشان را دارند.
| مسیر | توضیح |
|---|---|
/var/log/ | مسیر اصلی نگهداری تمام لاگهای سیستمی |
/var/log/syslog | لاگ عمومی سیستم (Debian/Ubuntu) |
/var/log/messages | لاگ عمومی سیستم (RHEL/CentOS) |
/var/log/auth.log | لاگ احراز هویت و ورود (Debian) |
/var/log/secure | لاگ احراز هویت (RHEL/CentOS) |
/var/log/kern.log | لاگهای مربوط به کرنل |
/var/log/dmesg | پیامهای بوت و درایورها |
/var/log/boot.log | لاگ فرآیند بوت سیستم |
/var/log/cron | لاگ اجرای Cron Job ها |
/var/log/mail.log | لاگ سرویس ایمیل |
/var/log/apache2/ | لاگهای Apache (Debian) |
/var/log/httpd/ | لاگهای Apache (RHEL) |
/var/log/nginx/ | لاگهای Nginx |
/var/log/mysql/ | لاگهای MySQL |
/var/log/journal/ | لاگهای باینری systemd-journald |
مشاهدهی سادهی لاگها
دستور cat — نمایش کل محتوای فایل
cat تمام محتوای فایل را یکجا نمایش میدهد. برای فایلهای کوچک مناسب است، ولی برای فایلهای بزرگ توصیه نمیشود.
cat /var/log/syslog # نمایش کل فایل لاگ
cat -n /var/log/syslog # نمایش با شماره خط
cat file1.log file2.log # نمایش چند فایل پشت سر هم
دستور less — مشاهدهی صفحهبندیشده
less فایل را بهصورت تعاملی باز میکند و میتوانید داخل آن جستجو و حرکت کنید. برای فایلهای بزرگ بهترین گزینه است.
less /var/log/syslog # مشاهده تعاملی
less +F /var/log/syslog # مشاهده زنده (شبیه tail -f)
less +G /var/log/syslog # پرش به انتهای فایل
less -N /var/log/syslog # نمایش با شماره خط
کلیدهای مفید در less: /pattern جستجو به جلو · ?pattern جستجو به عقب · n نتیجهی بعدی · N نتیجهی قبلی · g ابتدای فایل · G انتهای فایل · q خروج.
دستور more — نمایش صفحهبهصفحه ساده
more نسخهی سادهتر و قدیمیتر less است. فقط به جلو حرکت میکند و امکانات کمتری دارد.
more /var/log/syslog # نمایش صفحه به صفحه (Space برای صفحه بعد)
مشاهدهی ابتدا و انتهای لاگ
دستور head — نمایش خطوط ابتدایی
head خطوط ابتدای فایل را نشان میدهد. بهطور پیشفرض ۱۰ خط اول.
head /var/log/syslog # ۱۰ خط اول (پیشفرض)
head -n 50 /var/log/syslog # ۵۰ خط اول
head -c 500 /var/log/syslog # ۵۰۰ بایت اول
دستور tail — نمایش خطوط انتهایی
tail مهمترین دستور لاگگیری است. خطوط انتهای فایل را نشان میدهد و با -f میتوانید لاگ را زنده دنبال کنید.
tail /var/log/syslog # ۱۰ خط آخر
tail -n 100 /var/log/syslog # ۱۰۰ خط آخر
tail -f /var/log/syslog # نمایش زنده (Follow)
tail -F /var/log/syslog # Follow حتی اگر فایل rotate شود
tail -n +100 /var/log/syslog # از خط ۱۰۰ به بعد
tail -f /var/log/syslog /var/log/auth.log # چند فایل همزمان
tail -f --pid=1234 /var/log/app.log # توقف پس از خاتمه پروسه
تفاوت -f و -F: اگر فایل rotate شود (مثلاً syslog به syslog.1 منتقل شود)، -f به فایل قدیمی میچسبد ولی -F فایل جدید را دنبال میکند. برای لاگهای production همیشه از -F استفاده کنید.
جستجو در لاگها با grep
grep مثل Ctrl+F در مرورگر است، ولی برای فایلها. پرکاربردترین ابزار جستجو در لاگهاست.
جستجوی پایه
grep "error" /var/log/syslog # جستجوی ساده کلمه
grep -i "error" /var/log/syslog # بدون حساسیت به حروف
grep -n "error" /var/log/syslog # نمایش شماره خط
grep -c "error" /var/log/syslog # شمارش تعداد تطابق
grep -v "info" /var/log/syslog # خطوطی که شامل info نیستند
grep -w "error" /var/log/syslog # تطابق کلمه کامل
grep -r "error" /var/log/ # جستجو در تمام فایلهای دایرکتوری
grep -l "error" /var/log/*.log # نمایش فقط نام فایلهای شامل تطابق
جستجوی پیشرفته
grep -A 5 "error" /var/log/syslog # ۵ خط بعد از تطابق
grep -B 5 "error" /var/log/syslog # ۵ خط قبل از تطابق
grep -C 5 "error" /var/log/syslog # ۵ خط قبل و بعد
grep -E "error|warning|fail" /var/log/syslog # چند کلمه (Regex)
grep -P "\d{3}" /var/log/syslog # Perl Regex
grep "error" /var/log/syslog | grep -v "test" # فیلتر پیاپی
tail -f /var/log/syslog | grep --line-buffered "error" # فیلتر زنده
grep "^Jan" /var/log/syslog # خطوط شروعشده با Jan
grep "failed$" /var/log/syslog # خطوط پایانیافته با failed
دستورات egrep و fgrep
egrep "error|fatal" /var/log/syslog # معادل grep -E
fgrep "192.168.1.1" /var/log/syslog # جستجوی رشته ثابت (سریعتر)
--line-buffered در ترکیب tail -f | grep حیاتی است. بدون آن، grep خروجی را در بافر نگه میدارد و لاگها با تأخیر نمایش داده میشوند.
کار با لاگهای Systemd (journalctl)
journalctl ابزار اصلی مشاهدهی لاگهای systemd است. در توزیعهای مدرن (از جمله Rocky Linux، Ubuntu، Debian) تمام سرویسهایی که با systemctl مدیریت میشوند، لاگهایشان در journal ذخیره میشود.
دستورات پایه
journalctl # نمایش تمام لاگهای systemd
journalctl -r # مرتبسازی معکوس (جدیدترین اول)
journalctl -n 50 # ۵۰ لاگ آخر
journalctl -f # نمایش زنده (Follow)
journalctl -e # پرش به انتها
journalctl --no-pager # بدون صفحهبندی
journalctl -k # فقط لاگهای کرنل
journalctl -b # لاگهای بوت فعلی
journalctl -b -1 # لاگهای بوت قبلی
journalctl --list-boots # لیست بوتها
فیلتر بر اساس سرویس و زمان
journalctl -u nginx.service # لاگ یک سرویس خاص
journalctl -u nginx -u php-fpm # چند سرویس همزمان
journalctl -u nginx -f # نمایش زنده سرویس
journalctl --since "2024-01-01" # از تاریخ مشخص
journalctl --since "1 hour ago" # یک ساعت اخیر
journalctl --since "yesterday" # از دیروز
journalctl --since "09:00" --until "10:00" # بازه ساعتی
journalctl --since today # فقط امروز
journalctl -p err # فقط خطاها
journalctl -p warning..err # بازه اولویت
سطوح اولویت (Priority Levels)
| کد | نام | توضیح |
|---|---|---|
0 | emerg | اضطراری — سیستم قابل استفاده نیست |
1 | alert | باید فوراً اقدام شود |
2 | crit | وضعیت بحرانی |
3 | err | خطا |
4 | warning | هشدار |
5 | notice | اطلاعات مهم |
6 | info | اطلاعات عمومی |
7 | debug | اطلاعات دیباگ |
فرمت خروجی و مدیریت
journalctl -o json # خروجی JSON
journalctl -o json-pretty # JSON خوانا
journalctl -o short-iso # تاریخ ISO
journalctl -o cat # فقط پیامها بدون timestamp
journalctl --disk-usage # حجم اشغالی journal
journalctl --verify # بررسی سلامت لاگها
journalctl --vacuum-time=7d # حذف لاگهای قدیمیتر از ۷ روز
journalctl --vacuum-size=500M # محدود کردن حجم به ۵۰۰ مگ
journalctl --rotate # چرخش دستی لاگ
journalctl _PID=1234 # لاگهای یک PID
journalctl _UID=1000 # لاگهای یک کاربر
journalctl /usr/bin/sshd # لاگهای یک باینری
journalctl --vacuum-time و --vacuum-size لاگها را برای همیشه حذف میکنند. قبل از اجرا مطمئن شوید به آنها نیازی ندارید.
لاگهای کرنل با dmesg
dmesg پیامهای کرنل را نمایش میدهد — شامل رویدادهای بوت، خطاهای سختافزاری، مشکلات درایورها و پیامهای شبکه.
dmesg # نمایش پیامهای کرنل
dmesg -T # نمایش با تاریخ خوانا
dmesg -H # حالت human-readable + رنگی
dmesg -w # نمایش زنده (Wait/Follow)
dmesg -l err,warn # فیلتر بر اساس سطح
dmesg --facility=kern # فیلتر بر اساس facility
dmesg | grep -i usb # فقط پیامهای USB
dmesg | grep -i error # فقط خطاها
dmesg -c # خواندن و پاک کردن بافر
dmesg --clear # پاک کردن بافر
دستورات لاگ ورود کاربران
این دستورات تاریخچهی ورود و خروج کاربران را نشان میدهند — چه از فایلهای wtmp/btmp و چه از وضعیت فعلی سیستم.
last # لاگ ورودهای موفق کاربران
last -n 20 # ۲۰ ورود آخر
last username # ورودهای یک کاربر خاص
last reboot # تاریخچه ریبوتها
last -x shutdown # تاریخچه shutdown
lastb # تلاشهای ورود ناموفق
lastlog # آخرین ورود همه کاربران
lastlog -u root # آخرین ورود کاربر خاص
who # کاربران فعلی سیستم
who -a # جزئیات کامل
w # کاربران فعلی + فعالیت
users # لیست ساده کاربران آنلاین
برش و پردازش لاگ
دستور awk
awk ابزار پردازش ستونی است. وقتی لاگ ساختار ستونی دارد (مثل access.log)، awk بهترین انتخاب است.
awk '{print $1}' /var/log/syslog # ستون اول هر خط
awk '{print $1, $2, $3}' /var/log/syslog # چند ستون
awk '/error/ {print}' /var/log/syslog # فیلتر خطوط خطا
awk 'NR==10' /var/log/syslog # فقط خط شماره ۱۰
awk 'NR>=10 && NR<=20' /var/log/syslog # خطوط ۱۰ تا ۲۰
awk '{count[$5]++} END {for(x in count) print x, count[x]}' access.log # شمارش بر اساس ستون
دستورات sed و cut
sed -n '10,20p' /var/log/syslog # نمایش خطوط ۱۰ تا ۲۰
sed -n '/error/p' /var/log/syslog # نمایش خطوط شامل error
sed '/^$/d' /var/log/syslog # حذف خطوط خالی
sed 's/error/ERROR/g' /var/log/syslog # جایگزینی
cut -d' ' -f1,2,3 /var/log/syslog # برش با جداکننده فاصله
cut -c1-15 /var/log/syslog # کاراکترهای ۱ تا ۱۵
دستورات sort، uniq و wc
sort /var/log/syslog # مرتبسازی
sort -r /var/log/syslog # مرتبسازی معکوس
sort -u /var/log/syslog # حذف تکراریها
sort file.log | uniq -c # شمارش موارد تکراری
sort file.log | uniq -c | sort -rn # مرتب بر اساس تکرار
wc -l /var/log/syslog # شمارش خطوط
wc -w /var/log/syslog # شمارش کلمات
wc -c /var/log/syslog # شمارش بایت
کار با لاگهای فشرده شده
لاگهای قدیمی معمولاً با gzip، bzip2 یا xz فشرده میشوند تا فضای دیسک کمتری اشغال کنند. برای خواندن و جستجو در آنها از نسخهی z* همان ابزارها استفاده کنید.
zcat /var/log/syslog.1.gz # نمایش فایل gz
zless /var/log/syslog.1.gz # less برای gz
zmore /var/log/syslog.1.gz # more برای gz
zgrep "error" /var/log/syslog.*.gz # grep در فایلهای gz
zegrep "error|fail" /var/log/*.gz # egrep در gz
bzcat file.log.bz2 # نمایش bz2
bzgrep "error" file.log.bz2 # grep در bz2
xzcat file.log.xz # نمایش xz
xzgrep "error" file.log.xz # grep در xz
برای لاگهای چرخشیافته (مثل syslog.1.gz، syslog.2.gz و...)، میتوانید با الگوی * همه را یکجا جستجو کنید: zgrep "error" /var/log/syslog.*.gz. این روش برای ردیابی مشکلات قدیمی بسیار مفید است.
مدیریت چرخش لاگ با logrotate
logrotate مسئول چرخش، فشردهسازی و حذف لاگهای قدیمی است. بدون آن، لاگها دیسک را پر میکنند.
cat /etc/logrotate.conf # فایل اصلی تنظیمات
ls /etc/logrotate.d/ # تنظیمات هر سرویس
logrotate -d /etc/logrotate.conf # تست بدون اجرا (Debug)
logrotate -f /etc/logrotate.conf # اجرای اجباری چرخش
logrotate -v /etc/logrotate.d/nginx # اجرا با نمایش جزئیات
cat /var/lib/logrotate/status # وضعیت آخرین چرخشها
نمونه فایل کانفیگ logrotate
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
}
هر خط این کانفیگ یک رفتار را تعریف میکند:
| دستور | معنی |
|---|---|
daily | چرخش روزانه |
rotate 7 | نگهداشتن ۷ نسخهی قدیمی |
compress | فشردهسازی نسخههای قدیمی |
delaycompress | فشردهسازی با یک چرخه تأخیر |
missingok | اگر فایل نبود، خطا نده |
notifempty | فایل خالی را چرخش نده |
create 0640 www-data adm | ساخت فایل جدید با مالکیت مشخص |
نوشتن لاگ با logger
logger به شما اجازه میدهد از داخل اسکریپت یا خط فرمان، پیام به syslog بفرستید. برای ردیابی رویدادهای سفارشی بسیار مفید است.
logger "پیام تست" # ارسال پیام به syslog
logger -p user.info "پیام اطلاعاتی" # با تعیین اولویت
logger -t myapp "خطای برنامه" # با تگ (tag)
logger -f /path/to/file # ارسال محتوای فایل
logger -s "پیام خطا" # ارسال + نمایش در stderr
echo "خطا" | logger -t backup # ارسال از pipe
تگ (-t) به شما اجازه میدهد پیامهای برنامهی خودتان را بعداً راحت پیدا کنید: journalctl -t myapp --since "1 hour ago".
لاگهای امنیتی و Audit
دستور auditd و ausearch
سیستم Audit هر عمل حساس روی سیستم را ثبت میکند — تغییر فایلهای مهم، اجرای دستورات با sudo، تلاشهای ورود و بلاکهای SELinux.
systemctl status auditd # وضعیت سرویس audit
ausearch -m USER_LOGIN # جستجوی رویدادهای ورود
ausearch -ua username # رویدادهای یک کاربر
ausearch -f /etc/passwd # دسترسی به فایل خاص
ausearch -ts today # رویدادهای امروز
ausearch -k mykey # جستجو با کلید تعریفشده
aureport # گزارش کلی audit
aureport -au # گزارش احراز هویت
aureport -l # گزارش ورودها
aureport -f # گزارش دسترسی فایلها
auditctl -l # لیست قوانین فعال
auditctl -w /etc/passwd -p wa -k passwd_changes # افزودن قانون
افزودن قانون auditctl -w /etc/passwd -p wa -k passwd_changes به شما اجازه میدهد هر نوشتن (write) یا تغییر ویژگی (attribute) روی فایل /etc/passwd را ردیابی کنید. این برای محیطهای حساس توصیه میشود.
لاگهای وب سرور
Nginx
tail -f /var/log/nginx/access.log # لاگ دسترسی زنده
tail -f /var/log/nginx/error.log # لاگ خطا زنده
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # پرترافیکترین IPها
grep " 404 " /var/log/nginx/access.log # خطاهای 404
grep " 500 " /var/log/nginx/access.log # خطاهای 500
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head # پربازدیدترین URLها
Apache
tail -f /var/log/apache2/access.log # Debian/Ubuntu
tail -f /var/log/httpd/access_log # RHEL/CentOS
tail -f /var/log/apache2/error.log # خطاهای Apache
لاگهای Apache در RHEL با پسوند _log و در Debian با پسوند .log نامگذاری میشوند. این تفاوت در اسکریپتهای چندسکویی مهم است.
مانیتورینگ زندهی چند لاگ
وقتی باید همزمان چند لاگ را زیر نظر داشته باشید، ابزارهای تخصصی به کار میآیند.
multitail /var/log/syslog # مشاهده تعاملی لاگ
multitail /var/log/syslog /var/log/auth.log # چند لاگ همزمان
multitail -i /var/log/nginx/access.log -i /var/log/nginx/error.log # در پنجرههای جداگانه
lnav /var/log/syslog # مشاهدهگر پیشرفته لاگ
lnav /var/log/ # تمام لاگهای یک دایرکتوری
lnav قابلیتهای پیشرفتهای دارد: جستجوی SQL-like، فیلتر، هایلایت خودکار خطاها، و پیمایش زمانی. اگر لاگها را زیاد بررسی میکنید، ارزش یادگیری دارد.
لاگهای شبکه و فایروال
journalctl -u ufw # لاگ UFW
journalctl -u firewalld # لاگ firewalld
grep "UFW BLOCK" /var/log/syslog # بلاکهای UFW
iptables -L -v -n # نمایش قوانین + شمارنده
journalctl -u ssh # لاگ SSH
grep "Failed password" /var/log/auth.log # تلاشهای ناموفق SSH
grep "Accepted" /var/log/auth.log # ورودهای موفق SSH
fail2ban-client status # وضعیت fail2ban
fail2ban-client status sshd # وضعیت jail SSH
مدیریت سرویسهای لاگگیری
systemctl status rsyslog # وضعیت rsyslog
systemctl restart rsyslog # ریستارت rsyslog
cat /etc/rsyslog.conf # فایل کانفیگ rsyslog
ls /etc/rsyslog.d/ # کانفیگهای اضافی
rsyslogd -N1 # تست صحت کانفیگ
systemctl status systemd-journald # وضعیت journald
systemctl restart systemd-journald # ریستارت journald
cat /etc/systemd/journald.conf # کانفیگ journald
ذخیره و انتقال خروجی لاگ
grep "error" /var/log/syslog > errors.txt # ذخیره در فایل
grep "error" /var/log/syslog >> errors.txt # الحاق به فایل
journalctl -u nginx > nginx.log # خروجی journal به فایل
journalctl -u nginx --since today | gzip > today.log.gz # فشردهسازی همزمان
tail -f /var/log/syslog | tee output.log # نمایش + ذخیره
scp /var/log/syslog user@server:/backup/ # انتقال به سرور
tee خروجی را همزمان روی صفحه و در فایل مینویسد. برای دیباگ زندهی یک مشکل و ذخیرهی همزمان آن بسیار مفید است. اگر میخواهید فایل قبلی پاک نشود، از tee -a استفاده کنید.
تحلیل و آمارگیری از لاگ
grep -c "error" /var/log/syslog # تعداد خطاها
awk '{print $5}' access.log | sort | uniq -c | sort -rn # آمار پرتکرارترینها
grep "Failed password" auth.log | awk '{print $11}' | sort -u # IPهای حملهکننده
grep "Failed password" auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head # ۱۰ IP برتر حمله
awk '$9 == 500' access.log | wc -l # تعداد خطای 500
du -sh /var/log/* # حجم هر لاگ
find /var/log -type f -size +100M # لاگهای بزرگتر از ۱۰۰ مگ
find /var/log -type f -mtime +30 # لاگهای قدیمیتر از ۳۰ روز
ترکیب awk + sort + uniq -c + sort -rn یک الگوی طلایی برای هر نوع آمارگیری از لاگ است. اگر ستون موردنظر را میدانید، این چهار دستور تقریباً هر سؤالی را جواب میدهند.
پاکسازی و مدیریت حجم لاگ
> /var/log/syslog # خالی کردن فایل بدون حذف
truncate -s 0 /var/log/syslog # خالی کردن (روش بهتر)
cat /dev/null > /var/log/syslog # روش کلاسیک
find /var/log -name "*.gz" -mtime +30 -delete # حذف gz های قدیمی
journalctl --vacuum-time=30d # حذف journal قدیمی
journalctl --vacuum-size=1G # محدود کردن به ۱ گیگ
هرگز فایل لاگ را با rm حذف نکنید. سرویسهایی که فایل را باز نگه داشتهاند، به نوشتن در آن ادامه میدهند اما فضای دیسک آزاد نمیشود (تا زمانی که سرویس ریاستارت شود). همیشه از truncate یا > استفاده کنید.
جدول خلاصهی ابزارهای مهم لاگگیری
| ابزار | کاربرد اصلی |
|---|---|
cat | نمایش کل محتوای فایل |
less / more | مشاهده صفحهبندی شده و تعاملی |
head / tail | نمایش خطوط ابتدا / انتها |
tail -f | مشاهده زنده لاگ |
grep | جستجوی متن در لاگ |
awk | پردازش ستونی و آماری |
sed | جایگزینی و ویرایش متن |
journalctl | لاگهای systemd |
dmesg | لاگهای کرنل |
last / lastlog / lastb | تاریخچه ورود کاربران |
who / w | کاربران آنلاین فعلی |
logger | نوشتن لاگ به syslog |
logrotate | مدیریت چرخش لاگها |
zgrep / zcat | کار با لاگهای فشرده |
multitail / lnav | مانیتورینگ چند لاگ همزمان |
ausearch / aureport | تحلیل لاگهای امنیتی audit |
fail2ban-client | مدیریت بلاک IPهای مخرب |
خلاصه
- برای مشاهدهی سریع:
catبرای فایلهای کوچک،lessبرای فایلهای بزرگ،tail -fبرای مشاهدهی زنده. - برای جستجو:
grepبا ترکیب-i،-n،-A/-B/-Cو-Eتقریباً هر نیاز جستجویی را پوشش میدهد. - برای لاگهای systemd:
journalctlبا فیلترهای-u،--since/--until،-pو-bابزار اصلی است. - برای تحلیل و آمار: ترکیب
awk+sort+uniq -c+sort -rnیک الگوی تکرارشدنی برای هر نوع آمارگیری از لاگ است. - برای مدیریت حجم:
logrotateرا تنظیم کنید وjournalctl --vacuum-*را بشناسید. هرگز باrmفایل لاگ را حذف نکنید.