Tuesday, September 13, 2005

Bash remote logger - rlogger.sh

Bạn có nhiều web server (apache) hoặc proxy server (squid) và muốn chứa access log tập trung ở một chỗ cho tiện việc phân tích và quan sát real-time? Cách tốt nhất dựng một log server tập trung và dùng giao thức syslog để gửi log về từ các server. Apache, squid, lại không hỗ trợ gửi access log trực tiếp qua syslog. Nếu máy chủ có trình biên dịch C, bạn có thể dùng SnareApacheSnareSquid để gửi log đến syslog server tập trung.

Shell script này (rlogger.sh) cũng thực hiện công việc tương tự, mục đích sử dụng trên các server được cài đặt "ngặt nghèo" không có trình biên dịch như IPCop/Smoothwall.



Update: Sửa lỗi "echo $MSG" khiến access log của squid không thể được duyệt đúng với SARG 2.0.9 do mất ký tự


--rlogger.sh--

#!/bin/bash
# bash remote logger
# simple logger(1) which sends log data to remote loghost via UDP

# (c) 2005 - Long Dinh Le
# released under GPL license

# usage sample:
# rlogger.sh loghost -p local6.info -f /var/log/squid/access.log

# TODO: add more error checking functions

# predefined facility and severity values
faclilities=(kernel=0 user=1 mail=2 daemon=3 auth=4 syslog=5 cron=9 authpriv=10 ftp=11 local0=16 local1=17 local2=18 local3=19 local4=20 local5=21 local6=22 local7=23)

severities=(emerg=0 alert=1 crit=2 err=3 warning=4 notice=5 info=6 debug=7)

# default values
PORT="514"
FACILITY=1
SEVERITY=6
TAIL="/usr/bin/tail -F"
NOHUP="/usr/bin/nohup"
AWK="/usr/bin/awk"

# misc functions
usage(){
echo
echo "Usage: `basename $0` -p . -f "
echo
echo "Facilities: ${faclilities[*]%=*}"
echo "Severities: ${severities[*]%=*}"
echo
echo "Default: facility=user, severity=info"
echo
exit 0
}

error() {
echo "Error: $1"
echo
exit 1
}

# DO NOT MODIFY FROM HERE
[ "$#" -lt 3 ] && usage

HOST="$1"
shift
# converting facility.severity into priority
[ "$1" = "-p" ] && {
FACILITY=${2%.*}
SEVERITY=${2#*.}
for ((i=0; i<${#faclilities[*]}; i++)); do [ "$FACILITY" = ${faclilities[$i]%=*} ] && FACILITY=${faclilities[$i]#*=} done for ((i=0; i<${#severities[*]}; i++)); do [ "$SEVERITY" = ${severities[$i]%=*} ] && SEVERITY=${severities[$i]#*=} done shift 2 } PRIORITY=$(($FACILITY*8 + $SEVERITY)) # testing logfile for read permission [ "$1" = "-f" ] && { shift LOGFILE="$1" } [ -f "$LOGFILE" -a -r "$LOGFILE" ] || error "$LOGFILE does not exist or cannot read" # connect to the loghost vi UDP # check connection error
exec 3<> /dev/udp/$HOST/$PORT

HEADER="<$PRIORITY>"

$NOHUP $TAIL $LOGFILE | while read MSG; do
echo "$MSG" | $AWK '{ print "'"$HEADER"'"$0 }' >&3
done &

--rlogger.sh--

1 comment:

Anonymous said...

Get the correct source code here: http://www.syslog.org/forum/syslog-and-syslogd/redirecting-remote-logging/