1. 程式人生 > >解決Log4j日誌檔案輸出到了前一天的備份檔案裡

解決Log4j日誌檔案輸出到了前一天的備份檔案裡

        最近參與了一個專案,單臺主機上佈置了多個應用例項。為了後期維護和監控,需要將各個應用例項的部分關鍵日誌彙總到一個檔案裡,同時自動備份前一天的日誌,並帶上日期。最開始只是配置了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 "[email protected]"

        (3).shutdown.sh

#!/bin/bash 
EXECUTABLE=catalina.sh  
exec "$EXECUTABLE" stop "[email protected]"

相關推薦

解決Log4j日誌檔案輸出前一天備份檔案

        最近參與了一個專案,單臺主機上佈置了多個應用例項。為了後期維護和監控,需要將各個應用例項的部分關鍵日誌彙總到一個檔案裡,同時自動備份前一天的日誌,並帶上日期。最開始只是配置了log4j.properties檔案,控制部分日誌輸出級別。發現,日誌正常情況下能輸出

log4j日誌輸出的問題

今天伺服器上報錯,想先去看一下日誌進行排查,結果發現日誌很久都沒有輸出過了。從上午排查到下午,剛剛解決,因此記錄一下,但現在也只是知其然,並不知其所以然,所以如果大家有什麼想法請在下方評論。 先說一下環境,伺服器是linux,專案是執行在tomcat下的Spring專案,日誌用

mybatis上的log4j日誌配置輸出

Log4j Log4j是Apache的一個開源專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件,甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻

修改配置原生log4j,使得指定的類檔案輸出到指定的檔案中(非Spring框架)

1.配置web.xml<context-param>    <param-name>log4jRefreshInterval</param-name>    <param-value>1000</param-value&g

log4j日誌預設輸出路徑

配置log4j檔案如下log4j.rootLogger=ERROR,Rlog4j.appender.R=org.apache.log4j.DailyRollingFileAppenderlog4j.ap

Postman高階應用(8):檔案變成亂碼——下載檔案

背景 在做後臺管理系統時候,涉及到匯出報表等功能,如果我們用以前的方式請求,往往會看到返回一堆亂碼,而不是我們想要的檔案。其實Postman為我們提供了檔案下載功能,同樣普通的html文字和json資料也可以返回儲存為檔案。 實戰 點發送按鈕旁邊的三角形,然後點Send a

struts2 檔案流, 檔案輸出到瀏覽器 檔案下載

眾所周知,直接在頁面中插入a標籤引入檔案地址可以解決,但是這樣即暴露了專案路徑而且再某些情況下會有一些小問題,最好的辦法是用I/O流, (readlinne方式),今天我記錄的是struts2中的檔案輸入輸出框架的用法: struts.xml配置檔案片段: <res

log4j 控制檯和檔案輸出亂碼問題解決

一個小問題,卻讓我感覺到,現在真正動腦的人很少。。我來說說吧。 今天遇到一個小問題,log4j輸出到檔案亂碼,控制檯正常。顯然是編碼問題導致。Google一搜,幾乎一水的說: 專案中log4j在英文版linux下輸出中文日誌為亂碼。由於

Log4J日誌配置詳解和自定義log4j日誌級別及輸出日誌到不同檔案實現方法

package com.jo.work.log4j; import java.util.Enumeration; import org.apache.log4j.Appender; import org.apache.log4j.FileAppender; import org.apache.log4j.

JAVA Tomcat Log4j 日誌輸出檔案

工程引用     Log4j.jar    要輸出日誌的類中引用     import org.apache.log4j.Logger;     import org.apache.log4j.PropertyConfigurator; 建立log4j.prope

tomcat配置log4j輸出日誌從控制檯改到指定檔案

原文網址:http://www.cnblogs.com/stonefeng/p/5767762.html 現象 不知道從哪個版本的tomcat開始,windows版本的tomcat不再包含{tomcat_home}\logs\catalina.out這個檔案,ec

log4j自定義級別並將新級別日誌資訊輸出到指定帶日期格式的log檔案

log4j.xml的配置如下: <appender name="LOG.EMAIL" class="org.apache.log4j.RollingFileAppender">   <param name="File" value="${catalina.home}/logs/EMAIL_L

log4j 日誌檔案儲存資料庫的解決方案一(配置檔案中寫sql語句)

log4jmysql.properties: log4j.rootLogger=ERROR,console,db log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.

Linux下java程式碼log4j日誌輸出中文出現亂碼,中文全部變成問號,解決辦法

問題描述: (1)log4j.xml和log4j.properties日誌輸出的編碼格式正常都設定為UTF-8 (2)cat命令獲取txt檔案,裡面的中文可以正常顯示 (3)log.***(info)中文全部出現亂碼 原因: linux本地設定的檔案編碼格式不是UT

log4j詳解 將指定日誌輸出到不同的檔案

import org.apache.log4j.Logger; <span style="font-family: Arial, Helvetica, sans-serif;">public class HelloWorld {</span> <span style="whit

log4j日誌按分模組和分級輸出到不同的檔案中去

現在遇到這樣一個場景: 輸出日誌,按照不同的模組,和級別 輸出到不同的檔案中。 現在有 org.zq.core 和 org.zq.web 包下需要將 info 和 error 分別輸出到檔案中,也就是說,需要輸出到4個檔案中。 以下為配置檔案; `實現思路

Log4J-Log4J配置介紹/Log4J不同模組不同日誌級別輸出到不同檔案的配置

##=======================Log4J一些日誌級別配置測試說明20180622============================## #==============一、根配置====================# #1. 首先定

log4j日誌輸出,以及生成日誌檔案

log4j.properties檔案配置如下: log4j.rootLogger=debug,appender,appender1 #如果在本地eclipse控制檯輸出 請解開下面的程式碼 #log4j.appender.appender=org.apache.log

log4j日誌輸出分級別或模組到不同檔案

一、 實現分模組,輸出到不同的日誌檔案,  以下是log4j.properties的實現   log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.

Log4j日誌輸出級別和配置檔案詳解

一,Log4j的日誌輸出級別     Log4j由三個重要的元件構成:日誌資訊的優先順序,日誌資訊的輸出目的地,日誌資訊的輸出格式。日誌資訊的優先順序從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日誌資訊的重要程度;日誌資訊的輸出目的地指定了日誌將