From 0af9b83a6b2577b45e580e24efe82b692f9d1f05 Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Thu, 13 Jun 2013 18:31:14 +0100 Subject: xenapi: script to rotate the guest logs Xen will produce the guest logs in a specified directory. This scripts configures the above logging as expected by the xapi plugin nova uses to read the logs. In addition it ensures that any log that grows bigger than 1MB will be truncated down to 5KB. Ensuring the log directory is inside a loop back device of a restricted size, and running this script every minute using cron, will stop guests from using up too much Dom0 disk space, and taking out the hypervisor Part of blueprint xenapi-server-log Change-Id: I4caa82f4d0620d924e37e3b605cf62b4d5b73570 --- tools/xenserver/rotate_xen_guest_logs.sh | 62 ++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 tools/xenserver/rotate_xen_guest_logs.sh diff --git a/tools/xenserver/rotate_xen_guest_logs.sh b/tools/xenserver/rotate_xen_guest_logs.sh new file mode 100755 index 000000000..0e6c7d6ea --- /dev/null +++ b/tools/xenserver/rotate_xen_guest_logs.sh @@ -0,0 +1,62 @@ +#!/bin/bash +set -eux + +# Script to rotate console logs +# +# Should be run on Dom0, with cron, every minute: +# * * * * * /root/rotate_xen_guest_logs.sh +# +# Should clear out the guest logs on every boot +# because the domain ids may get re-used for a +# different tenant after the reboot +# +# /var/log/xen/guest should be mounted into a +# small loopback device to stop any guest being +# able to fill dom0 file system + +log_dir="/var/log/xen/guest" +kb=1024 +max_size_bytes=$(($kb*$kb)) +truncated_size_bytes=$((5*$kb)) +list_domains=/opt/xensource/bin/list_domains + +log_file_base="${log_dir}/console." +tmp_file_base="${log_dir}/tmp.console." + +# Ensure logging is setup correctly for all domains +xenstore-write /local/logconsole/@ "${log_file_base}%d" + +# Move logs we want to keep +domains=$($list_domains | sed '/^id*/d' | sed 's/|.*|.*$//g' | xargs) +for i in $domains; do + log="${log_file_base}$i" + tmp="${tmp_file_base}$i" + mv $log $tmp || true +done + +# Delete all console logs, +# mostly to remove logs from recently killed domains +rm -f ${log_dir}/console.* + +# Reload domain list, in case it changed +# (note we may have just deleted a new console log) +domains=$($list_domains | sed '/^id*/d' | sed 's/|.*|.*$//g' | xargs) +for i in $domains; do + log="${log_file_base}$i" + tmp="${tmp_file_base}$i" + size=$(stat -c%s "$tmp") + + # Trim the log if required + if [ "$size" -gt "$max_size_bytes" ]; then + tail -c $truncated_size_bytes $tmp > $log || true + else + mv $tmp $log || true + fi + + # Notify xen that it needs to reload the file + xenstore-write /local/logconsole/$i $log + xenstore-rm /local/logconsole/$i +done + +# Delete all the tmp files +rm -f ${tmp_file_base}* || true -- cgit