c#和java超强日志类LogToolc#和java超强日志类LogTool
C# 日志类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace LogTool
{
///
/// 日志类
/// 当调用Write方法时不会造成线程阻塞,而是立即完成方法调用,因此调用线程不用等待日志写入文件
之后才返回。
///
p...
c#和java超强日志类LogTool
C# 日志类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace LogTool
{
///
/// 日志类
/// 当调用Write方法时不会造成线程阻塞,而是立即完成方法调用,因此调用线程不用等待日志写入文件
之后才返回。
///
public class Log : IDisposable
{
//日志对象的缓存队列
private static Queue
msgs;
//日志文件保存的路径
private static string path;
//日志写入线程的控制标记
private static bool state;
//日志的类型
private static LogType type;
//日志文件生命周期的时间标记
private static DateTime TimeSign;
//日志文件写入流对象
private static StreamWriter writer;
///
/// 创建日志对象的新实例,采用默认当前程序位置作为日志路径和默认的每日日志文件类型记录
日志
///
public Log()
: this(".\\", LogType.current)
{
}
///
/// 创建日志对象的新实例,采用默认当前程序位置作为日志路径并指定日志类型
///
/// 日志文件创建方式的枚举
public Log(LogType t)
: this(".\\", t)
{
}
///
/// 创建日志对象的新实例,根据指定的日志文件路径和指定的日志文件创建类型
///
/// 日志文件保存路径
/// 日志文件创建方式的枚举
public Log(string p, LogType t)
{
if (msgs == null)
{
state = true;
path = p;
type = t;
msgs = new Queue();
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;
}
}
///
/// 写入新日志,根据指定的日志对象Msg
///
/// 日志内容对象
public void Write(Msg msg)
{
if (msg != null)
{
lock (msgs)
{
msgs.Enqueue(msg);
}
}
}
///
/// 写入新日志,根据指定的日志内容和信息类型,采用当前时间为日志时间写入新日志
///
/// 日志内容
/// 信息类型
public void Write(string text, MsgType type)
{
Write(new Msg(text, type));
}
///
/// 写入新日志,根据指定的日志时间、日志内容和信息类型写入新日志
///
/// 日志时间
/// 日志内容
/// 信息类型
public void Write(DateTime dt, string text, MsgType type)
{
Write(new Msg(dt, text, type));
}
///
/// 写入新日志,根据指定的异常类和信息类型写入新日志
///
/// 异常对象
/// 信息类型
public void Write(Exception e, MsgType type)
{
Write(new Msg(e.Message, type));
}
#region IDisposable 成员
///
/// 销毁日志对象
///
public void Dispose()
{
state = false;
}
#endregion
}
}
Java 日志类
package org;
import java.io.File;
import java.io.FileWriter; import java.io.IOException; import java.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);
}
}
本文档为【c#和java超强日志类LogTool】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。