- یکی از مشکلات سیستمهای جمع آور لاگها و رویدادها، افزایش بیش از اندازه پروندهها است. در همین راستا با استفاده از سویچ disk-usage– میتوان مقادر حجم و فضایی که توسط لاگها در سیستم اشغال شده است را مشاهده کرد.
# journalctl --disk-usage
- در صورتی که دستور بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
Archived and active journals take up 16.0M in the file system.
- با استفاده از سویچ vacuum-size– میتوان اقدام به پاک کردن لاگها و رویدادهای قدیمی تا جایی کرد که حجم پروندههای مربوط به لاگها به میزان مورد انتظار رسد.
- به عنوان مثال دستور زیر باعث میشود تا لاگها و رویدادهای قدیمی تا جایی پاک شوند که حجم پروندهی لاگها برابر با 1GB شود.
# journalctl --vacuum-size=1G
- به عنوان مثالی دیگر دستور زیر باعث میشود تمام لاگها و رویدادها تا یک سال قبل (نسبت به زمان حال) پاک شوند.
# journalctl --vacuum-time=1years
- دستور بالا باعث میشود تنها لاگها و رویدادهای یک سال گذشته تا زمان حال بر روی سیستم در دسترس باشد.
- یکی از قابلیتهای خوب Journald این است که میتوان تعیین نمود که پروندههای مربوط به لاگها و رویدادها تا چه اندازه رشد کنند.
- برای این منظور دو پارامتر اصلی SystemMaxFileSize و RuntimeMaxFileSize وجود دارد. برای تغییر مقدار این دو پارامتر ابتدا پروندهی زیر را با یک ویرایشگر باز کنید :
/etc/systemd/journald.conf
- سپس پارامتر SystemMaxFileSize را از حالت توضیح خارج کنید و مقدار آن را متناسب با سیستم در نظر بگیرید. به عنوان مثال :
SystemMaxFileSize=100M
- در بعضی از توزیعها به صورت پیشفرض مسیر ذخیره شدن لاگها و رویداد در پوشهی /run/ میباشد. لازم به ذکر است که این پوشه از جنس tempfs است یعنی با راه اندازی مجدد سیستم یا خاموش شدن سیستم، اطلاعات درون آن پاک میشود.
- نکته: پارامتر RuntimeMaxUse به مقدار حجم و فضای اشغال شده توسط Journald در پوشهی /run/ اشاره میکند در صورتی که پارامتر SystemMaxFileSize به مقدار حجم و فضای اشغال شده توسط Journald در پوشهی /var/log/journald/ اشاره دارد.
- به عنوان مثال قصد داریم :
- لاگها و رویدادهای سرویس ssh.service به مدت 10 روز نگهداری شوند.
- در صورتی که لاگها و رویدادهای سرویس apache2.service به مدت 1 ماه نگداری شوند.
- ابتدا باید توجه کرد که با استفاده از تنظیمات پیشفرض Journald نمیتوان همچین سناریو ای را پیاده سازی کرد لذا نیاز است از روشهای دیگر استفاده شود.
- برای این منظور میتوان دستنوشته یا برنامهای در نظر گرفت که لاگها و رویدادهای 10 روز گذشتهی سرویس ssh.service را در پروندهای مشخص ذخیره کند. برای این منظور ابتدا پروندهای با نام ssh.logger.sh ایجاد کنید، سپس دسترسی اجرا به آن دهید. (نام ssh.logger.sh مثال میباشد.)
# touch /usr/bin/ssh.logger.sh
# chmod +x /usr/bin/ssh.logger.sh
- در ادامه پروندهی ssh.logger.sh را با یک ویرایشگر باز کنید و محتویات زیر را برای آن در نظر بگیرید :
#! /bin/bash
journalctl -u ssh.service --since '10 day ago' > /var/log/ssh.logger.log
- در نهایت به منظور اجرای برنامهی بالا به شکل زیر عمل کنید :
# /bin/bash /usr/bin/ssh.logger.sh
- با اجرای برنامهی بالا، لاگها و رویدادهای 10 روز گذشتهی سرویس ssh.service به پروندهای با نام ssh.logger.log منتقل میشود.
- نکته: توجه فرمایید که مقدار پارامتر since– متناسب با سناریو تعیین میشود و به عنوان مثال برای سرویس apache2 این مقدار میتواند بر روی 1 month ago تنظیم شود.
- در مرحله بعد باید ساز و کاری در نظر گرفت تا این برنامه به صورت مستمر در بازههای زمانی خاصی اجرا شود تا بتوان به جدیدترین لاگها و رویدادهای 10 روز گذشتهی سرویس ssh.service از درون پروندهی ssh.logger.log دسترسی داشت.
- برای این منظور میتوان از قابلیت cron یا قابلیت timer در درون Systemd استفاده نمود.
- برای استفاده از قابلیت timer در درون Systemd ابتدا لازم است تا پروندهای تحت عنوان Unit File برای سرویس ssh.logger ایجاد کنید. برای این منظور ابتدا پروندهی ssh.logger.service را در مسیر زیر ایجاد کنید :
# touch /usr/lib/systemd/system/ssh.logger.service
- سپس این پرونده را با یک ویرایشگر باز کنید و محتویات زیر را برای آن در نظر بگیرید :
[Unit]
Description=print ssh service logs to other files
[Service]
Type=oneshot
ExecStart=/bin/bash /usr/bin/ssh.logger.sh
[Install]
WantedBy=multi-user.target
- در ادامه نیاز است تا پروندهای با نام ssh.logger.timer ایجاد و پیکربندی شود. برای این منظور ابتدا پروندهای با این نام در مسیر زیر ایجاد کنید :
# touch /usr/lib/systemd/system/ssh.logger.timer
- سپس این پرونده را با یک ویرایشگر باز کنید و محتویات زیر را برای آن در نظر بگیرید :
[Unit]
Description=run ssh.logger.service every 10 second
[Timer]
OnUnitActiveSec=10s
OnBootSec=30s
[Install]
WantedBy=timers.target
- نکته: پارامتر OnUnitActiveSec باعث میشود تا سرویس ssh.logger.service هر 10 ثانیه اجرا شود.
- نکته: پارامتر OnBootSec باعث میشود تا سرویس ssh.logger.service به مدت 30 ثانیه بعد از بالا آمدن سیستم عامل اجرا شود.
- نکته: اعداد در نظر گرفته شده مثال بوده و باید متناسب با سرویسی که در نظر دارید تغییر یابند.
- نکته: نام پروندهی timer دقیقا یکسان با نام سرویس باید انتخاب شود.
- در ادامه به منظور اجرای سرویس :
# systemctl daemon-reload
# systemctl enable ssh.logger.timer ssh.logger.service
# systemctl start ssh.logger.service ssh.logger.timer
- برای مشاهدهی نتایج و اطمینان از این که سرویس ssh.logger.service هر 10 ثانیه اجرا میشود، به صورت زیر عمل کنید :
# systemctl status ssh.logger.service
● ssh.logger.service - print ssh service logs to other files
Loaded: loaded (/lib/systemd/system/ssh.logger.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2020-04-14 02:38:57 EDT; 6s ago
Process: 1270 ExecStart=/bin/bash /usr/bin/ssh.logger.sh (code=exited, status=0/SUCCESS)
Main PID: 1270 (code=exited, status=0/SUCCESS)
Apr 14 02:38:57 debian10 systemd[1]: Starting print ssh service logs to other files...
Apr 14 02:38:57 debian10 systemd[1]: ssh.logger.service: Succeeded.
Apr 14 02:38:57 debian10 systemd[1]: Started print ssh service logs to other files.
- با توجه به این که مقدار OnUnitActiveSec بر روی 10 ثانیه تنظیم شده است، انتظار میرود که عدد مشخص شده (به صورت رنگی) در کد، بیشتر از 10 ثانیه نشود.
- در نهایت به منظور دسترسی به لاگها و رویدادهای 10 روز گذشتهی سرویس ssh کافیست پروندهی /var/log/ssh.logger.log/ توسط ابزاری مثل cat یا tail خوانده شود.
# tail -f /var/log/ssh.logger.log
- برای دیگر سرویسها نیز همین راه حل پیشنهاد میشود.
- تست شده بر روی systemd 241