journalctl: خواندن و فیلتر لاگهای systemd
چگونه با journalctl لاگ واحدها، بوتها و بازههای زمانی را ببینید؛ دنبالکردن زنده و اشتباههای رایج journal.
Founder & product engineer

وقتی `systemctl status` فقط میگوید failed، داستان کامل معمولاً در journal است. journald لاگهای ساختیافته را از هسته، سرویسها و stdout/stderr واحدها جمع میکند. journalctl ابزار پرسوجوی همان ذخیرهگاه است — با فیلتر روی واحد، بوت، اولویت و زمان.
بدون journalctl، بین چند فایل در /var/log و چرخش logrotate گم میشوید؛ با آن هم اگر فیلتر نکنید در سیلاب خطوط غرق میشوید. این مقاله فیلترهای پرکاربرد را با فرمان واقعی نشان میدهد.

پاسخ کوتاه
برای یک سرویس: `journalctl -u name.service -e`. برای دنبالکردن زنده: `-f`. برای بوت جاری: `-b` و برای بوت قبلی `-b -1`. بازهٔ زمانی با `--since`/`--until`. اولویت با `-p`. روی سرورهای پرلاگ همیشه بازه یا واحد را تنگ کنید؛ خروجی بدون فیلتر برای انسان نیست.
اول واحد و زمان را قفل کنید؛ بعد متن را بخوانید — نه برعکس.
دیدن لاگ یک سرویس
bash
journalctl -u ssh.service journalctl -u nginx.service -e journalctl -u nginx.service -n 100 --no-pager
-e پرش به انتها، -n تعداد خطوط، --no-pager برای اسکریپت و کپی. روی اوبونتو واحد SSH معمولاً ssh.service است.
bash
journalctl -u ssh.service -u systemd-networkd.service --since '1 hour ago'
دنبالکردن زنده
bash
journalctl -u myapp.service -f journalctl -f -p err
معادل عملیاتی tail -f برای journal. هنگام Reproduce خطا یک ترمینال -f باز بگذارید و در دیگری سرویس را restart کنید.
بوتها: جدا کردن داستان هر بالاآمدن
bash
journalctl --list-boots journalctl -b journalctl -b -1 journalctl -b -1 -p err
وقتی «بعد از ریبوت خراب شد»، بوت قبلی (-b -1) را با بوت جاری مقایسه کنید. بسیاری از خطاهای文件系统 و شبکه فقط در پنجرهٔ بوت دیده میشوند.
زمان و اولویت
bash
journalctl --since '2026-09-05 10:00:00' --until '2026-09-05 11:30:00' journalctl --since '30 min ago' -p warning journalctl -p err..alert
سطوح اولویت از emerg تا debug شبیه syslog هستند. برای نویز کمتر از err یا warning شروع کنید، بعد در صورت نیاز پایین بیایید.
فیلدهای ساختیافته
journal فقط متن نیست؛ فیلدهایی مثل _PID، _UID، PRIORITY، SYSLOG_IDENTIFIER دارد.
bash
journalctl _UID=33 -n 50 journalctl SYSLOG_IDENTIFIER=sudo -n 20 journalctl -o verbose -n 1
خروجی verbose همهٔ فیلدها را نشان میدهد؛ برای فهم اینکه چه کلیدی فیلتر کنید مفید است. خروجی json برای لوله به ابزار دیگر:
bash
journalctl -u myapp -n 5 -o json-pretty
هسته و دیسک
bash
journalctl -k -b journalctl --disk-usage journalctl --vacuum-size=200M journalctl --vacuum-time=14d
-k پیامهای کرنل (شبیه dmesg یکپارچه با journal). vacuum برای کنترل رشد ذخیرهگاه پایا — سیاست دقیقتر در journald.conf است. روی سیستمهای volatile ممکن است journal فقط در حافظه باشد و بعد از ریبوت پاک شود.
دسترسی و مجوز
کاربر عادی معمولاً فقط لاگهای خودش را میبیند. برای لاگ سیستم به عضویت گروه systemd-journal یا sudo نیاز دارید. در تیمها، بهجای دادن root کامل، عضویت گروه journal را بررسی کنید.
bash
id ls -l /var/log/journal 2>/dev/null | head
الگوی عیبیابی ۱۵ دقیقهای
- systemctl --failed را ببینید.
- journalctl -u UNIT -b -p err..warning --no-pager
- اگر خالی بود بازه را بازتر یا اولویت را پایینتر کنید.
- با -o verbose یک خط نمونه را برای فیلدها بشکافید.
- اگر به بوت مربوط است --list-boots و -b -1 را مقایسه کنید.
bash
systemctl --failed journalctl -u UNIT -b -p err --no-pager | tail -n 50
journal در برابر فایلهای سنتی
هنوز هم rsyslog یا فایلهای /var/log/nginx/ ممکن است موازی باشند. journal برای واحدهای systemd و همبستگی زمانی عالی است؛ فایل اپ ممکن است قالب دامنهٔ خودش را داشته باشد. هر دو را بشناسید؛ یکی را مذهب نکنید.
اشتباههای رایج
- اجرای journalctl بدون فیلتر روی سرور پرلاگ و گیر کردن در pager.
- فراموش --no-pager در CI/اسکریپت.
- جستوجوی فقط در /var/log درحالیکه سرویس فقط به journal مینویسد.
- vacuum تهاجمی بلافاصله پس از حادثه و پاک کردن شواهد.
- فرض پایا بودن journal روی همهٔ ابرتصویرها.
خلاصه
journalctl چشم شما به شکستهای systemd است: واحد، بوت، زمان، اولویت. با -f زنده ببینید، با -b داستان ریبوت را جدا کنید، و قبل از پاکسازی حجم، تحقیق را تمام کنید. در کنار systemctl، بخش زیادی از عیبیابی سرور لینوکس مدرن همین دو فرمان است.
سوالات متداول
چرا journalctl خالی است؟
مجوز کم، واحد اشتباه، journal volatile پس از ریبوت، یا فیلتر زمانی/اولویت بیش از حد تنگ. اول بدون -p و با -n 50 روی همان -u امتحان کنید.
چطور فقط امروز را ببینم؟
`journalctl --since today` یا `--since '00:00'` بههمراه واحد مورد نظر.
منابع و مراجع
- journalctl(1): https://www.freedesktop.org/software/systemd/man/latest/journalctl.html
- systemd-journald.service(8): https://www.freedesktop.org/software/systemd/man/latest/systemd-journald.service.html
- systemd.journal-fields(7): https://www.freedesktop.org/software/systemd/man/latest/systemd.journal-fields.html
Author
Soheil Ebrahimpour is the founder of FutureForge. He works on product design, architecture, and getting custom software into production.
Related notes
If you are unsure about architecture or the build path, we can talk about the project.
Describe the problem and the constraints. If there is a fit, we will schedule a conversation.




