📄 trace.cs
字号:
using System;
using System.IO;
using System.Threading;
namespace projmanager
{
//该源码下载自www.51aspx.com(51aspx.com)
/// <summary>
/// Trace 的摘要说明。
/// </summary>
public class Trace
{
private static TextWriter m_C=null;
private static string file_path=null;
private static string m_dir=null;
private static string m_file=null;
public static string FilePath
{
get
{
return file_path;
}
set
{
file_path=value;
m_dir=Path.GetDirectoryName(file_path);
m_file=Path.GetFileName(file_path);
//如果未给定路径,取当前路径
if(m_dir==""|| m_dir == null)
{
m_dir=".";
}
//如果给定路径不是logs结尾,加logs
if(!m_dir.EndsWith("logs"))
{
m_dir+="\\logs";
}
//如果未给定文件名,默认为Trace.log
if(m_file == "")
{
m_file = "Trace.log" ;
}
//文件扩展名,默认为.log
if(!m_file.EndsWith(".log"))
{
m_file += ".log" ;
}
try
{
Directory.CreateDirectory(m_dir);
}
catch{}
}
}
/// <summary>
/// 若需要往控制台输出,调用方需给出TextWriter
/// </summary>
public static TextWriter OutputConsole
{
get
{
TextWriter tw=null;
lock(typeof(Trace))
{
tw=m_C;
}
return tw;
}
set
{
lock(typeof(Trace))
{
m_C=value;
}
}
}
/// <summary>
/// 格式化待写的信息
/// </summary>
/// <param name="location">程序位置</param>
/// <param name="type">日志类型(信息、错误等)</param>
/// <param name="msg">日志内容</param>
/// <returns>返回StringWriter</returns>
private static StringWriter BuildMessage(string location, string type,string msg)
{
StringWriter sw=new StringWriter();
//给日志信息加时间,不带日期,带毫秒
sw.Write("<{0}>",DateTime.Now.ToString("HH:mm:ss:fff")) ;
//将格式化的信息写入StringWriter
sw.Write("[" + location + "]" + "<" + type + ">" + ": " + msg + "\n");
return sw;
}
/// <summary>
/// 给调用方已格式化的信息加时间
/// </summary>
/// <param name="format">调用方给出的格式</param>
/// <param name="p">日志内容</param>
/// <returns>返回StringWriter</returns>
private static StringWriter BuildMessage(string format, params object[] p)
{
StringWriter sw=new StringWriter();
//给日志信息加时间,不带日期,带毫秒
sw.Write("<{0}>",DateTime.Now.ToString("HH:mm:ss:fff")) ;
//将信息写入StringWriter
sw.Write(format,p);
return sw;
}
/// <summary>
/// 在给出的Log文件名中,插入日期
/// </summary>
/// <returns></returns>
private static string LogName()
{
StringWriter sw=new StringWriter();
//将log文件名称和扩展名分开
char []sp = {'.'} ;
string []name = m_file.Split(sp) ;
//在文件名称后面加日期后,再加上扩展名
sw.Write("{0}_{1}.{2}",
name[0],
DateTime.Now.ToString("yyyyMMdd"),
name[1]);
return sw.ToString();
}
/// <summary>
/// 为待归档文件产生节点数
/// </summary>
/// <param name="file_name">文件名</param>
/// <returns>节点数</returns>
private static int GetArchiveFileNode(string file_name)
{
int node=0;
StringWriter pattern=new StringWriter();
//在文件名称和扩展名之间加入_*作为搜索模式
char []sp = {'.'} ;
string []name = m_file.Split(sp) ;
pattern.Write("{0}_*.{1}",name[0],name[1]);
//在日志目录中查找所有符合上述模式的文件
string[] files=Directory.GetFiles(
m_dir,
pattern.ToString());
//为这些文件确定归档的节点
foreach(string f in files)
{
int pos=f.LastIndexOf(".");
string n=f.Substring(pos+1);
try
{
int nn=int.Parse(n);
if(nn>=node) node=nn+1;
}
catch{}
}
return node;
}
/// <summary>
/// 归档:文件超过10M后
/// </summary>
/// <param name="fname">产生的归档文件名</param>
private static void ArchiveThisFile(string fname)
{
//为待归档文件产生节点数
int node=GetArchiveFileNode(fname);
//分离文件名
char []sp = {'.'} ;
string []name = fname.Split(sp) ;
while(true)
{
//将节点数插入到文件名中间,作为待归档的文件名
string a_path=m_dir+"\\"+name[0]+"_"+node.ToString() + "." + name[1];
string s_path=m_dir+"\\"+fname;
try
{
//归档
File.Move(s_path,a_path);
break;
}
catch{node+=1;}
}
}
/// <summary>
/// 写日志
/// </summary>
/// <param name="location">日志位置</param>
/// <param name="type">日志类型</param>
/// <param name="msg">信息</param>
public static void Write(string location, string type,string msg)
{
//若文件名为空
if(file_path==null||
file_path=="") return ;
StringWriter sw=null;
lock(typeof(Trace))
{
string lfile=LogName();
long lsize=0;
string path=m_dir+"\\"+lfile;
//定义FileStream,可写入,在文件尾追加记录
FileStream fs=new FileStream
(
path,
FileMode.Append,
FileAccess.Write,
FileShare.ReadWrite
);
//实例一个StreamWriter
StreamWriter fsw=new StreamWriter(fs);
if(sw==null)
{
//格式化待写的信息
sw=BuildMessage(location,type,msg);
}
//将字符串写到StreamWriter
fsw.Write(sw.ToString());
//获取文件大小
lsize=fs.Length;
//关闭StreamWriter和FileStream
fsw.Close();
fs.Close();
if(lsize>1024*1024*10)
{
//文件超过10M后,归档
ArchiveThisFile(lfile);
}
//如果需要输出到控制台
if(m_C!=null)
{
if(sw==null)
{
//格式化待写的信息
sw=BuildMessage(location,type,msg);
}
//往控制台写信息
m_C.Write(sw.ToString());
}
}
}
/// <summary>
/// 写日志
/// </summary>
/// <param name="format">日志格式</param>
/// <param name="p">日志内容</param>
public static void Write(string format, params object[] p)
{
//若文件名为空
if(file_path==null||
file_path=="") return ;
StringWriter sw=null;
lock(typeof(Trace))
{
string lfile=LogName();
long lsize=0;
string path=m_dir+"\\"+lfile;
//定义FileStream,可写入,在文件尾追加记录
FileStream fs=new FileStream
(
path,
FileMode.Append,
FileAccess.Write,
FileShare.ReadWrite
);
//实例一个StreamWriter
StreamWriter fsw=new StreamWriter(fs);
if(sw==null)
{
//格式化待写的信息
sw=BuildMessage(format,p);
}
//将字符串写到StreamWriter
fsw.Write(sw.ToString());
//获取文件大小
lsize=fs.Length;
//关闭StreamWriter和FileStream
fsw.Close();
fs.Close();
if(lsize>1024*1024*10)
{
//文件超过10M后,归档
ArchiveThisFile(lfile);
}
//如果需要输出到控制台
if(m_C!=null)
{
if(sw==null)
{
//格式化待写的信息
sw=BuildMessage(format,p);
}
//往控制台写信息
m_C.Write(sw.ToString());
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -