import java.io.File; |
import java.io.FileWriter; |
import java.io.IOException; |
import java.io.InputStream; |
import java.io.PrintWriter; |
import java.util.Properties; |
/** |
* 日志工具类 使用了单例模式,保证只有一个实例。 为了更方便的配置日志文件名,使用属性文件配置。 也可以在程序中指定日志文件名。 |
*/ |
public class LogWriter { |
// 日志的配置文件 |
public static final String LOG_CONFIGFILE_NAME = "log.properties" ; |
// 日志文件名在配置文件中的标签 |
public static final String LOGFILE_TAG_NAME = "logfile" ; |
// 默认的日志文件的路径和文件名称 |
private final String DEFAULT_LOG_FILE_NAME = "./logtext.log" ; |
// 该类的唯一的实例 |
private static LogWriter logWriter; |
// 文件输出流 |
private PrintWriter writer; |
// 日志文件名 |
private String logFileName; |
/** |
* 默认构造函数 |
*/ |
private LogWriter() throws LogException { |
this .init(); |
} |
private LogWriter(String fileName) throws LogException { |
this .logFileName = fileName; |
this .init(); |
} |
/** |
* 获取LogWriter的唯一实例。 |
* |
* @return |
* @throws LogException |
*/ |
public synchronized static LogWriter getLogWriter() throws LogException { |
if (logWriter == null ) { |
logWriter = new LogWriter(); |
} |
return logWriter; |
} |
public synchronized static LogWriter getLogWriter(String logFileName) |
throws LogException { |
if (logWriter == null ) { |
logWriter = new LogWriter(logFileName); |
} |
return logWriter; |
} |
/** |
* 往日志文件中写一条日志信息 为了防止多线程同时操作(写)日志文件,造成文件”死锁”。使用synchronized关键字 |
* |
* @param logMsg |
* 日志消息 |
*/ |
public synchronized void log(String logMsg) { |
this .writer.println( new java.util.Date() + ": " + logMsg); |
} |
/** |
* 往日志文件中写一条异常信息 使用synchronized关键字。 |
* |
* @param ex |
* 待写入的异常 |
*/ |
public synchronized void log(Exception ex) { |
writer.println( new java.util.Date() + ": " ); |
ex.printStackTrace(writer); |
} |
/** |
* 初始化LogWriter |
* |
* @throws LogException |
*/ |
private void init() throws LogException { |
// 如果用户没有在参数中指定日志文件名,则从配置文件中获取。 |
if ( this .logFileName == null ) { |
this .logFileName = this .getLogFileNameFromConfigFile(); |
// 如果配置文件不存在或者也没有指定日志文件名,则用默认的日志文件名。 |
if ( this .logFileName == null ) { |
this .logFileName = DEFAULT_LOG_FILE_NAME; |
} |
} |
File logFile = new File( this .logFileName); |
try { |
// 其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容 |
// PrintWriter()中的第二个参数的含义是:自动将数据flush到文件中 |
writer = new PrintWriter( new FileWriter(logFile, true ), true ); |
System.out.println( "日志文件的位置:" + logFile.getAbsolutePath()); |
} catch (IOException ex) { |
String errmsg = "无法打开日志文件:" + logFile.getAbsolutePath(); |
// System.out.println(errmsg); |
throw new LogException(errmsg, ex); |
} |
} |
/** |
* 从配置文件中取日志文件名 |
* |
* @return |
*/ |
private String getLogFileNameFromConfigFile() { |
try { |
Properties pro = new Properties(); |
// 在类的当前位置,查找属性配置文件log.properties |
InputStream fin = getClass().getResourceAsStream( |
LOG_CONFIGFILE_NAME); |
if (fin != null ) { |
pro.load(fin); // 载入配置文件 |
fin.close(); |
return pro.getProperty(LOGFILE_TAG_NAME); |
} else { |
System.err.println( "无法打开属性配置文件: log.properties" ); |
} |
} catch (IOException ex) { |
System.err.println( "无法打开属性配置文件: log.properties" ); |
} |
return null ; |
} |
// 关闭LogWriter |
public void close() { |
logWriter = null ; |
if (writer != null ) { |
writer.close(); |
} |
} |
public static void main(String[] args) { |
LogWriter logger = null ; |
try { |
String fileName = "C:/temp/temp0/logger.log" ; |
logger = LogWriter.getLogWriter(fileName); |
logger.log( "First log!" ); |
logger.log( "第二个日志信息" ); |
logger.log( "Third log" ); |
logger.log( "第四个日志信息" ); |
logger.close(); |
} catch (LogException e) { |
e.printStackTrace(); |
} |
} |
} |
中级程序员
by: 中国人在美国 发表于:2013-08-02 02:47:15 顶(0) | 踩(0) 回复
谢谢分享
回复评论