/* * Copyright (C) 2005 Luca Veltri - University of Parma - Italy * * This file is part of MjSip (http://www.mjsip.org) * * MjSip is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MjSip is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MjSip; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author(s): * Luca Veltri (luca.veltri@unipr.it) */ package org.zoolu.tools; import java.io.*; import java.util.Date; import java.util.Calendar; //import java.util.GregorianCalendar; /** Class RotatingLog extends Log with log file rotation. */ public class RotatingLog extends Log { /** Month */ //public static final int MONTH=GregorianCalendar.MONTH; public static final int MONTH=Calendar.MONTH; /** Day */ //public static final int DAY=GregorianCalendar.DAY_OF_MONTH; public static final int DAY=Calendar.DAY_OF_MONTH; /** Hour */ //public static final int HOUR=GregorianCalendar.HOUR; public static final int HOUR=Calendar.HOUR; /** Minute */ //public static final int MINUTE=GregorianCalendar.MINUTE; public static final int MINUTE=Calendar.MINUTE; /** Number of log file rotations (value 0 means no rotation) */ int num_rotations; /** Rotates log files */ String file_name; /** Time scale (MONTH, DAY, HOUR, or MINUTE) */ int time_scale; /** Time value that log files are rotated (time = time_scale * time_value) */ int time_value; /** Date of the next rotation */ long next_rotation; /****************************** Constructors ******************************/ /** Creates a new RotatingLog file <i>filename</i> * . RotatingLog size is limited to <i>logsize</i> [bytes] */ public RotatingLog(String filename, String logname, int loglevel, long logsize, int n_rotations, int t_scale, int t_value) { super(filename,logname,loglevel,logsize); rInit(filename,n_rotations,t_scale,t_value); } /** Rotates logs */ public RotatingLog rotate() { if (num_rotations>0) { for (int i=num_rotations-2; i>0; i--) { // rename back files rename(file_name+i,file_name+(i+1)); } // save and close current log file if (out_stream!=null) out_stream.close(); // rename current log file if (num_rotations>1) rename(file_name,file_name+1); // reset the log try { out_stream=new PrintStream(new FileOutputStream(file_name)); } catch (IOException e) { e.printStackTrace(); } init(out_stream,log_tag,verbose_level,max_size); } return this; } /** Prints the <i>log</i> if <i>level</i> isn't greater than the Log <i>verbose_level</i> */ public Log print(String message, int level) { //long now=GregorianCalendar.getInstance().getTime().getTime(); long now=Calendar.getInstance().getTime().getTime(); if (now>next_rotation) { rotate(); updateNextRotationTime(); } return super.print(message,level); } /*************************** Private methods ***************************/ /** Inits rotation */ private void rInit(String f_name, int n_rotations, int t_scale, int t_value) { file_name=f_name; num_rotations=n_rotations; time_scale=t_scale; time_value=t_value; updateNextRotationTime(); } /** Renames a file */ private static void rename(String src_file, String dst_file) { File src=new File(src_file); if (src.exists()) { File dst=new File(dst_file); if (dst.exists()) dst.delete(); src.renameTo(dst); } } /** Updates the next rotation date */ private void updateNextRotationTime() { //Calendar cal=GregorianCalendar.getInstance(); Calendar cal=Calendar.getInstance(); cal.add(time_scale,time_value); next_rotation=cal.getTime().getTime(); } }