У меня есть веб-сервер (django ) работает на nginx + gunicorn. nginx записывает свои обычные журналы в:
~/myproject/log/access.log
, а ошибки - в:
~/myproject/log/error.log
, он работает довольно хорошо в течение нескольких месяцев.
Недавно я обнаружил, что мне нужно найти способ автоматически удалять эти журналы, прежде чем они займут все дискового пространства, поэтому я написал сценарий для удаления частей файла, если он превышает x строк, и позволил crontab запускать сценарий каждые 24 часа.
Затем я заметил, что nginx прекращает регистрацию каждый раз, когда crontab выполнил мой скрипт. Я могу восстановить его, перезапустив nginx, но он снова перестанет вести журнал после того, как crontab выполнит свою работу.
Вот мой сценарий:
LOG_PATH="/home/ubuntu/myproject/log/"
MAX_LINE_COUNT="400000"
NOW=$(TZ='Asia/Taipei' date +"%Y-%m-%d %H:%M")
echo "$NOW (GMT+8) start truncate_logs.sh"
for f in "$LOG_PATH"*; do
line_count=`wc -l < "$f"`
echo "$f has $line_count lines"
if [ "$line_count" -gt "$MAX_LINE_COUNT" ]
then
lines_to_truncate=$((line_count-MAX_LINE_COUNT))
sed -i '1,'"$lines_to_truncate"'d' "$f"
echo "truncated $lines_to_truncate lines"
else
echo "pass"
fi
done
Интересно, обращаются ли nginx и crontab к файлу одновременно, и это нарушает Поведение журнала nginx?
Кроме того, когда nginx перестает записывать журналы в «access.log», он все равно записывает ошибки в «error.log». "Error.log" файл всегда имеет меньшие строки, поэтому мой сценарий никогда не изменял файл. Это одна из причин, по которой я подозреваю, что модификация моего скрипта в "access.log" изменила поведение nginx.
Для этого следует использовать соответствующий скрипт nginx logrotate.
Вот пример:
"/var/log/nginx/*.log" {
daily
rotate 7
size 100M
dateext
dateformat -%Y%m%d-%s
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ ! -f /run/nginx.pid ] || kill -USR1 `cat /run/nginx.pid`
endscript
}
Также можно включить lorotation для проверки размера файла каждый час, а не ежедневно.
sudo ln -s /etc/cron.daily/logrotate /etc/cron.hourly/logrotate
Примеры взяты с сервера ubuntu 14.04, но должны быть совместимы с другими *Nix системами.
.