Resin服务相关-日志统计SocketServer
在前面的章节中,我们讲述了Resin本地部署服务脚本 和 Resin更新服务脚本,本章中,我们重点讲述下对log的收集,在日常工作中我们对一些不重要的数据往往不会保存到数据库,而是直接打印到文件的方式,具体到应用的时候在对log文件进行分析,但是线上运行的机器往往都是多台,每台分析相同的事情或者对所有数据做合并处理的时候就显得很不方便,于是我们可以采用一种集中管理的方式,log4j的包为我们提供了丰富的功能,不用再自己实现,远程log用的是SocketServer。
假设10.2.1.100,10.2.1.200是客户端机器,10.2.1.500是log server.
在客户端log4j的配置文件中,设置远程记录log,并设置好端口
<appender name="socket" class="org.apache.log4j.net.SocketAppender"> <param name="remoteHost" value="10.2.1.500" /><!-- 这是远程log server --> <param name="port" value="9123" /><!-- 这是远程log server port--> <param name="Threshold" value="INFO" /><!-- log 级别 --> <param name="ReconnectionDelay" value="6000" /> <param name="LocationInfo" value="true" /> </appender>
100和200做同样的设置,对于服务器端500 server需要进行区分。
服务器端默认的配置文件记录在lcf文件夹中,每个文件代表一个客户端机器,目录如下:
[root@SJSWT45-26 lcf]# ls -l 总计 36 -rw-r--r-- 1 root root 893 2010-08-03 10.2.1.100.lcf -rw-r--r-- 1 root root 895 2010-08-03 10.2.1.200.lcf
打开看一下,具体的配置文件,以100.lcf为例子
log4j.logger.promotion=DEBUG,FILELOGER2 log4j.additivity.promotion=false log4j.appender.FILELOGER2=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILELOGER2.DatePattern='.'yyyy-MM-dd-HH log4j.appender.FILELOGER2.encoding=UTF-8 log4j.appender.FILELOGER2.File=/data/remote-log-server/log/promition1.log <!-- 本地记录路径,一个客户端一个地址,本例子中,100和200分别设置不同的路径 --> log4j.appender.FILELOGER2.layout=org.apache.log4j.PatternLayout <!-- 日志的记录格式 --> log4j.appender.FILELOGER2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n
大功告成,现在我们把服务器500服务器的log服务启动起来,需要activation-1.1.jar 和log4j-1.2.16.jar两个包,如果加入自动发邮件的功能话,还需要引入mail-1.4.1.jar 。启动脚本如下:
/opt/j2sdk/bin/java -Xmx1G -cp /data/remote-log-server/lib/activation-1.1.jar:/data/remote-log-server/lib/mail-1.4.1.jar:/data/remote-log-server/lib/log4j-1.2.16.jar org.apache.log4j.net.SocketServer 9123 /data/remote-log-server/logserver.properties /data/remote-log-server/lcf
为了方便改动后,重启服务生效,我们可以写个shell脚本:
#!/bin/sh ulimit -n 1000000 -s unlimited -u unlimited export LIB_DIR=/data/remote-log-server/lib #set -x /opt/j2sdk/bin/java -Xmx1G -cp $LIB_DIR/activation-1.1.jar:$LIB_DIR/mail-1.4.1.jar:$LIB_DIR/log4j-1.2.16.jar org.apache.log4j.net.SocketServer "$@" & SPID=$! sleep 1 echo $SPID > /var/run/log4j.pid
其中,”$@”代表shell脚本传入的参数,在该实例中,需要传入三个参数,分别对应端口port、服务器日志配置和客户端收集log的配置信息目录lcf.
然后写个脚本来检测我们的服务端口9123就行了。
#!/bin/sh out=`/bin/netstat -nlt | grep :9123` if [ -n "$out" ]; then echo 'PORT 9123 OK !!! '`date` else echo 'PORT 9123 HAS DOWN...... RESTART...... '`date` /sbin/service log4j start fi
配置log服务的重启脚本如下,放在/ect/init.d/目录下,这儿我们命名为remote_log4j, vim /etc/init.d/remote_log4j
#!/bin/bash # # Startup script for Log4J Socket Server # # chkconfig: - 86 15 # description: Log4J Socket Server # processname: log4j ulimit -n 1000000 -s unlimited -u unlimited JAVA_HOME=/opt/j2sdk export JAVA_HOME start_log4j="/data/remote-log-server/bin/startSockerServer.sh 9123 /data/remote-log-server/logserver.properties /data/remote-log-server/lcf " stop_log4j="kill -9 `cat /var/run/log4j.pid`" start() { echo -n "Starting log4j Socket Server:" ${start_log4j} echo "done." } stop() { echo -n "Shutting down log4j: " ${stop_log4j} echo "done." } # See how we were called case "$1" in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; *) echo "Usage: $0 {start|stop|restart}" esac exit 0