| #! /bin/sh |
| |
| # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # This script prints the last part of a syslog-timestamped file to the |
| # stdout according to a time specification. By default the last day of |
| # msgs written to /var/log/messages is printed. Options: |
| # --last <time> collect most recent msgs up to <time> (default 1 day) |
| # --bytes N cap collected data at N bytes (default 130K) |
| # |
| # Note option order is important (TODO(sleffler) rewrite w/ shflags) |
| |
| if [ "$1" = "--last" -o "$1" = "-l" ]; then |
| LAST="$2"; shift; shift |
| else |
| LAST='1 day' |
| fi |
| if [ "$1" = "--bytes" -o "$1" = "-c" ]; then |
| MAXDATA="$2"; shift; shift |
| else |
| # NB: 1000 lines at 132 chars/line is ~130Kbytes |
| MAXDATA='130K' |
| fi |
| LOGFILE=${1:-/var/log/messages} |
| |
| # create list of files assuming normal log rotation |
| |
| LOGFILES="${LOGFILE}" |
| local BASENAME="${LOGFILE%%.*}" |
| local EXTENSION="${LOGFILE#*.}" |
| if [ "${BASENAME}" = "${EXTENSION}" ]; then |
| EXTENSION="" |
| else |
| EXTENSION=".${EXTENSION}" |
| fi |
| for i in 1 2 3 4 5 6 7 8 9; do |
| FILE="${BASENAME}".$i${EXTENSION} |
| [ -f "$FILE" ] || break |
| LOGFILES="${LOGFILES} $FILE" |
| done |
| |
| WHEN="now - $LAST" |
| DATE=$(date -d "$WHEN" +'%FT%T.000000%:z') |
| |
| tac $LOGFILES \ |
| | awk -v DATE="$DATE" '{ if ($1 < DATE) exit; print }' \ |
| | tac \ |
| | tail -c $MAXDATA |