Kumbukumbu za Linux: journalctl, /var/log, rsyslog na logrotate
Kwenye usambazaji wa kisasa wa Linux kumbukumbu hukusanywa na journald, na kusomwa kwa amri ya journalctl: journalctl -u nginx huonyesha rekodi za huduma moja, -f ni mtiririko wa wakati halisi, na --since na -p huchuja kwa muda na uzito. Kumbukumbu za maandishi ziko kwenye /var/log, zinaandikwa na rsyslog au programu yenyewe, na logrotate huzibana na kufuta za zamani ili diski isijae.
Huduma ilipoanguka usiku, jibu karibu kila mara liko kwenye kumbukumbu — swali ni wapi pa kuzitafuta. Kwenye usambazaji wa kisasa (Ubuntu, Debian, RHEL, Fedora, Arch) matukio hukusanywa na huduma ya journald, na yanasomwa kwa amri journalctl. Wakati huo huo programu nyingi huandika faili za maandishi za kawaida kwenye /var/log, na ukubwa wake unasimamiwa na logrotate. Hapa chini ni jinsi ya kufanya kazi na kumbukumbu za journalctl za Linux kwa vitendo, mahali zilipo kumbukumbu nyingine, na jinsi ya kutopoteza taarifa muhimu wakati wa mzunguko.
Kumbukumbu zinahifadhiwa wapi kwenye Linux
Vyanzo ni vitatu, na ni vizuri kuvikumbuka kama ramani:
- journald — jarida la binary la systemd. Hupokea stdout na stderr za huduma zote, ujumbe wa kernel na syslog. Huhifadhiwa kwenye
/var/log/journal/(kudumu) au/run/log/journal/(hadi kuwasha upya). - /var/log — faili za maandishi. Zinaandikwa na
rsyslog(kwa mfano/var/log/syslog,/var/log/auth.log) au na programu zenyewe: nginx, PostgreSQL, MySQL. - Bafa ya mzunguko ya kernel — ujumbe wa madereva na vifaa, unaonyeshwa na
dmesgaujournalctl -k.
| Faili | Ina nini |
|---|---|
/var/log/syslog (Debian/Ubuntu) | jarida kuu la mfumo |
/var/log/messages (RHEL/Fedora) | jambo hilo hilo kwenye familia ya Red Hat |
/var/log/auth.log au /var/log/secure | kuingia, sudo, SSH |
/var/log/kern.log | ujumbe wa kernel |
/var/log/dpkg.log, /var/log/apt/ | usakinishaji wa vifurushi |
/var/log/nginx/ | access.log na error.log za seva ya wavuti |
/var/log/wtmp, /var/log/btmp | majarida ya binary ya kuingia, yanasomwa kwa last na lastb |
Faili nyingi kwenye /var/log zinapatikana kwa root au kwa kundi adm pekee, kwa hiyo amri za kusoma mara nyingi zinahitaji sudo.
journalctl: amri za msingi
Bila hoja yoyote, journalctl huonyesha jarida lote kuanzia rekodi za zamani kabisa kupitia pager less. Hii si mara nyingi inayohitajika — kwa kawaida uchaguzi hupunguzwa mara moja.
journalctl # jarida lote, kutoka za zamani hadi mpya
journalctl -e # fungua moja kwa moja mwishoni
journalctl -n 50 # mistari 50 ya mwisho
journalctl -r # kwa mpangilio wa nyuma, mpya juu
journalctl --no-pager # bila less, ni rahisi kwa script na grep
Ndani ya pager zinafanya kazi funguo za kawaida za less: / — tafuta, G — nenda mwishoni, q — toka. Mistari mirefu hukatwa kwa upana wa skrini; mishale ya kushoto na kulia huisogeza.
Kumbukumbu za huduma moja: journalctl -u
Hali ya kawaida zaidi ni kuona kile kitengo kimoja cha systemd kilichoandika. Hakuna haja ya kutafuta faili na kuigrep:
$ sudo journalctl -u nginx -n 20
Oct 14 03:12:41 web1 systemd[1]: Starting nginx.service - A high performance web server...
Oct 14 03:12:41 web1 nginx[1834]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Oct 14 03:12:41 web1 systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Oct 14 03:12:41 web1 systemd[1]: nginx.service: Failed with result 'exit-code'.
Bendera -u inaweza kurudiwa: journalctl -u nginx -u php8.2-fpm itaonyesha huduma zote mbili zikichanganyika kwa muda, jambo linalosaidia wakati kosa linatokea kwenye mpaka wa huduma mbili. Kwa vitengo vya mtumiaji (systemctl --user) tumia journalctl --user -u jina.
Kumbukumbu kwa wakati halisi: journalctl -f
sudo journalctl -u nginx -f
Hii ni sawa na tail -f: amri inaonyesha rekodi 10 za mwisho na kisha inasubiri mpya. Ni rahisi kuiweka kwenye terminal nyingine wakati unaanzisha upya huduma au unarudia kosa. Kutoka — Ctrl+C.
Vichujio vya muda na kuwasha
Ukijua ajali ilitokea saa ngapi, chagua kwa muda kwa bendera --since na --until. Zinaelewa tarehe kamili na pia thamani za jamaa:
journalctl --since "2026-10-14 02:50" --until "2026-10-14 03:30"
journalctl --since "1 hour ago"
journalctl --since yesterday --until today
journalctl -u nginx --since "10 min ago"
Njia nyingine muhimu ya kuchuja ni kwa kuwasha kwa mfumo. Ikiwa seva ilijiwasha upya yenyewe, sababu inatafutwa mwishoni mwa kipindi kilichotangulia:
$ journalctl --list-boots
-2 8f1c... Sat 2026-10-12 09:01:12 UTC Sun 2026-10-13 22:47:03 UTC
-1 a7d2... Sun 2026-10-13 22:48:30 UTC Tue 2026-10-14 03:05:51 UTC
0 c3e9... Tue 2026-10-14 03:07:02 UTC Tue 2026-10-14 09:15:40 UTC
$ journalctl -b -1 -e # mwisho wa kuwasha kilichotangulia
$ journalctl -b # kuwasha kwa sasa pekee
Orodha ya kuwasha inapatikana tu ikiwa jarida linahifadhiwa kwenye diski. Jinsi ya kuwezesha hilo — hapa chini, sehemu ya usanidi wa journald.
Kichujio cha uzito: journalctl -p
Kila rekodi ina kiwango cha syslog kutoka 0 hadi 7. Bendera -p inaonyesha kiwango kilichotajwa na vyote vilivyo juu yake:
| Msimbo | Jina | Hutumika lini |
|---|---|---|
| 0 | emerg | mfumo hauwezi kufanya kazi |
| 1 | alert | inahitaji hatua ya haraka |
| 2 | crit | hitilafu kubwa |
| 3 | err | hitilafu |
| 4 | warning | onyo |
| 5 | notice | tukio muhimu lakini la kawaida |
| 6 | info | ujumbe wa taarifa |
| 7 | debug | utatuzi |
journalctl -p err -b # makosa yote tangu kuwasha
journalctl -p warning..err -u ssh # safu ya viwango kwa huduma moja
Amri journalctl -p err -b ni ukaguzi mzuri wa kwanza baada ya kuwasha upya au sasisho: ndani ya sekunde inaonyesha kilichoenda vibaya.
Utafutaji na vichujio vingine
journald huhifadhi sehemu zilizopangwa kwa kila rekodi, na unaweza kuchuja kwa hizo bila grep:
journalctl _PID=1834 # kwa namba ya mchakato
journalctl _COMM=sshd # kwa jina la programu
journalctl _UID=1000 # kwa mtumiaji
journalctl /usr/sbin/sshd # kwa njia ya faili inayotekelezwa
journalctl -k # ujumbe wa kernel pekee (kama dmesg)
journalctl -t CRON # kwa kitambulisho cha syslog
journalctl -g "Out of memory" # tafuta kwa maandishi, kwa regex
Bendera -g (--grep) ilionekana katika systemd 237; kwenye mifumo ya zamani tumia mkondo wa kawaida journalctl --no-pager | grep .... Vichujio vya sehemu tofauti vinaunganishwa kwa «NA», kwa hiyo journalctl -u nginx -p err --since today itarudisha makosa ya nginx ya leo pekee.
Miundo ya pato
Bendera -o hubadilisha muundo. Chaguo muhimu zaidi:
-o short-iso— muda katika ISO 8601, ni rahisi kulinganisha na kumbukumbu za programu.-o verbose— sehemu zote za rekodi, pamoja na_SYSTEMD_UNIT,_PID,_BOOT_ID.-o jsonaujson-pretty— kwa usindikaji kwa script aujq.-o cat— maandishi ya ujumbe pekee, bila tarehe na jina la mwenyeji.
journalctl -u myapp -o json --since today | jq -r '.MESSAGE'
Usanidi wa journald: uhifadhi na ukubwa
Mipangilio iko kwenye /etc/systemd/journald.conf (marekebisho ni rahisi kuweka kwenye /etc/systemd/journald.conf.d/*.conf). Kigezo kikuu ni Storage:
persistent— jarida linaandikwa kwenye diski/var/log/journalna linaishi baada ya kuwasha upya.volatile— kwenye kumbukumbu tu,/run/log/journal.auto(chaguo-msingi) — diski, ikiwa saraka/var/log/journalipo.
Kwenye picha ndogo za mfumo saraka hiyo haipo, na baada ya kuwasha upya historia inapotea. Kuwezesha uhifadhi wa kudumu:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
Ili jarida lisichukue diski yote, weka mipaka:
# /etc/systemd/journald.conf.d/size.conf
[Journal]
Storage=persistent
SystemMaxUse=500M
MaxRetentionSec=1month
Kwa chaguo-msingi SystemMaxUse ni 10% ya ukubwa wa mfumo wa faili, lakini si zaidi ya GB 4.
Jinsi ya kusafisha jarida la journalctl
$ journalctl --disk-usage
Archived and active journals take up 1.8G in the file system.
sudo journalctl --vacuum-size=300M # acha si zaidi ya MB 300
sudo journalctl --vacuum-time=2weeks # futa rekodi zilizo zaidi ya wiki mbili
sudo journalctl --rotate # funga faili zinazotumika ili nazo ziweze kufutwa
Usifute faili kutoka /var/log/journal kwa rm: vacuum hufanya kazi hiyo kwa usalama na haigusi faili inayotumika.
rsyslog: kumbukumbu za maandishi za kawaida
rsyslog ni daemon inayopokea ujumbe wa syslog (ikiwemo zilizopelekwa kutoka journald) na kuyapanga kwenye faili kwa kanuni. Usanidi uko kwenye /etc/rsyslog.conf na /etc/rsyslog.d/*.conf. Kanuni inaundwa na kichagua chanzo.kiwango na kitendo:
# /etc/rsyslog.d/50-default.conf (sehemu)
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
kern.* -/var/log/kern.log
Alama ya kistari kabla ya njia inamaanisha kuandika bila kusawazisha diski baada ya kila mstari — ni haraka zaidi, lakini ajali ikitokea mistari ya mwisho inaweza kupotea. Baada ya kubadilisha usanidi, kagua sintaksia na uanzishe huduma upya:
sudo rsyslogd -N1
sudo systemctl restart rsyslog
Jambo kuu ambalo rsyslog inabaki nalo kando ya journald ni kutuma kumbukumbu kwa seva kuu. Mstari mmoja unatuma kila kitu kwa TCP:
# /etc/rsyslog.d/90-remote.conf
*.* @@logs.example.com:514
Ishara moja @ ina maana UDP, mbili @@ — TCP. Seva ikifa kabisa, nakala ya kumbukumbu inabaki kwenye mashine nyingine. Ili kuandika ujumbe wako kwenye jarida la mfumo kutoka script, tumia logger:
logger -t backup -p user.err "Backup ya database imeshindwa"
journalctl -t backup -n 5
logrotate: mzunguko wa kumbukumbu
Faili za maandishi hukua bila kikomo hadi mtu azikate. Kazi hii inafanywa na logrotate: mara moja kwa siku (kupitia cron au timer ya logrotate.timer) hubadilisha jina la faili ya sasa, hubana za zamani na kufuta zile za kale zaidi. Mipangilio ya jumla iko kwenye /etc/logrotate.conf, kanuni za programu kwenye /etc/logrotate.d/.
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 myapp adm
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
| Maelekezo | Maana |
|---|---|
daily / weekly / size 100M | wakati wa kuzungusha |
rotate 14 | faili ngapi za zamani kuhifadhi |
compress, delaycompress | bana kwa gzip, lakini acha kumbukumbu mpya zaidi bila kubanwa |
missingok, notifempty | usilalamike faili ikikosekana, usizungushe tupu |
create 0640 user group | faili mpya itaundwa kwa ruhusa zipi |
copytruncate | nakili na ufute yaliyomo — kwa programu zisizoweza kufungua upya kumbukumbu |
postrotate ... endscript | amri baada ya mzunguko, kwa kawaida ishara kwa programu kufungua upya faili |
Kukagua kanuni bila mabadiliko na kulazimisha mzunguko:
sudo logrotate -d /etc/logrotate.d/myapp # jaribio kavu lenye maelezo
sudo logrotate -f /etc/logrotate.d/myapp # zungusha sasa hivi
Kosa la kawaida ni kusahau postrotate au copytruncate. Hapo programu inaendelea kuandika kwenye app.log.1 iliyobadilishwa jina kupitia kipini cha zamani, na app.log mpya inabaki tupu.
Kusoma kumbukumbu za maandishi
Kwa faili zilizo kwenye /var/log zana za kawaida zinatosha:
sudo tail -n 100 /var/log/syslog # mistari ya mwisho
sudo tail -F /var/log/nginx/error.log # fuatilia, ukistahimili mzunguko
sudo less +G /var/log/auth.log # fungua mwishoni
sudo zgrep "Failed password" /var/log/auth.log.*.gz # tafuta kwenye kumbukumbu zilizobanwa
sudo grep -c " 500 " /var/log/nginx/access.log # majibu 500 ni mangapi
Zingatia tail -F yenye herufi kubwa: tofauti na -f, hufungua faili upya logrotate inapoibadilisha.
Uchambuzi wa ajali hatua kwa hatua
Hali ya «huduma ilianguka usiku» ni rahisi kuchambua kwa mpangilio huu:
systemctl status myapp— hali ya sasa na mistari ya mwisho ya jarida.journalctl -u myapp --since "03:00" --until "03:30"— kile huduma kiliandika wakati wa kuanguka.journalctl -p err -b— je, kuna makosa mengine mfumoni wakati huo huo.journalctl -k --since "03:00" -g "Out of memory|Killed process"— je, OOM killer ya kernel iliua mchakato.- Kumbukumbu za programu yenyewe kwenye
/var/log/myapp/, pamoja na kumbukumbu za.gz. - Ikiwa seva iliwashwa upya —
journalctl -b -1 -e.
Muhtasari
Kwa kazi ya kila siku na kumbukumbu za Linux amri chache zinatosha: journalctl -u kwa huduma, -f kwa mtiririko, --since na -p err kwa kupunguza uchaguzi, -b -1 kwa uchambuzi wa kuwasha upya. Kumbukumbu za maandishi ziko kwenye /var/log, rsyslog huzipanga na kuzituma, na logrotate pamoja na journalctl --vacuum-* huzuia kumbukumbu zisijaze diski. Kazi na journalctl, mzunguko wa kumbukumbu na uchunguzi wa mzigo imefafanuliwa kwa vitendo katika somo la kozi ya Linux.
Maswali ya mara kwa mara
Kwa nini journalctl inaonyesha rekodi za kuwasha kwa sasa pekee?
Jarida linahifadhiwa kwenye kumbukumbu (/run/log/journal). Tengeneza saraka /var/log/journal au weka Storage=persistent kwenye journald.conf, kisha anzisha upya systemd-journald.
Nitamruhusuje mtumiaji wa kawaida kusoma jarida bila sudo?
Mwongeze kwenye kundi systemd-journal (au adm kwenye Debian na Ubuntu): sudo usermod -aG systemd-journal jina, kisha ingia tena.
Je, ninaweza kuona jarida la mfumo mwingine, kwa mfano kutoka diski iliyounganishwa?
Ndiyo, taja saraka ya jarida kwa bendera -D: journalctl -D /mnt/var/log/journal. Bendera --file husoma faili moja ya .journal.
Je, rsyslog inahitajika ikiwa kuna journald?
Si lazima. Ni muhimu ikiwa unahitaji faili za maandishi kwa zana za zamani au kutuma kumbukumbu kwa seva kuu; kwenye picha nyingi ndogo haisakinishwi tena.
Nitaandikaje kumbukumbu za huduma kwenye faili ili nimtumie mwenzangu?
Endesha journalctl -u jina --since today --no-pager > service.log — utapata faili ya kawaida ya maandishi.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.
Nenda kwenye kozi