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 SnareApache và SnareSquid để 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:
Get the correct source code here: http://www.syslog.org/forum/syslog-and-syslogd/redirecting-remote-logging/
Post a Comment