journalctl: پیدا کردن همان یک خط لاگ که لازم دارید
journalctl بدون هیچ گزینهای همهی لاگهای سیستم را از اولین بوت نشان میدهد، که تقریباً هیچوقت چیزی نیست که میخواهید. قدرتش در فیلترهاست.
فیلترهای پرکاربرد
journalctl -u nginx # فقط یک سرویس
journalctl -u nginx -u myapp # چند سرویس با هم
journalctl -b # از آخرین بوت
journalctl -b -1 # بوت قبلی
journalctl --since "09:00" --until "09:30"
journalctl --since yesterday
journalctl -p err # خطا و بالاتر
journalctl -k # پیامهای هسته
journalctl -f # دنبال کردن زنده
اینها با هم ترکیب میشوند. مثلاً خطاهای یک سرویس در یک ساعت گذشته:
journalctl -u myapp -p err --since "1 hour ago" --no-pager
--no-pager خروجی را یکجا چاپ میکند و برای استفاده در اسکریپت یا لوله کردن به grep لازم است.
وقتی سرور بیدلیل راهاندازی دوباره شده
آخرین خطهای بوت قبلی معمولاً دلیل را میگویند:
journalctl -b -1 -e
journalctl -k -b -1 | grep -i -E 'oom|killed process'
اگر هسته به خاطر کمبود حافظه فرایندی را کشته باشد، خطی با Out of memory: Killed process میبینید که نام فرایند و مقدار حافظهاش را دارد.
خروجی ساختاریافته
journalctl -u myapp -o json-pretty -n 1
journalctl -u myapp -o cat
-o cat فقط متن پیام را بدون زمان و نام میزبان چاپ میکند؛ اگر برنامه خودش JSON لاگ میکند، خروجی را میشود مستقیم به jq داد.
journal دیسک را پر نکند
journalctl --disk-usage
journalctl --vacuum-size=500M
برای محدودیت دائمی، در /etc/systemd/journald.conf مقدار SystemMaxUse=500M را بگذارید و systemctl restart systemd-journald بزنید. پیشفرض ده درصد اندازهی سیستمفایل است، که روی دیسکهای کوچک زیاد است.