`
lishengxi
  • 浏览: 2490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

根据Session区分的日志系统.

阅读更多
前一阵,被经理安排了个任务,,就是在现有项目中加入日志,但是要根据Session的值来区分日志文件.用LOG4J实现不了..哎 怒了...自己重写了一个....

具体需求:
1,按这个分公司编号创建文件夹
2,按部门号+日期创建LOG文件
3,当日志文件大于指定SIZE时拷贝文件


各位多提一提意见,,, 本人技术有限, 有些地方的可能存在错误,我想不到的! 请各位指正啊!!


Log.java
package org.dhcc.fm.log;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpSession;
/**
 * 日志类
 * @author lishengxi
 *
 */
public class Log  {
	private LogFile tf = null;
	public Log(HttpSession session){
		tf = new LogFile(session);
	}
	public String logForMat(){
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日-HH点mm分ss秒");
		String newDate = format.format(new Date());
		return newDate+",发生错误:";
	}
	public void error(String mss){
		try {
			tf.write(logForMat()+mss);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void error(String mss,Exception et){
		try {
			tf.write(logForMat()+mss,et);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	

}

LogFactory.java
package org.dhcc.fm.log;

import javax.servlet.http.HttpSession;
/**
 * 日志工厂类
 * @author lishengxi
 *
 */
public class LogFactory {
	public static Log createLog(HttpSession session){
		Log log = new Log(session);
		return log;
	}
}


LogFile.java
package org.dhcc.fm.log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpSession;
/**
 * 日志文件操作类
 * @author lishengxi
 */
public class LogFile {
	private static String logpath = LogProperties.LOG_FM_FILE_PATH; 
	private static String fileH = LogProperties.LOG_FM_FILE_TYPE; 
	private static long length = LogProperties.LOG_FM_FILE_SIZE;
	private static String department = LogProperties.LOG_FM_SESSION_DEPARTMENT;
	private static String upbrno = LogProperties.LOG_FM_SESSION_UPBRNO;
	private static String encoding = LogProperties.LOG_FM_FILE_ENCODING;
	private String _fileName;
	private String up_br_no;
	private long count;
	public String getUp_br_no() {
		return up_br_no;
	}
	public void setUp_br_no(String upBrNo) {
		up_br_no = upBrNo;
	}
	public LogFile(HttpSession session){
		String temp = session.getAttribute(department).toString();
		if(temp!=null&&!temp.equals("")){
			_fileName = temp;
			up_br_no =  session.getAttribute(upbrno).toString();
		}
		newFolder();
		newFile();
	}
	public void newFolder(){
		try
		{
			String filePath = logpath+"\\"+getUp_br_no();
			filePath = filePath.toString();
			File myFilePath = new File(filePath);
			if(!myFilePath.exists()){
				myFilePath.mkdir();
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	public void newFile(){
		try{
			String filePath = logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH;
			File myFilePath = new File(filePath);
			if (!myFilePath.exists()){
				
				myFilePath.createNewFile();
			}
		}
		catch (Exception e){
			e.printStackTrace();
		}
	}
	public void rollOver() {
		File myFilePath = new File(logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH);
		File target = new File(logpath+"\\"+getUp_br_no()+"\\"+getTLogFile(_fileName)+fileH);
		if(myFilePath.length()>length){
			myFilePath.renameTo(target);
		}
	}
	public void write(String str,Exception e) throws Exception{
		this.rollOver();
		File myFilePath = new File(logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH);
		FileOutputStream fos = new FileOutputStream(myFilePath,true);
		OutputStreamWriter osw = new OutputStreamWriter(fos,encoding);
		PrintWriter myFile = new PrintWriter(osw);
		myFile.println(str);
		e.printStackTrace(myFile);
		myFile.close();
		osw.close();
		fos.close();
	}
	public void write(String str) throws Exception{
		this.rollOver();
		File myFilePath = new File(logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH);
		FileOutputStream fos = new FileOutputStream(myFilePath,true);
		OutputStreamWriter osw = new OutputStreamWriter(fos,encoding);
		PrintWriter myFile = new PrintWriter(osw);
		myFile.println(str);
		myFile.close();
		osw.close();
		fos.close();
	}
	private String getLogFile(String fileName){
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
		return fileName+"_"+format.format(new Date());
	}
	private String getTLogFile(String fileName){
		SimpleDateFormat format = new SimpleDateFormat("HH点mm分ss秒");
		return getLogFile(fileName)+"_"+format.format(new Date());
	}
}

LogProperties.java
package org.dhcc.fm.log;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 日志属性类
 * @author lishengxi
 *
 */
public class LogProperties {
	private static final String LOGFILE = "LOG.properties"; //默认日志配置文件
	public static String LOG_FM_FILE_PATH = "";//日志保存路径
	public static String LOG_FM_FILE_TYPE = "";//日志文件类型
	public static String LOG_FM_FILE_ENCODING = "";//日志文件编码
	public static long LOG_FM_FILE_SIZE = 0;//日志文件大小
	public static String LOG_FM_SESSION_DEPARTMENT = "";//部门
	public static String LOG_FM_SESSION_UPBRNO = "";//机构
	
	static{
		//获取ClassPath下的日志配置文件
		InputStream is1 = Thread.currentThread().getContextClassLoader().getResourceAsStream(LOGFILE);
		Properties p = new Properties();
		try {
			p.load(is1);
			LOG_FM_FILE_PATH = p.getProperty("log.fm.file.path");
			LOG_FM_FILE_TYPE = p.getProperty("log.fm.file.type");
			LOG_FM_FILE_SIZE = LogUtil.toFileSize(p.getProperty("log.fm.file.size"),1024);
			LOG_FM_FILE_ENCODING = p.getProperty("log.fm.file.type.encoding");
			LOG_FM_SESSION_DEPARTMENT = p.getProperty("log.fm.session.department");
			LOG_FM_SESSION_UPBRNO = p.getProperty("log.fm.session.upbrno");
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

LogUtil.java
package org.dhcc.fm.log;

/**
 * 日志工具类
 * @author lishengxi
 *
 */
public class LogUtil {
	/**
	 * 转换文件大小      2MB  =  1024*1024*2
	 * @param value
	 * @param dEfault
	 * @return
	 */
	public static long toFileSize(String value, long dEfault) {
	    if(value == null)
	      return dEfault;
	    String s = value.trim().toUpperCase();
	    long multiplier = 1;
	    int index;
	    if((index = s.indexOf("KB")) != -1) {
	      multiplier = 1024;
	      s = s.substring(0, index);
	    }
	    else if((index = s.indexOf("MB")) != -1) {
	      multiplier = 1024*1024;
	      s = s.substring(0, index);
	    }
	    else if((index = s.indexOf("GB")) != -1) {
	      multiplier = 1024*1024*1024;
	      s = s.substring(0, index);
	    }
	    if(s != null) {
	      try {
	      		return Long.valueOf(s).longValue() * multiplier;
	      }
	      catch (NumberFormatException e) {
	    	  e.printStackTrace();
	      }
	    }
	    return dEfault;
	 }
}


测试一下啊...!!!!!!!!
package org.dhcc.fm.log;

import java.util.Enumeration;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionContext;
import org.dhcc.fm.log.*;

public class Test extends Thread {
	
	private String TName = "";
	public Test(String N){
		TName = N;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		 HttpSession session = new HttpSession() {
				HashMap sessionSop = new HashMap();
				public void setMaxInactiveInterval(int arg0) {
					// TODO Auto-generated method stub
				
				}
				
				public void setAttribute(String arg0, Object arg1) {
					// TODO Auto-generated method stub
					sessionSop.put(arg0, arg1);
				}
				
				public void removeValue(String arg0) {
					// TODO Auto-generated method stub
					
				}
				
				public void removeAttribute(String arg0) {
					// TODO Auto-generated method stub
					
				}
				
				public void putValue(String arg0, Object arg1) {
					// TODO Auto-generated method stub
					
				}
				
				public boolean isNew() {
					// TODO Auto-generated method stub
					return false;
				}
				
				public void invalidate() {
					// TODO Auto-generated method stub
					
				}
				
				public String[] getValueNames() {
					// TODO Auto-generated method stub
					return null;
				}
				
				public Object getValue(String arg0) {
					// TODO Auto-generated method stub
					return null;
				}
				
				public HttpSessionContext getSessionContext() {
					// TODO Auto-generated method stub
					return null;
				}
				
				public ServletContext getServletContext() {
					// TODO Auto-generated method stub
					return null;
				}
				
				public int getMaxInactiveInterval() {
					// TODO Auto-generated method stub
					return 0;
				}
				
				public long getLastAccessedTime() {
					// TODO Auto-generated method stub
					return 0;
				}
				
				public String getId() {
					// TODO Auto-generated method stub
					return null;
				}
				
				public long getCreationTime() {
					// TODO Auto-generated method stub
					return 0;
				}
				
				public Enumeration getAttributeNames() {
					// TODO Auto-generated method stub
					return null;
				}
				
				public Object getAttribute(String arg0) {
					// TODO Auto-generated method stub
					return sessionSop.get(arg0);
				}
			};
			session.setAttribute("department_name", "三星企划事业部");
			session.setAttribute("up_br_no", "010002");
			Log log = LogFactory.createLog(session);
			for(int i = 0 ; i < 10000 ; i ++){
				try {
					thorwsOut();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					log.error("数据库连接错误!",e);
					e.printStackTrace();
				}
				
			}
	}
	public void thorwsOut() throws Exception{
		throw new Exception("数据连接格式不正确!..");
	}
	public static void main(String agrs[]){
		new Test("线程1").start();
		System.out.println("1--------");
		new Test("线程2").start();
		System.out.println("2--------");
		new Test("线程3").start();
		System.out.println("3--------");
	}

}

忘了,要加入LOG.properties
log.fm.file.path = c:\\fm_log\\
log.fm.file.type = .log 
log.fm.file.size = 1MB
log.fm.file.type.encoding = UTF-8
log.fm.session.department = department_name
log.fm.session.upbrno = up_br_no

效果就是

完!!!!

分享到:
评论
10 楼 wip868 2010-06-22  
可以使用Log4j NDC 存储用户信息
9 楼 hareamao 2010-06-22  
lishengxi 写道
mercyblitz 写道
建立一个HttpSessionAttributeListener,当属性被添加时,根据一定的模式添加Appender,就OK啦。

3Q,有一点点思路了!!! 本来以为LOG4J 实现不了..  

再自己扩展一下log4j的file appender应该就可以了,需求的3,log4j已经实现了,只需要自己做1,2就可以了。
8 楼 lishengxi 2010-06-22  
mercyblitz 写道
建立一个HttpSessionAttributeListener,当属性被添加时,根据一定的模式添加Appender,就OK啦。

3Q,有一点点思路了!!! 本来以为LOG4J 实现不了..  
7 楼 mercyblitz 2010-06-21  
建立一个HttpSessionAttributeListener,当属性被添加时,根据一定的模式添加Appender,就OK啦。
6 楼 lishengxi 2010-06-21  
   
5 楼 lishengxi 2010-06-21  
climber2002 写道
贴一下我以前的代码吧,我自己创建了一个DeviceLogger扩展了log4j的logger, 然后写了一个DeviceFileAppender。 DeviceFileAppender里面维护了一个Map,用来完成手机号跟相应的FileAppender之间的映射。 不过你的实现要考虑session失效的时候把相应的FileAppender从Map删掉,要不最终会OutOfMemory。

public class DeviceLogger extends Logger {
	
	/**
    The fully qualified name of the Logger class. See also the
    getFQCN method. */
	private static final String FQCN = DeviceLogger.class.getName() + ".";
	
	/**
	 * In log4j.properties, this logger should be configured to an appender <code>DeviceFileAppender</code>
	 */
	public static final String PARENT_LOGGER_NAME = "com.smartomcx.logging.device.";
	
	private static DeviceLoggerFactory factory = new DeviceLoggerFactory();
	
	private String imei;

	protected DeviceLogger(String name) {
		super(name);
		this.imei = name.substring(PARENT_LOGGER_NAME.length());	
	}

	public String getImei() {
		return imei;
	}
	
	public static DeviceLogger getDeviceLogger(String imei) {
		return (DeviceLogger)Logger.getLogger(PARENT_LOGGER_NAME + imei, factory);
	}

}


public class DeviceLoggerFactory implements LoggerFactory {

	public Logger makeNewLoggerInstance(String imei) {
		return new DeviceLogger(imei);
	}

}

/**
 * This appender appends the log of <code>DeviceLogger</code> to a separate file for each IMEI. 
 * Under parent folder, each imei will have a subfolder, and the log for each IMEI will be output
 * to device.log under each specific folder
 * 
 * @author 
 *
 */
public class DeviceFileAppender extends AppenderSkeleton {
	
	private ConcurrentMap<String, FileAppender> appenders = new ConcurrentHashMap<String, FileAppender>();
	
	 /** Controls file truncatation. The default value for this variable
	   * is <code>true</code>, meaning that by default a
	   * <code>FileAppender</code> will append to an existing file and not
	   * truncate it.
	   *
	   * <p>This option is meaningful only if the FileAppender opens the
	   * file.
	   */
	  protected boolean fileAppend = true;

	  /**
	     The name of the parent folder. */
	  protected String parentFolder = null;

	  /**
	     Do we do bufferedIO? */
	  protected boolean bufferedIO = false;

	  /**
	   * Determines the size of IO buffer be. Default is 8K. 
	   */
	  protected int bufferSize = 8*1024;
	
	
	public DeviceFileAppender() {
		
	}
	

	public boolean isFileAppend() {
		return fileAppend;
	}



	public void setFileAppend(boolean fileAppend) {
		this.fileAppend = fileAppend;
	}



	public String getParentFolder() {
		return parentFolder;
	}


	/**
	 * This is the parent folder for all devices
	 * @param parentFolder
	 */
	public void setParentFolder(String parentFolder) {
		this.parentFolder = parentFolder.trim();
		if(this.parentFolder.endsWith(System.getProperty("file.separator") )) {	//the folder name should not contain '/' at end
			this.parentFolder = this.parentFolder.substring(0, this.parentFolder.length() - 1);
		}
	}



	public boolean isBufferedIO() {
		return bufferedIO;
	}



	public void setBufferedIO(boolean bufferedIO) {
		this.bufferedIO = bufferedIO;
	}



	public int getBufferSize() {
		return bufferSize;
	}



	public void setBufferSize(int bufferSize) {
		this.bufferSize = bufferSize;
	}



	/* (non-Javadoc)
	 * @see org.apache.log4j.AppenderSkeleton#append(org.apache.log4j.spi.LoggingEvent)
	 */
	@Override
	protected void append(LoggingEvent event) {
		Category category = event.getLogger();
		if(!(category instanceof DeviceLogger)) {	//only append DeviceLogger
			return;
		}
		DeviceLogger logger = (DeviceLogger)category;
		FileAppender appender = null;
		try {
			appender = getFileAppender(logger.getImei());
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}
		appender.append(event);

	}
	
	/**
	 * Get the FileAppender based on the imei
	 * @param imei
	 * @return
	 * @throws IOException 
	 */
	protected synchronized FileAppender getFileAppender(String imei) throws IOException {
		FileAppender appender = this.appenders.get(imei);
		if(appender != null) {
			return appender;
		}
		
		String imeiFolderPath = getImeiFolderPath(imei);
		File imeiFolder = new File(imeiFolderPath);
		deleteImeiFolderIfNotDirectory(imeiFolder);
		createImeiFolderIfNotExist(imeiFolder);
		String logFilePath = getLogFilePath(imeiFolderPath);
		
		appender = new FileAppender(getLayout(), logFilePath, this.isFileAppend(), this.isBufferedIO(), this.getBufferSize());
		this.appenders.put(imei, appender);
		return appender;
	}

	
	/**
	 * Get the log file path under the IMEI folder
	 * @param imeiFolderPath
	 * @return
	 */
	protected String getLogFilePath(String imeiFolderPath) {
		String logFilePath = imeiFolderPath + System.getProperty("file.separator") + "device.log";
		return logFilePath;
	}

	
	/**
	 * Get the IMEI folder path for a imei
	 * @param imei
	 * @return
	 */
	protected String getImeiFolderPath(String imei) {
		String imeiFolderPath = this.parentFolder + System.getProperty("file.separator") + imei;
		return imeiFolderPath;
	}
	
	

	
	
	protected void deleteImeiFolderIfNotDirectory(File imeiFolder) {
		if(imeiFolder.exists() && !imeiFolder.isDirectory()) {
			imeiFolder.delete();
		}
	}
	
	private void createImeiFolderIfNotExist(File imeiFolder) {
		if(! imeiFolder.exists()) {
			imeiFolder.mkdir();
		}
	}

	/* (non-Javadoc)
	 * @see org.apache.log4j.Appender#close()
	 */
	public void close() {
		closeAllAppenders();
		reset();
	}
	
	private void closeAllAppenders() {
		Set<Entry<String, FileAppender>> entries = this.appenders.entrySet();
		for(Entry<String, FileAppender> entry : entries) {
			entry.getValue().close();
		}
	}
	
	private void reset() {
		this.appenders.clear();
	}

	/* (non-Javadoc)
	 * @see org.apache.log4j.Appender#requiresLayout()
	 */
	public boolean requiresLayout() {
		return true;
	}

}


对啊,,  难道销毁 要写成 监听 然后 把 那个MAP 改成static??
4 楼 climber2002 2010-06-21  
log4j中的appender部分的配置

#define the appender named DEVICEFILE
log4j.appender.DEVICEFILE=com.smartomcx.logging.DeviceFileAppender
log4j.appender.DEVICEFILE.ParentFolder=../../../devices
log4j.appender.DEVICEFILE.layout = org.apache.log4j.SimpleLayout 


log4j.logger.com.smartomcx.logging.device=DEBUG,DEVICEFILE 


测试代码

public class DeviceLoggerTest {

	@Test
	public void testDeviceLogger() throws Exception {
		DeviceLogger logger = DeviceLogger.getDeviceLogger("1234567");
		logger.info("test for device " + logger.getImei());
		
		DeviceLogger logger2 = DeviceLogger.getDeviceLogger("1234568");
		logger2.info("test for device " + logger.getImei());
		
		DeviceLogger logger3 = DeviceLogger.getDeviceLogger("1234567");
		logger3.info("another logger " + logger.getImei());
	}
	
}


3 楼 climber2002 2010-06-21  
贴一下我以前的代码吧,我自己创建了一个DeviceLogger扩展了log4j的logger, 然后写了一个DeviceFileAppender。 DeviceFileAppender里面维护了一个Map,用来完成手机号跟相应的FileAppender之间的映射。 不过你的实现要考虑session失效的时候把相应的FileAppender从Map删掉,要不最终会OutOfMemory。

public class DeviceLogger extends Logger {
	
	/**
    The fully qualified name of the Logger class. See also the
    getFQCN method. */
	private static final String FQCN = DeviceLogger.class.getName() + ".";
	
	/**
	 * In log4j.properties, this logger should be configured to an appender <code>DeviceFileAppender</code>
	 */
	public static final String PARENT_LOGGER_NAME = "com.smartomcx.logging.device.";
	
	private static DeviceLoggerFactory factory = new DeviceLoggerFactory();
	
	private String imei;

	protected DeviceLogger(String name) {
		super(name);
		this.imei = name.substring(PARENT_LOGGER_NAME.length());	
	}

	public String getImei() {
		return imei;
	}
	
	public static DeviceLogger getDeviceLogger(String imei) {
		return (DeviceLogger)Logger.getLogger(PARENT_LOGGER_NAME + imei, factory);
	}

}


public class DeviceLoggerFactory implements LoggerFactory {

	public Logger makeNewLoggerInstance(String imei) {
		return new DeviceLogger(imei);
	}

}

/**
 * This appender appends the log of <code>DeviceLogger</code> to a separate file for each IMEI. 
 * Under parent folder, each imei will have a subfolder, and the log for each IMEI will be output
 * to device.log under each specific folder
 * 
 * @author 
 *
 */
public class DeviceFileAppender extends AppenderSkeleton {
	
	private ConcurrentMap<String, FileAppender> appenders = new ConcurrentHashMap<String, FileAppender>();
	
	 /** Controls file truncatation. The default value for this variable
	   * is <code>true</code>, meaning that by default a
	   * <code>FileAppender</code> will append to an existing file and not
	   * truncate it.
	   *
	   * <p>This option is meaningful only if the FileAppender opens the
	   * file.
	   */
	  protected boolean fileAppend = true;

	  /**
	     The name of the parent folder. */
	  protected String parentFolder = null;

	  /**
	     Do we do bufferedIO? */
	  protected boolean bufferedIO = false;

	  /**
	   * Determines the size of IO buffer be. Default is 8K. 
	   */
	  protected int bufferSize = 8*1024;
	
	
	public DeviceFileAppender() {
		
	}
	

	public boolean isFileAppend() {
		return fileAppend;
	}



	public void setFileAppend(boolean fileAppend) {
		this.fileAppend = fileAppend;
	}



	public String getParentFolder() {
		return parentFolder;
	}


	/**
	 * This is the parent folder for all devices
	 * @param parentFolder
	 */
	public void setParentFolder(String parentFolder) {
		this.parentFolder = parentFolder.trim();
		if(this.parentFolder.endsWith(System.getProperty("file.separator") )) {	//the folder name should not contain '/' at end
			this.parentFolder = this.parentFolder.substring(0, this.parentFolder.length() - 1);
		}
	}



	public boolean isBufferedIO() {
		return bufferedIO;
	}



	public void setBufferedIO(boolean bufferedIO) {
		this.bufferedIO = bufferedIO;
	}



	public int getBufferSize() {
		return bufferSize;
	}



	public void setBufferSize(int bufferSize) {
		this.bufferSize = bufferSize;
	}



	/* (non-Javadoc)
	 * @see org.apache.log4j.AppenderSkeleton#append(org.apache.log4j.spi.LoggingEvent)
	 */
	@Override
	protected void append(LoggingEvent event) {
		Category category = event.getLogger();
		if(!(category instanceof DeviceLogger)) {	//only append DeviceLogger
			return;
		}
		DeviceLogger logger = (DeviceLogger)category;
		FileAppender appender = null;
		try {
			appender = getFileAppender(logger.getImei());
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}
		appender.append(event);

	}
	
	/**
	 * Get the FileAppender based on the imei
	 * @param imei
	 * @return
	 * @throws IOException 
	 */
	protected synchronized FileAppender getFileAppender(String imei) throws IOException {
		FileAppender appender = this.appenders.get(imei);
		if(appender != null) {
			return appender;
		}
		
		String imeiFolderPath = getImeiFolderPath(imei);
		File imeiFolder = new File(imeiFolderPath);
		deleteImeiFolderIfNotDirectory(imeiFolder);
		createImeiFolderIfNotExist(imeiFolder);
		String logFilePath = getLogFilePath(imeiFolderPath);
		
		appender = new FileAppender(getLayout(), logFilePath, this.isFileAppend(), this.isBufferedIO(), this.getBufferSize());
		this.appenders.put(imei, appender);
		return appender;
	}

	
	/**
	 * Get the log file path under the IMEI folder
	 * @param imeiFolderPath
	 * @return
	 */
	protected String getLogFilePath(String imeiFolderPath) {
		String logFilePath = imeiFolderPath + System.getProperty("file.separator") + "device.log";
		return logFilePath;
	}

	
	/**
	 * Get the IMEI folder path for a imei
	 * @param imei
	 * @return
	 */
	protected String getImeiFolderPath(String imei) {
		String imeiFolderPath = this.parentFolder + System.getProperty("file.separator") + imei;
		return imeiFolderPath;
	}
	
	

	
	
	protected void deleteImeiFolderIfNotDirectory(File imeiFolder) {
		if(imeiFolder.exists() && !imeiFolder.isDirectory()) {
			imeiFolder.delete();
		}
	}
	
	private void createImeiFolderIfNotExist(File imeiFolder) {
		if(! imeiFolder.exists()) {
			imeiFolder.mkdir();
		}
	}

	/* (non-Javadoc)
	 * @see org.apache.log4j.Appender#close()
	 */
	public void close() {
		closeAllAppenders();
		reset();
	}
	
	private void closeAllAppenders() {
		Set<Entry<String, FileAppender>> entries = this.appenders.entrySet();
		for(Entry<String, FileAppender> entry : entries) {
			entry.getValue().close();
		}
	}
	
	private void reset() {
		this.appenders.clear();
	}

	/* (non-Javadoc)
	 * @see org.apache.log4j.Appender#requiresLayout()
	 */
	public boolean requiresLayout() {
		return true;
	}

}

2 楼 lishengxi 2010-06-21  
climber2002 写道
我觉得你扩展一个log4j的Appender就可以了,曾经有个类似的需求,每个手机号生成不同的log文件到每个手机号自己的目录

恩 ,我尝试过... 重新实现一个Appender ,,关键是 如何把session 给传进去呢?   
1 楼 climber2002 2010-06-21  
我觉得你扩展一个log4j的Appender就可以了,曾经有个类似的需求,每个手机号生成不同的log文件到每个手机号自己的目录

相关推荐

    基于PHP的Mylog逍遥坊 php 博客日志系统.zip

    这个系统可能是为了帮助用户创建、管理和分享个人或团队的日志内容,同时也可能包含了用户登录、权限管理、评论互动等功能。PHP是一种广泛应用于Web开发的服务器端脚本语言,以其开源、跨平台和丰富的扩展库著称。 ...

    PHP实例开发源码-阿西php多用户日志系统.zip

    5. **异常处理与日志级别**:系统应具备良好的异常处理机制,当出现错误时自动记录异常日志,同时提供不同的日志级别,如ERROR、WARNING、INFO,方便用户区分问题的严重性。 通过分析这个实例,我们可以学习如何在...

    基于PHP的学生成绩查询系统源码.zip

    8. **错误处理与日志记录**:系统应具有错误处理机制,当发生异常时能够给出明确的提示,同时记录日志,便于后期排查问题。 通过分析这个基于PHP的学生成绩查询系统,我们可以看到PHP在Web开发中的强大功能,以及...

    ASP源码—老Y文章管理系统.zip

    10. **错误处理和日志记录**:系统应有良好的错误处理机制,捕获异常并记录日志,便于问题排查和优化。 在"ASP源码—老Y文章管理系统.zip"的压缩包中,虽然只有一个看似随机的数字串"132676171463758866"作为子...

    基于Javaweb的问卷调查系统.zip

    4. **会话管理**:为了保持用户状态,系统可能需要使用session或cookie来跟踪用户信息,例如登录状态。 【核心功能实现】 1. **问卷创建**:管理员通过后台管理系统可以添加、编辑和删除问卷,包括问题类型(单选...

    ASP实例开发源码-智睿教师档案管理系统.zip

    ASP可以通过Session对象来跟踪用户状态,实现登录验证,并根据用户角色分配不同的操作权限。 3. 页面跳转与导航:ASP可以利用Response对象的Redirect方法实现页面间的跳转,结合服务器端的包含指令(&lt;!--#include ...

    基于python web开发的简易订单系统.zip

    Flask通过其内置的URL路由系统支持这种设计模式,通过HTTP动词(GET、POST、PUT、DELETE等)区分不同的操作。 7. **错误处理与日志记录**:在开发过程中,良好的错误处理和日志记录至关重要。Flask提供了一些基本的...

    基于ASP的淘宝妈妈_淘客推广系统.zip

    【压缩包文件名称列表】:"132690211986904339" - 这个文件名看起来像是一个随机生成的数字序列,可能代表系统中的唯一标识符,或者与时间戳有关,用于区分不同的数据记录或文件版本。在解压后,这可能是一个包含...

    毕业设计:基于PHP商城系统.zip

    系统可能会使用session或cookie来实现用户会话管理,保证用户身份的安全性。同时,通过权限控制,区分普通用户和管理员的权限,如管理员可以管理商品,而普通用户则只能浏览和购买。 5. 商品展示与搜索: 商城系统...

    PHP实例开发源码—帮助中心管理系统.zip

    5. **权限控制**:系统可能区分普通用户和管理员,采用身份验证和授权机制,例如session或cookie,来控制不同用户访问和操作权限。 6. **错误处理和日志记录**:为了追踪系统运行情况,系统应具备错误处理机制,...

    ASP实例开发源码-多用户网络版记帐系统.zip

    6. **错误处理与日志记录**:为了追踪和解决可能出现的问题,系统应有良好的错误处理机制,并记录操作日志,以便于调试和维护。 7. **用户界面**:ASP网页设计应当简洁易用,提供友好的用户体验,包括表格、表单、...

    PHP实例开发源码—coreblog博客系统.zip

    此外,可能还有管理员和普通用户的权限区分,涉及到角色管理和权限控制,这在源码中会体现为特定的逻辑判断。 6. URL路由: 路由是Web应用中将URL映射到特定处理函数的过程。coreblog可能使用了自定义路由规则,...

    PHP图片动画类网站实例开发源码——Lifebox照片视频管理系统.zip

    12. **日志记录**:对于系统操作和错误,PHP可能使用日志记录函数记录,以便于调试和维护。 总的来说,Lifebox系统是一个综合性的PHP项目,涵盖了用户交互、媒体处理、数据库操作、安全防护等多个方面,是学习和...

    ASP.NET源码——[新闻文章]塞普森信息管理系统.zip

    8. **状态管理**:ASP.NET提供了多种状态管理方式,如View State、Session、Cookie等,系统可能会根据需求选择合适的方式存储用户或页面的状态信息。 通过研究这个源码,开发者可以学习到如何在ASP.NET环境下实现一...

    ASP实例开发源码-理工之声学生唠叨系统.zip

    而"132684561070428272"可能是一个文件名,由于没有明确的扩展名,它可能是一个数据库文件(如Access数据库)、配置文件、日志文件,或者是编码后的源代码文件。如果它是源代码的一部分,那么可能包含了ASP页面的...

    Django开发的面试招聘系统.zip

    中间件是Django的一种全局挂钩机制,可以用于添加跨视图的功能,如日志记录、用户Session管理等。自定义模板标签可以扩展模板语言,提供更丰富的功能,如时间格式化、过滤器等。 **8. 部署与性能优化** 在实际生产...

    基于servlet + jsp实现的在线考试系统.zip

    【异常处理与日志记录】:为保证系统的稳定运行,需要对可能出现的错误和异常进行捕获和处理,并记录日志,以便于后期排查问题。 【性能优化】:考虑到在线考试系统可能面临高并发情况,优化点可能包括缓存策略(如...

    ASP.NET源码——拓网IP签名图系统.zip

    7. **身份验证与授权**:ASP.NET内置了安全机制,如Forms Authentication和Role-based Authorization,可以用于验证用户身份并控制访问权限,这对于IP签名图系统至关重要,因为需要区分不同IP的访问权限。...

    ASP,NET源码——[新闻文章]LZ文章信息管理系统.zip

    在LZ系统中,可能会有管理员和普通用户的区分,这涉及权限控制。 7. **模板和母版页**: 母版页(Master Pages)在ASP.NET中用于创建统一的页面布局,可提高代码复用性。LZ系统可能使用母版页来实现头部、导航栏等...

    ASP.NET源码——[学校班级]学校学生综合管理系统.zip

    7. **错误处理和日志记录**:为了追踪和调试,系统可能会有全局异常处理机制和详细的日志记录。 8. **安全性**:如防止SQL注入、跨站脚本攻击(XSS),以及使用HTTPS进行数据加密传输。 此外,系统可能还利用了一些...

Global site tag (gtag.js) - Google Analytics