天天看點

[Java基礎]-- java類寫入日志和定時删除日志

一、寫入日志的工具類

LogUtil.java

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 *
 *@author yang
 *@類功能說明:建立日志的工具類
 *@修改日期:2015-11-3 下午05:02:41
 *@修改說明:
 *@建立時間:2015-11-3 下午05:02:41
 *@版本:V1.0
 */
public class LogUtil {
    private String pathurl   =UrlInfo.GLOBALS_PATH+"/mdlog/mdWeb/";//另一個類中public  static String GLOBALS_PATH="";         //設定日志的全局變量
    private String time     =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    private String daytime   =new SimpleDateFormat("yyyyMMdd").format(new Date());
    //建立字元檔案流
    private FileWriter     fw=null;
    //建立字元緩沖流
    private BufferedWriter bw=null;
    /**
     *
     * @方法功能說明: 寫檔案的工具類
     * @修改者名字:yang
     * @修改日期 : 2015-11-4 
     * @參數: @param message   
     */
    public void info(String message){
        String os=System.getProperty("os.name");
        try {
/**
 * 判斷作業系統名稱是windows
 */
            if(os.startsWith("Windows")){
                try {
//判斷是否有C D E盤
                    if(new File(UrlInfo.PATH_CDEF_D).isDirectory()){
                        UrlInfo.GLOBALS_PATH=UrlInfo.PATH_CDEF_D;
                    }else if(new File(UrlInfo.PATH_CDEF_E).isDirectory()){
                        UrlInfo.GLOBALS_PATH=UrlInfo.PATH_CDEF_E;
                    }else if(new File(UrlInfo.PATH_CDEF_C).isDirectory()){
                        UrlInfo.GLOBALS_PATH=UrlInfo.PATH_CDEF_C;
                    }
                    File fi=new File(pathurl);
//判斷mdlog目錄是否存在
                    File fl=new File(UrlInfo.GLOBALS_PATH+"/mdlog/");
                    if(!fl.isDirectory()){
                        fl.mkdir();
                    }
//判斷檔案夾是否存在
                    if(!fi.isDirectory()){
//如果不存在,那麼建立一個檔案夾
                        fi.mkdir();
                    }
//true代表在原有基礎上進行添加txt内容
                    this.fw=new FileWriter(pathurl+daytime+".log",true);
                    this.bw=new BufferedWriter(this.fw);
//寫入資訊内容
                    this.bw.write(time+":"+message+"\r\n");
//不用編碼,隻要統一了編碼GBK那麼就行
                } catch (IOException e) {
                    this.bw.write("write daily error:"+"\r\n"+e.getMessage());
                }finally{
                    this.bw.close();
                    this.fw.close();
                }
            }
/**
 * 判斷作業系統是linux系統
 */
            else{
//設定linux下的全局變量
                UrlInfo.GLOBALS_PATH="/usr/";
                try {
                    File fi=new File(pathurl);
//判斷檔案夾是否存在
                    if(!fi.isDirectory()){
//如果不存在,那麼建立一個檔案夾
                        fi.mkdir();
                    }
//true代表在原有基礎上進行添加txt内容20151104.log
                    this.fw=new FileWriter(pathurl+daytime+".log",true);
                    this.bw=new BufferedWriter(this.fw);
//寫入資訊内容
                    this.bw.write(time+":"+message+"\r\n");
// this.bw.write(time+":"+new String(b,UrlInfo.GLOBALS_UNICODE)+"\r\n");
                } catch (IOException e) {
                    e.printStackTrace();
                    this.bw.write("write daily error:"+"\r\n"+e.getMessage());
                }finally{
                    this.bw.close();
                    this.fw.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * @方法功能說明: 擷取目前月往前推一個月的日期
     * @修改者名字:yang
     * @修改日期 : 2015-11-8 
     * @修改内容 :
     * @參數:     int 多少月  
     * @return String
     * @異常抛出:
     */
    public  int getForwardDate(int what){
        SimpleDateFormat  sdf = new SimpleDateFormat("yyyyMMdd");
        Calendar cl = Calendar.getInstance();
        cl.add(Calendar.MONTH, what);//從現在算,之前month個月
        Date dateFrom = cl.getTime();
        return Integer.parseInt(sdf.format(dateFrom));
    }
}      

二、定時删除一個月前的日志

LogListener.java

注:

1、監聽器需要在web.xml檔案中初始化

 <listener>

  <listener-class>web.md.listener.LogListener</listener-class>

 </listener>

2、​​UrlInfo.java​​參考

package com.dg.web.form.common;

public class UrlInfo {
  /**2016-03-01新增小店伺服器的ip位址*/
  //
  public static String SERVICE_IP_40="*.40";
  public static String SERVICE_IP_41="*.41";
  public static String SERVICE_IP_73="*.73";
  public static String SERVICE_IP_78="*.78";
  public static String SERVICE_IP_79="*.79";
  public static String NAME_SMALL_STORE="小店伺服器";
  /**
   *2016-02-19增加條件 
   */
  public static String COMMON_NAME_GIFT="贈品";     //為贈品管理添加條件
  public static int COMMON_NAME_NUM=8;              //贈品券活動的sqlx是8
  
  public static String URL_DATANAME_DG="dg";                //mysql資料庫名--> dg
  public static String URL_DATANAME_ORDER="order";          //mysql資料庫名--> order
  public static String URL_DATANAME_IPADD="127.0.0.1";      //連結資料庫,伺服器本機預設ip位址127.0.0.1
  public static String URL_TABLENAME_MD_QUERY="md_query";   //門店資訊表(包含所有門店資訊)
  //mysql dg資料庫 表名稱
  public static String TABLENAME_XSLSB="xslsb";              //銷售流水表
  public static String TABLENAME_XSLSB_BAK="xslsb_bak";      //銷售流水備份表
  
  public static String TABLENAME_ZFFSB="zffsb";              //支付方式表
  public static String TABLENAME_ZFFSB_BAK="zffsb_bak";      //支付方式備份表
  
  public static String TABLENAME_YHQFQB="yhqfqb";        //優惠券發券表
  public static String TABLENAME_YHQFQB_BAK="yhqfqb_bak";    //優惠券發券備份表
  
  public static String TABLENAME_YHQDQB="yhqdqb";        //優惠券兌券表
  public static String TABLENAME_YHQDQB_BAK="yhqdqb_bak";    //優惠券兌券備份表
  
  public static String TABLENAME_YHHDB="yhhdb";              //優惠活動表
  public static String TABLENAME_FQGZB="fqgzb";              //發券規則表
  public static String TABLENAME_DQGZB="dqgzb";              //兌券規則表
  
  public static String TABLENAME_FQSJB="fqsjb";              //發券時間表
  public static String TABLENAME_DQSJB="dqsjb";              //兌券時間表
  
  public static String TABLENAME_FQSPB="fqspb";              //發券商品表
  public static String TABLENAME_DQSPB="dqspb";              //兌券商品表
  
  public static String TABLENAME_XTCSB="xtcsb";                         //系統參數表
  public static String TABLENAME_MUSIC="t_md_query_music";     //擷取到門店的ip位址
  
  public static String VARIABLE_NAME_HAND="發券";              //發券
  public static String VARIABLE_NAME_HAND_OUT="剔除";          //剔除發券或者兌券
  public static String VARIABLE_NAME_EXCHANGE="兌券";          //兌券
  
  public static int XPH_LENGTH=2;                              //發票号的長度為6時,起始值是2
  public static String ZFFSDM="4";                             //支付方式代碼為4代表優惠券支付
  public static int SQLX=6;                                           //收券類型為6代表雲收券,
  public static int SQLX2=7;                                   
  public static int SQLX3=0;                                    
  public static int SQLX4=9;                                    
  public static int FQLX=6;                                     //代表有發券規則
  public static int FQLX2=0;                                   //代表有發券規則
  public static int FQLX3=7;                                   //代表有發券規則
  public static int FQLX4=9;                                   //代表有發券規則
  
  /**
   * 用于判斷sqlx,fqlx
   */
  public static int FQLX5=5;            //代表不發券
  public static int FQLX9=999;         //代表不發券
  public static int SQLX5=5;
  public static int SQLX9=999;
  
  /**
   *登入 賬号和密碼
   */
  public static String UER="dg";
  public static String UER1="001";
  public static String UER2="002";
  public static String UER3="003";
  public static String UER4="004";
  
  public static String PASSWORD="123";
  public static String PASSWORD1="123";
  public static String PASSWORD2="123";
  public static String PASSWORD3="123";
  public static String PASSWORD4="123";
  
  /**
   * 設定選擇的活動名稱個數
   */
  public static int COUNT_HDBH=3;
  /**
   * 活動名稱
   */
  public static String NAME_HDMC="重要";    //為了顯示重要的活動
  /**
   * 規定jsp填寫參數mdh時,如果查詢備份伺服器10.2.2.71那麼需要規定mdh以小寫或者大寫B開頭
   */
  public static String STRING_MDH_B="B"; 
  public static String STRING_MDH_b="b"; 
  /**
   * 總部查詢時,是否需要通路備份伺服器的标志
   */
  public static String MASTER_TIPS_TRUE ="999";    //如果是999代表需要通路備份伺服器
  public static String MASTER_TIPS_FALSE="888";    //如果是888代表不需要通路備份伺服器
  /**
   * 門店查詢時,是否需要通路備份伺服器的标志
   */
  public static String MD_TIPS_TRUE ="1";  //如果是1代表需要通路備份伺服器
  public static String MD_TIPS_FALSE="0";  //如果是0代表需要通路備份伺服器
  /**
   * 門店不通時,需要查詢備份伺服器
   */
  public static String BAK_IP="10.2.2.71";   //備份資料伺服器ip
//  public static String BAK_IP="192.168.1.122";           //備份資料伺服器ip
  /**
   *路徑的全局變量
   */
  public  static String GLOBALS_PATH="";         //設定日志的全局變量
  public static String GLOBAL_MP3_PATH="";  //設定mp3門店存放的全局變量
  /**
   * 用于判斷是否有“請選擇”字樣的變量
   */
  public static String GLOBALS_JADGMENT="請選擇";
  /**
   * 2015-11-26
   * 提示查詢發票商品最綜是否符合發券資訊
   */
  public static String RESULT_JSP_TRUE="符合(本地門店伺服器【已生成】優惠券!)";   //顯示符合發券,備注本地伺服器已經發券
  public static String RESULT_JSP_FALSE="符合(本地門店伺服器【未生成】優惠券,【需要總部補發】!)";   //顯示符合發券,備注本地伺服器未發券
  
  /**
   * 2015-11-30
   * 固定時間删除日志
   */
  public static int TIME_DELETE_HOUR=02;      //時
  public static int TIME_DELETE_MINUTES=00;   //分
  public static int TIME_DELETE_SECOND=00;    //秒
  
  
  /**
   * 2015-12-10
   * 固定的下發時間
   */
  public static int TIME_HANDOUT_HOUR=2;      //時
  public static int TIME_HANDOUT_MINUTES=0;   //分
  public static int TIME_HANDOUT_SECOND=0;    //秒
  /**
   * 2016-01-06
   * 固定的删除空檔案和不存在的檔案的時間
   */
  public static int TIME_DELETE_FILE_HOUR=1;      //時
  public static int TIME_DELELTE_FILE_MINUTES=0;   //分
  public static int TIME_DELETE_FILE_SECOND=0;    //秒
  /**
   * xml和mp3下發相關
   */
  public static String URL_MP3XML_MASTER="D://play/";              //.40上的mp3和xml檔案路徑預設是D盤
  public static String URL_MP3XML_LINUX_OR_WINDOWS       ="";                             //存放門店傳回的檔案
  public static String XML_PLAYLIST_NAME="PlayList.xml"; //監聽器傳遞的下發xml檔案名稱
  public static String XML_COMMAND_NAME="command"; //監聽器傳遞的指令參數名稱
  public static String XML_EXECUTE_RESULT="yes";               //.40的servlet接收yes的指令
  
  /**
   * 2015-12-11
   * 新增參數:判斷是否連接配接門店資料庫成功
   */
  public static String CONECT_MD_RESULT="連結失敗";
  public static String MD_TO_MASTER_SUCESS="1";   //接收mp3後給.40傳回的成功标記
  public static String MD_TO_MASTER_ERROR="0";   //接收xml檔案或者mp3後給.40傳回的失敗标記
  /**
   * 儲存日志已經xml和mp3檔案的磁盤路徑
   */
  public static String PATH_CDEF_C ="C:/"; //windows下C槽
  public static String PATH_CDEF_D="D:/";//windows下D盤
  public static String PATH_CDEF_E ="E:/";//windows下E盤
  
  /**
   * 2016-01-21 優惠券發券表中的sftd目前為1時,表示為通兌碼
   */
  public static int PARAM_SFTD=1;
}      

------LogListener 監聽----

import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import web.md.util.LogUtil;
public class LogListener implements ServletContextListener{
    private LogUtil logger=new LogUtil();

    public void contextDestroyed(ServletContextEvent sce) {
    }
    public void contextInitialized(ServletContextEvent sce) {
        Timer timer=new Timer();
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, UrlInfo.TIME_DELETE_HOUR); // 控制時 
        calendar.set(Calendar.MINUTE, UrlInfo.TIME_DELETE_MINUTES);   // 控制分 
        calendar.set(Calendar.SECOND, UrlInfo.TIME_DELETE_SECOND);    // 控制秒 
        Date time = calendar.getTime(); // 得出執行任務的時間,此處為今天的02:00:00 
//擷取時間
        timer.scheduleAtFixedRate(new TimerTask() {
            int firstDate=0;
            int lastDate =0;
            @Override
            public void run() {
                logger.info("---【監聽器監聽到開始删除日志檔案】---");
//擷取日志檔案夾的路徑
                String logPath=UrlInfo.GLOBALS_PATH+"/mdlog/mdWeb/";
/**
 * 定時删除任務
 */
//擷取目前日期往前推一個月的開始時間和結束時間
                firstDate=logger.getForwardDate(-2);
                lastDate =logger.getForwardDate(-1);
//首先進入目錄去比對是否有該檔案夾
                if(new File(logPath).isDirectory()){
//擷取檔案夾中的檔案集合
                    File []logs=new File(logPath).listFiles();
//周遊集合
                    for(int i=0;i=firstDate&&logInt<=lastDate){
                            logger.info("----監聽器中,開始删除往前一個月的日志檔案:"+log);
//執行删除方法
                            log.delete();
                        }
                    }
                }
                logger.info("---【監聽器監聽到删除日志檔案結束】---");
            }
        }, time, 24*60*60*1000);//每天執行一次
    }
}
=firstDate&&logInt<=lastDate){
                            logger.info("----監聽器中,開始删除往前一個月的日志檔案:"+log);
//執行删除方法
                            log.delete();
                        }
                    }
                }
                logger.info("---【監聽器監聽到删除日志檔案結束】---");
            }
        }, time, 24*60*60*1000);//每天執行一次
    }
}