当前位置: 首页 > 工具软件 > log4sh > 使用案例 >

解决Log4j日志文件输出到了前一天的备份文件里

司寇高洁
2023-12-01
    最近参与了一个项目,单台主机上布置了多个应用实例。为了后期维护和监控,需要将各个应用实例的部分关键日志汇总到一个文件里,同时自动备份前一天的日志,并带上日期。最开始只是配置了log4j.properties文件,控制部分日志输出级别。发现,日志正常情况下能输出到指定文件夹里,但是在每天自动备份日志的时候,总有部分日志仍然输出到并且覆盖了前一天的备份文件,最后发现是因为多实例并发导致的。

        因此决定采用log4j自带的日志服务器功能,将各个实例的日志统一汇总到日志服务器再打印输出到文件。

相关配置如下:

        1.客户端log4j.properties配置文件

#该部分为正常的输出到控制台的配置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.AIPatternLayout
log4j.appender.console.layout.ConversionPattern=[%d] [%t] (%u) (%F:%L) %-5p %c - %m%n
log4j.rootLogger=info,console,A1

#该部分为输出到日志服务器的配置
log4j.rootCategory=,A1
log4j.appender.A1=org.apache.log4j.net.SocketAppender
log4j.appender.A1.RemoteHost=localhost
log4j.appender.A1.Port=55555
log4j.appender.A1.Threshold = ERROR

        2.日志服务器配置文件

log4j.rootLogger=DEBUG,applog
log4j.category.org.apache.log4j.net=INFO
log4j.appender.applog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.applog.file=/home/hds/log/app.log
log4j.appender.applog.Threshold = ERROR
log4j.appender.applog.append=true
log4j.appender.applog.DatePattern='.'yyyy-MM-dd
log4j.appender.applog.layout=org.apache.log4j.PatternLayout

        3.启动日志服务器的命令

命令格式:java -cp 'CLASSPATH' 'APP_MAIN_CLASS' 'Port' '日志服务器的配置文件' '客户端配置文件所在目录(可以不配置)'
java -cp /home/hds/libext/log4j-1.2.8.jar org.apache.log4j.net.SocketServer 55555 /home/hds/app/log4jsocket/socketserver.properties /home/hds/app/log4jsocket/clientConfig

        4.启停日志服务器的shell脚本

        (1).catalina.sh

#!/bin/bash 

BASE_APP_HOME="/home/hds"
echo "BASE_APP_HOME=${BASE_APP_HOME}"
#监听的端口号
LISTEN_PORT=55555  
#服务端log4j配置文件
SERVER_CONFIG="${BASE_APP_HOME}/app/log4jsocket/socketserver.properties"
#客户端的配置目录
CLIENT_CONFIG_DIR="${BASE_APP_HOME}/app/log4jsocket/clientConfig"
  
#Log4j的jar包目录 
APP_HOME="${BASE_APP_HOME}/libext"
#需要启动的Java主程序(main方法类)
APP_MAINCLASS=org.apache.log4j.net.SocketServer  
   
#拼凑完整的classpath参数,包括指定lib目录下所有的jar  
CLASSPATH="$APP_HOME"/"log4j-1.2.8.jar" 
#for i in "$APP_HOME"/log4j-1.2.8.jar; do     
#    CLASSPATH="$CLASSPATH":"$i"  
#done  
  
#JDK所在路径  
JAVA_HOME="${BASE_APP_HOME}/java"
echo "JAVA_HOME=${JAVA_HOME}"
#执行程序启动所使用的系统用户,考虑到安全,推荐不使用root帐号  
#RUNNING_USER=hds
   
#java虚拟机启动参数  
JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"   
  
#初始化psid变量(全局)  
psid=0  
   

checkpid() {  
   javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS`  
   if [ -n "$javaps" ]; then  
      psid=`echo $javaps | awk '{print $1}'`  
   else  
      psid=0  
   fi
}  
  
start() {  
   checkpid  
   
   if [ $psid -ne 0 ]; then  
      echo "================================"  
      echo "warn: $APP_MAINCLASS already started! (pid=$psid)"  
      echo "================================"  
   else  
      echo -n "Starting $APP_MAINCLASS ..."  
         $JAVA_HOME/bin/java -cp $CLASSPATH $APP_MAINCLASS $LISTEN_PORT $SERVER_CONFIG $CLIENT_CONFIG_DIR >/dev/null 2>&1 & 
         checkpid  
      if [ $psid -ne 0 ]; then  
         echo "(pid=$psid) [OK]"  
      else  
         echo "[Failed]"  
      fi  
   fi  
}  
  
stop() {  
   checkpid  
   if [ $psid -ne 0 ]; then  
      echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "  
      kill -9 $psid
      if [ $? -eq 0 ]; then  
         echo "[OK]"  
      else  
         echo "[Failed]"  
      fi  
      checkpid  
      if [ $psid -ne 0 ]; then  
         stop  
      fi  
   else  
      echo "================================"  
      echo "warn: $APP_MAINCLASS is not running"  
      echo "================================"  
   fi  
}  
  
status() {  
   checkpid  
   
   if [ $psid -ne 0 ];  then  
      echo "$APP_MAINCLASS is running! (pid=$psid)"  
   else  
      echo "$APP_MAINCLASS is not running"  
   fi  
}  
info() {  
   echo "System Information:"  
   echo "****************************"  
   echo `head -n 1 /etc/issue`  
   echo `uname -a`  
   echo  
   echo "JAVA_HOME=$JAVA_HOME"  
   echo `$JAVA_HOME/bin/java -version`  
   echo  
   echo "APP_HOME=$APP_HOME"  
   echo "APP_MAINCLASS=$APP_MAINCLASS"  
   echo "****************************"  
}  
case "$1" in  
  
   'start')  
      start  
      ;;  
   'stop')  
     stop  
     ;;  
   'restart')  
     stop  
     start  
     ;;  
   'status')  
     status  
     ;;  
   'info')  
     info  
     ;;  
  *)  
     echo "Usage: $0 {start|stop|restart|status|info}"   
     exit 0   
esac

        (2).startup.sh

#!/bin/bash
EXECUTABLE=catalina.sh
exec "$EXECUTABLE" start "$@"

        (3).shutdown.sh

#!/bin/bash 
EXECUTABLE=catalina.sh  
exec "$EXECUTABLE" stop "$@"
    
 类似资料: