自定义日志类LogTrace思路及简单例子
2011-07-28 14:52
183 查看
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();
}
}
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();
}
}
相关文章推荐
- 自定义ClassLoader的简单例子 - bitan????s java - CSDNBlog
- 简单的例子了解自定义ViewGroup
- Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码
- 自定义ClassLoader的简单例子 - bitan????s java - CSDNBlog
- [VBA]用一个简单例子说明如何在Excel中自定义函数
- Spring 自定义注解,配置简单日志注解
- jsp 自定义标签【继承TagSupport类】【在 tld描述 中声明 代码段变量】 简单例子四
- 简单例子分析struts的自定义拦截器
- 简单的php自定义错误日志
- java自定义注解简单小例子
- android 自定义View 流试布局简单例子
- PowerShell中简单的自定义函数和调用函数例子
- ListView简单实用-自定义BaseAdapter,然后绑定ListView的最简单例子
- logback+slf4j日志使用简单入门例子
- 自定义view简单例子
- 020自定义BaseAdapter,然后绑定ListView的最简单例子
- Spring 自定义注解,配置简单日志注解
- java 自定义异常,记录日志简单说明!留着以后真接复制
- c#简单自定义异常处理日志辅助类