当前位置:文档之家› c#和java超强日志类LogTool

c#和java超强日志类LogTool

c#和java超强日志类LogTool C# 日志类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Threading;namespace LogTool{/// <summary>/// 日志类/// 当调用Write方法时不会造成线程阻塞,而是立即完成方法调用,因此调用线程不用等待日志写入文件之后才返回。

/// </summary>public class Log : IDisposable{//日志对象的缓存队列private static Queue<Msg> msgs;//日志文件保存的路径private static string path;//日志写入线程的控制标记private static bool state;//日志记录的类型private static LogType type;//日志文件生命周期的时间标记private static DateTime TimeSign;//日志文件写入流对象private static StreamWriter writer;/// <summary>/// 创建日志对象的新实例,采用默认当前程序位置作为日志路径和默认的每日日志文件类型记录日志/// </summary>public Log(): this(".\\", LogType.current){}/// <summary>/// 创建日志对象的新实例,采用默认当前程序位置作为日志路径并指定日志类型/// </summary>/// <param name="t">日志文件创建方式的枚举</param>public Log(LogType t): this(".\\", t){}/// <summary>/// 创建日志对象的新实例,根据指定的日志文件路径和指定的日志文件创建类型/// </summary>/// <param name="p">日志文件保存路径</param>/// <param name="t">日志文件创建方式的枚举</param>public Log(string p, LogType t){if (msgs == null){state = true;path = p;type = t;msgs = new Queue<Msg>();Thread thread = new Thread(work);thread.Start();}}//日志文件写入线程执行的方法private void work(){while (true){//判断队列中是否存在待写入的日志if (msgs.Count > 0){Msg msg = null;lock (msgs){msg = msgs.Dequeue();}if (msg != null){FileWrite(msg);}}else{//判断是否已经发出终止日志并关闭的消息if (state){Thread.Sleep(1);}else{FileClose();}}}}//根据日志类型获取日志文件名,并同时创建文件到期的时间标记//通过判断文件的到期时间标记将决定是否创建新文件。

private string GetFilename(){DateTime now = DateTime.Now;string format = "";switch (type){case LogType.current:TimeSign = new DateTime(now.Year, now.Month, now.Day); TimeSign = TimeSign.AddDays(1);format = "yyyyMMddHHmmss'.log'";break;case LogType.Daily:TimeSign = new DateTime(now.Year, now.Month, now.Day); TimeSign = TimeSign.AddDays(1);format = "yyyyMMdd'.log'";break;case LogType.Weekly:TimeSign = new DateTime(now.Year, now.Month, now.Day); TimeSign = TimeSign.AddDays(7);format = "yyyyMMdd'.log'";break;case LogType.Monthly:TimeSign = new DateTime(now.Year, now.Month, 1); TimeSign = TimeSign.AddMonths(1);format = "yyyyMM'.log'";break;case LogType.Annually:TimeSign = new DateTime(now.Year, 1, 1); TimeSign = TimeSign.AddYears(1);format = "yyyy'.log'";break;}return now.ToString(format);}//写入日志文本到文件的方法private void FileWrite(Msg msg){try{if (writer == null){FileOpen();}else{//判断文件到期标志,如果当前文件到期则关闭当前文件创建新的日志文件if (DateTime.Now >= TimeSign){FileClose();FileOpen();}writer.Write(msg.Datetime);writer.Write('\t');writer.Write(msg.Type);writer.Write('\t');writer.WriteLine(msg.Text);writer.Flush();}}catch (Exception e){Console.Out.Write(e);}}//打开文件准备写入private void FileOpen(){writer = new StreamWriter(path + GetFilename(), true, Encoding.UTF8); }//关闭打开的日志文件private void FileClose(){if (writer != null){writer.Flush();writer.Close();writer.Dispose();writer = null;}}/// <summary>/// 写入新日志,根据指定的日志对象Msg/// </summary>/// <param name="msg">日志内容对象</param>public void Write(Msg msg){if (msg != null){lock (msgs){msgs.Enqueue(msg);}}}/// <summary>/// 写入新日志,根据指定的日志内容和信息类型,采用当前时间为日志时间写入新日志/// </summary>/// <param name="text">日志内容</param>/// <param name="type">信息类型</param>public void Write(string text, MsgType type){Write(new Msg(text, type));}/// <summary>/// 写入新日志,根据指定的日志时间、日志内容和信息类型写入新日志/// </summary>/// <param name="dt">日志时间</param>/// <param name="text">日志内容</param>/// <param name="type">信息类型</param>public void Write(DateTime dt, string text, MsgType type){Write(new Msg(dt, text, type));}/// <summary>/// 写入新日志,根据指定的异常类和信息类型写入新日志/// </summary>/// <param name="e">异常对象</param>/// <param name="type">信息类型</param>public void Write(Exception e, MsgType type){Write(new Msg(e.Message, type));}#region IDisposable 成员/// <summary>/// 销毁日志对象/// </summary>public void Dispose(){state = false;}#endregion}}Java 日志类package org;import java.io.File;import java.io.FileWriter; import java.io.IOException; importjava.io.PrintWriter; import java.util.Calendar; import java.util.Date;//使用LogTool.getInstance().log("日志内容");添加日志public class LogTool {private static final LogTool logtool=new LogTool(); private static PrintWriter logPrint;private static String logFile = "";public static LogTool getInstance(){return logtool;}/*** 得到log文件名*/private String getLogFile(){String date = "";Calendar cd = Calendar.getInstance();int y = cd.get(Calendar.YEAR);int m = cd.get(Calendar.MONTH) + 1;int d = cd.get(Calendar.DAY_OF_MONTH);date = "./log/" +y + "-";if(m < 10)date += 0;date += m + "-";if(d < 10)date += 0;date += d + ".log";return date;}/*** 配置log属性,如果没有新建log文件*/private void newLog(){logFile = getLogFile();try{logPrint = new PrintWriter(new FileWriter(logFile, true), true); }catch(IOException e){(new File("./log")).mkdir();try{logPrint = new PrintWriter(new FileWriter(logFile, true), true); }catch(IOException ex){System.err.println("无法打开日志文件:" + logFile);logPrint = new PrintWriter(System.err);}}}/*** 检查日期如果改变新建log文件*/private void checkDate(){if(logFile == null || logFile.trim().equals("") || !logFile.equals(getLogFile())){newLog();}}/*** 将文本信息写入日志文件,缺省为userdir/log*/public void log(String msg) {checkDate();logPrint.println(new Date() + ": " + msg);}/*** 将文本信息与异常写入日志文件*/public void log(Throwable e, String msg) {checkDate();logPrint.println(new Date() + ": " + msg);e.printStackTrace(logPrint);}}。

相关主题