自定义日志类LogTrace思路及简单例子

来源:互联网 发布:etsy软件 编辑:程序博客网 时间:2024/06/05 18:31

 1.新建类LogTrace(注意此类的字段和方法都是静态的):
2.定义字段:级别Level(五种:DEBUG、INFO、WARN、ERROR和FATAL),输出流对象PrintWriter pw(此默认为new PrintWriter(System.out, true))此对象是写日志的(其write方法).
3.初始化参数方法(参数来源有两种1.通过main方法的参数传进来,2.通过读取属性文件得到):主要得到日志级别,日志文件件名,日志是输出到文件还是控制台等.调用设置输出流方法setOutputStream(OutputStream os)此参数是文件输出流对象邦定输出文件名可者,此方法中的关键代码.pw = new PrintWriter(os, true);PrintStream ps = new PrintStream(os, true)可以重写其println方法(可在调用父类println方法前加入时间/线程等日志);重新分配“标准”错误输出流System.setErr(ps)---这名很关键,能自动捕获运行时的异常(比如空指针),因为出异常JVM会打印日志.
4.添加日志方法LogTrace.trace(参数),需重载此方法.参数可以是String,Exception等.
5.在需要加日志地方,调用LogTrace.trace()方法就行了,未处理异常和运行时异常会自动捕获(因为System.setErr(ps)).

 

简单例子代码如下:

package com.caoyong.log;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 简单例子
 */
public class LogTrace
{
 private static PrintWriter pw;
 private static PrintStream ps;

 public static void init() throws FileNotFoundException
 {
  String fileName = "d:\\LogTrace.txt";
  FileOutputStream fos = new FileOutputStream(fileName);
  setOutputStream(fos);
 }

 private static void setOutputStream(OutputStream os)
 {
  // PW,PS中的输出流不同,则会记当到不同的文件中.
  pw = new PrintWriter(os, true);
  ps = new PrintStream(os, true)
  {
   @Override
   public void println(String x)
   {
    print("\r\n" + getCurrentDate());
    super.println(" println String:" + x);
   }

   @Override
   public void print(Object obj)
   {
    print("\r\n" + getCurrentDate());
    super.print(" print Object:" + obj);
   }

   @Override
   public void println(Object x)
   {
    print("\r\n" + getCurrentDate());
    super.println(" println Object:" + x);
   }

  };

  System.setOut(ps);
  System.setErr(ps);
 }

 private static String getCurrentDate()
 {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  return sdf.format(new Date());
 }

 public static void trace(String s)
 {
  // PW,PS都记录会重复记录日志.
  pw.write("\r\n" + getCurrentDate() + " pw trace String:" + s);
  pw.flush();
  ps.println(" trace String:" + s);
 }

 public static void trace(Exception e)
 {
  ps.println("trace Exception begin:");
  e.printStackTrace(System.err);
  ps.println("trace Exception end:");
 }

 public static void close()
 {
  pw.flush();
  pw.close();
  ps.flush();
  ps.close();
 }
}

 

package test;

import java.io.FileNotFoundException;

import com.caoyong.log.LogTrace;

public class LogTraceTest
{
 public static void main(String[] args) throws FileNotFoundException
 {
  //注意整个程序运行之前需要初始化日志对象.
  LogTrace.init();
  String s = "abc";
  LogTrace.trace(s);
  s = "abc111";
  LogTrace.trace(s);
  try
  {
   Integer.parseInt(s);
  } catch (NumberFormatException e1)
  {
   LogTrace.trace("NumberFormatException error s:" + s);
  }

  try
  {
   int a[] = new int[3];
   System.out.println(a[5]);
  } catch (Exception e)
  {
   // e.printStackTrace();//这里默认的是是e.printStackTrace(System.out);就是打印到控制台
   LogTrace.trace(e);
  }

  // 测试不捕获异常,自动写日志
  Integer.parseInt(s);

  // 如果上面的Integer.parseInt(s);出现异常则当前主线程会中断,即后续语句不会执行直接退出.
  LogTrace.close();
 }

}

 

 

 

原创粉丝点击