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 بزنید. پیش‌فرض ده درصد اندازه‌ی سیستم‌فایل است، که روی دیسک‌های کوچک زیاد است.