Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 351|回复: 0

[jsp学习]编写一个随处可调用的静态日志操作类

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 17:22:48 | 显示全部楼层 |阅读模式
    编写一个随处可调用的静态日志操作类      日志文件是一个随处都在使用的文件,它可以很好的记录程序的运行状态和出错信息,几乎每一个 程序都有它的日志文件,在我们用java开发web项目中,会经常需要记录用户的一些登陆,访问, 操作信息.如:一个办公系统,它的日志文件需要记录:
    ………
    Wed May 19 13:35:50 CST 2004:张三登陆了该系统
    Wed May 19 13:35:53 CST 2004:张三插入了一条"下周计划"记录 id:1048
    Wed May 19 13:35:54 CST 2004:李四登陆了该系统
    Wed May 19 13:35:55 CST 2004:张三删除了一条"上周总结"记录, d:1024
    Wed May 19 13:35:59 CST 2004:张三退出了该系统
    ................  
      
      实现思路:
    1. 为了很好的实现这个记录类,必须要使用”单态”模式,这样该类不必每次调用的时候都需要生成它的实例.
    2. 为了防止多线程同时操作(写)日志文件,造成文件”死锁”,必须考虑同步,使用synchronized关键字.
    3. 为了不必关心该类唯一实例的生成,而直接使用该类的静态方法实现日志的记录
    4. 为了更方便的配置日志文件的路径,使用属性文件配置.  废话太多了,不像搞程序的了,直接看代码,所有的注释在代码中说明:
    1. import java.io.*;
    2. import java.util.*;
    3. public class LogWriter {
    4. private static final String DefalutLogFilePathName="c:\logtext.log";//默认的日志文件的路径和文件名称
    5. private static LogWriter logwriter; //该类的唯一的实例
    6. private static InputStream fin; //属性配置文件的输入流
    7. private static Properties pro; //class Properties′s supper is Hashtable class
    8. private static PrintWriter out; //output stream
    9. private static String logFileName; //output file name
    10. private LogWriter() {
    11.    outInit();//init out put stream,实例化PrintWriter out 对象.
    12. }
    13. /**保存你想保存在日志文件中的信息,实现同步
    14. * out put the message infomation
    15. * @param message infomation
    16. */
    17. public static synchronized void log(String message) {
    18.   if (logwriter == null || (out == null)){
    19.      logwriter = new LogWriter();
    20.   }
    21.   if (out != null) {
    22.      out.println(new java.util.Date() + ":" + message);
    23.   }
    24. }
    25. /**把异常信息保存在日志文件中,实现同步
    26. * out put the Excetion infomation
    27. * @param message infomation
    28. */
    29. public static synchronized void log(Exception ex) {
    30.   if (logwriter == null || (out == null))
    31.       logwriter = new LogWriter();
    32.   if (out != null) {
    33.       out.println(new java.util.Date() + ":" );
    34.       ex.printStackTrace(out);
    35.   }
    36. }
    37. /**
    38. *输出文件流的init
    39. */
    40. private void outInit() {
    41.    if (logFileName == null)
    42.        logFileName = getlogFileName(); //从属性文件中类获得日志文件的路径
    43.    try {
    44.       if (out == null) {//如果输出i/o没有实例,则生成一个新的
    45.         out = new PrintWriter(new FileWriter(logFileName, true), true);  
    46.         //其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容
    47.       }
    48.    }catch (IOException ex) {
    49.        System.out.println("无法打开日志文件:"+logFileName);
    50.        ex.printStackTrace();
    51.        out = null;
    52.    }
    53. }
    54. /**
    55. *根据配置文件.来获得日志文件的位置
    56. *
    57. * @return logFileName
    58. */
    59. private String getlogFileName() {
    60.   try {
    61.    if (pro == null) {
    62.      pro = new java.util.Properties();
    63.      fin = getClass().getResourceAsStream("log.properties"); //在类的当前位置,查找属性配置文件log.properties
    64.      pro.load(fin);//载入配置文件
    65.      fin.close();
    66.    }
    67. }catch (IOException ex) {
    68.      System.err.println("无法打开属性配置文件: log.properties" );
    69.      ex.printStackTrace();
    70.   }
    71.   return pro.getProperty("logfile",DefalutLogFilePathName);
    72.   //根据属性值获得日志文件路径,第二个参数是:如果找不到"logfile"标志,就返回的默认值
    73. }
    74. /**你也可以在所有的日志都记录完成的时候,调用该方法,释放资源.
    75. * free all the resouce,this is secuty method
    76. */
    77. public void free() {
    78.   try {
    79.     this.logwriter = null;
    80.     if (out != null)
    81.        this.out.close();
    82.     if (fin != null)
    83.        this.fin.close();
    84.   }catch (IOException ex) {
    85.       ex.printStackTrace();
    86.   }
    87. }
    88. }
    复制代码
    类的具体使用::
    1.,把该类编译好, 新建立属性配置文件:log.properties,并确保把它放到你的这个编译好的类
    所在的位置。文件内容如下:当然你可以把路径修改为你想要的路径
    logfile=e:\logtext.log  2.. 使用举例:
    使用1:
    LogWriter.log("张三登陆了该系统");
    logWriter.log("张三删除了xxx条记录:记录id:");  使用2:
    try{
    }
    catch (Exception ex) {
    LogWriter.log(ex);
    }  几点说明:
    一.其中的 getClass().getResourceAsStream("文件名称")不支持static的调用,
    所以要把该类换为非static,但是它的调用仅仅在于outinit()中调用,而outinit()
    也仅仅在私有的构造函数中调用,而私有构造函数可以在静态的static 中被调用,
    这样就达到了可以利用静态方法来调用随时输入日志,并保证了仅仅有一个实例  二.如果你了解log4J的话,可以使用该类似方法,把log4j封装一下,实现静态方便的调用.  三.我同时使用多个线程测试过该类.没有发现问题.因为对java才研究了一年.如果高手们
    看出其中的错误或者不足之处,也请多多赐教.谢谢.具体问题可联:qq:29189725  

      
      
       
       

         
       

         
       
      




    源码下载:http://file.javaxxz.com/2014/10/1/172248094.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 14:41 , Processed in 0.398172 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表