【转】log4j 设置将生成的日志进行gz压缩并删除过期日志
生活随笔
收集整理的這篇文章主要介紹了
【转】log4j 设置将生成的日志进行gz压缩并删除过期日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自https://www.cnblogs.com/haw2106/p/10116164.html
1、準備jar ?:log4j-1.2.17.jar,commons-logging-1.2.jar,這2個就可以了,其他關于日志的jar包就不要加進來了,在優先級上會有沖突。
2、定義一個類,繼承RollingFileAppender類,這個類是按照日志大小滾動生成日志,并把日志編號。我就在這個類基礎上重新寫了其中的一些方法,加上日期和刪除功能,稍加改動就行了。
package com.hm.sage.bigdata.spark.log;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.zip.GZIPOutputStream;import org.apache.log4j.RollingFileAppender; import org.apache.log4j.helpers.CountingQuietWriter; import org.apache.log4j.helpers.LogLog;public class RoolingAndDateFileAppender extends RollingFileAppender {private String datePattern;//日期格式private String dateStr = "";//文件后面的日期private String expirDays = "1";//保留最近幾天private String isCleanLog = "true";//是否清日志private String maxIndex = "100";//一天最多幾個文件private File rootDir;//父目錄的抽象路徑名private String gzFormat = "gz";//壓縮格式/*** 設置日期格式** @param datePattern*/public void setDatePattern(String datePattern) {if (null != datePattern && !"".equals(datePattern)) {this.datePattern = datePattern;}}/*** 獲取日期格式** @return*/public String getDatePattern() {return this.datePattern;}public void rollOver() {//文件后面的日期dateStr = new SimpleDateFormat(this.datePattern).format(new Date(System.currentTimeMillis()));File target = null;File file = null;if (qw != null) {//得到寫入的字節數long size = ((CountingQuietWriter) this.qw).getCount();LogLog.debug("rolling over count=" + size);}//默認情況下有一個備份文件LogLog.debug("maxBackupIndex=" + this.maxBackupIndex);//如果maxIndex<=0則不需命名if (maxIndex != null && Integer.parseInt(maxIndex) > 0) {//logRecoed.log.2018-08-24.5//刪除舊文件file = new File(this.fileName + '.' + dateStr + '.' + Integer.parseInt(this.maxIndex) + '.' + gzFormat);if (file.exists()) {//測試用這個抽象路徑名表示的文件或目錄是否存在。//如果當天日志達到最大設置數量,則刪除當天第一個日志,其他日志為尾號減一Boolean boo = reLogNum();if (!boo) {LogLog.debug("日志滾動重命名失敗!");}}}//獲取當天日期文件個數int count = cleanLog();//生成新文件//target=new File(fileName+"."+dateStr+"."+(count+1));this.closeFile();//關閉先前打開的文件。file = new File(fileName);//creat zip output stream to build zip fileGZIPOutputStream gzout = null;FileInputStream fin = null;byte[] buf = new byte[1024];//file -> gztry {fin = new FileInputStream(file);gzout = new GZIPOutputStream(new FileOutputStream(fileName + "." + dateStr + "." + (count + 1) + '.' + gzFormat));int num;while ((num = fin.read(buf, 0, buf.length)) != -1) {gzout.write(buf, 0, num);}gzout.flush();gzout.finish();LogLog.debug(fileName + " -> " + fileName + "." + dateStr + "." + (count + 1) + '.' + gzFormat + " successful!");} catch (IOException e) {LogLog.error("add gz file(" + fileName + "." + dateStr + "." + (count + 1) + '.' + gzFormat + ") failed.");} finally {try {if (gzout != null) {gzout.close();}if (fin != null)fin.close();} catch (IOException e) {LogLog.error("close Stream failed");}}//delete old filefile.delete();//LogLog.debug("Renaming file"+file+"to"+target);//file.renameTo(target);//重命名file文件try {setFile(this.fileName, false, this.bufferedIO, this.bufferSize);} catch (IOException e) {LogLog.error("setFile(" + this.fileName + ",false)call failed.", e);}}/*** 獲取當天日期文件個數** @return*/public int cleanLog() {int count = 0;//記錄當天文件個數if (Boolean.parseBoolean(isCleanLog)) {File f = new File(fileName);//返回這個抽象路徑名的父目錄的抽象路徑名rootDir = f.getParentFile();//目錄中所有文件。File[] listFiles = rootDir.listFiles();for (File file : listFiles) {if (file.getName().contains(dateStr)) {count = count + 1;//是當天日志,則+1} else {//不是當天日志需要判斷是否到期刪除if (Boolean.parseBoolean(isCleanLog)) {//清除過期日志String[] split = file.getName().split("\\\\")[0].split("\\.");//校驗日志名字,并取出日期,判斷過期時間if (split.length == 4 && isExpTime(split[2])) {file.delete();}}}}}return count;}/*** 判斷過期時間** @param time* @return*/public Boolean isExpTime(String time) {SimpleDateFormat format = new SimpleDateFormat(this.datePattern);try {Date logTime = format.parse(time);Date nowTime = format.parse(format.format(new Date()));//算出日志與當前日期相差幾天int days = (int) (nowTime.getTime() - logTime.getTime()) / (1000 * 3600 * 24);if (Math.abs(days) >= Integer.parseInt(expirDays)) {return true;} else {return false;}} catch (Exception e) {LogLog.error(e.toString());return false;}}/*** 如果當天日志達到最大設置數量,則每次刪除尾號為1的日志,* 其他日志編號依次減去1,重命名** @return*/public Boolean reLogNum() {boolean renameTo = false;File startFile = new File(this.fileName + '.' + dateStr + '.' + "1" + '.' + gzFormat);if (startFile.exists() && startFile.delete()) {//是否存并刪除for (int i = 2; i <= Integer.parseInt(maxIndex); i++) {File target = new File(this.fileName + '.' + dateStr + '.' + (i - 1) + '.' + gzFormat);this.closeFile();File file = new File(this.fileName + '.' + dateStr + '.' + i + '.' + gzFormat);renameTo = file.renameTo(target);//重命名file文件}}return renameTo;}public String getDateStr() {return dateStr;}public void setDateStr(String dateStr) {this.dateStr = dateStr;}public String getExpirDays() {return expirDays;}public void setExpirDays(String expirDays) {this.expirDays = expirDays;}public String getIsCleanLog() {return isCleanLog;}public void setIsCleanLog(String isCleanLog) {this.isCleanLog = isCleanLog;}public String getMaxIndex() {return maxIndex;}public void setMaxIndex(String maxIndex) {this.maxIndex = maxIndex;}}log4j.properties 配置文件
log4j.rootLogger=ALL,R,CONSOLElog4j.appender.R=com.hm.sage.bigdata.spark.log.RoolingAndDateFileAppender log4j.appender.R.Encoding=UTF-8 log4j.appender.R.file=/Users/shengwen/tmp/logs/logRecoed.log log4j.appender.R.Append=true log4j.appender.R.DatePattern=yyyy-MM-dd log4j.appender.R.MaxFileSize=5MB log4j.appender.R.maxIndex=10 log4j.appender.R.expirDays=4 log4j.appender.R.isCleanLog=truelog4j.appender.R.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n log4j.appender.R.layout=org.apache.log4j.PatternLayout#console log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout?
總結
以上是生活随笔為你收集整理的【转】log4j 设置将生成的日志进行gz压缩并删除过期日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光盘有写保护怎么办 “处理光盘写保护问题
- 下一篇: Thumbnailator-图片处理的G