前两年,我曾经参加过一个金融项目的开发,虽然只是在项目中没做多少事情,但当时的一个客户(银行)的功能需求给我留下了深刻印象。
需求如下:
为每个访问的用户单独建立一个日志文件,保证用户的所有操作流程都保存在这个日志文件中。也就是说,有一个用户访问就要为他建立一个日志文件,有十个、百个、千个、万个用户访问,就要创建十个、百个、千个、万个日志文件,并且相互之间是不能互相影响的。
说明一下,这个系统是web(J2EE)的
这个需求看起来很简单,不就是给每个用户建立单独的日志文件嘛!现在想起来感觉其实也不是很难,呵呵……可当时自己就是没能解决(只能说我的水平不够)。下面我把思路写出来,有朋友过来看过,烦请留个脚印,告诉我你的看法和认识,以此来交流一下。
首先,要做的就是如何生成一个日志文件。使用log4j可以生成日志文件,而且这个开源项目已经做的很成熟了,当然是首选。使用log4j,可以通过xml或者properties的方式定制日志产生,比如定制文件名称、文件大小限制、输出的格式等等。我们的需要是要为每个用户生成日志,显然通过配置文件是无法实现该功能的,只能通过手动写代码来控制、动态生成日志文件。
部分代码如下:
layout = new PatternLayout(pattrenlayput);
// log文件设置
fileAppendar = new RollingFileAppender(layout, FileName, true);
fileAppendar.setMaximumFileSize(10240);//设置文件最大容量
fileAppendar.setMaxBackupIndex(10);//
// 控制台设置
consoleAppendar = new ConsoleAppender(layout, "System.out");
MainLogger = Logger.getLogger(logName);
// // 设置级别
MainLogger.setLevel(Level.INFO);
MainLogger.addAppender(fileAppendar);
MainLogger.addAppender(consoleAppendar);
代码设置log4j和使用xml配置log4j基本相同,这里唯一不同的就是logName可以自由指定,而配置文件是写死的,固定的;
其次,设定好log了,那么就是该如何使用log4j了。我们需要考虑的是日志文件名字要唯一,而且日志logName也要唯一(如果logName相同的话,就会产生日志内容没有区分开的结果)。日志文件名和日志名均可采用用户ID,在一个系统中,用户ID是唯一的。
再者,在任何一个JAVA系统中,不可能将所有的代码写在一个class中,这是不现实的事情。那么在不同类中使用同一个log,怎么才能做的到呢?可以考虑使用session存储log名。在每一个business logical block中,都可以获得session,那么这样就可以解决了log名的问题。
总结:好的系统设计,会产生更少的系统问题以及后续的维护问题。