?? trace.cs
字號(hào):
using System;
using System.IO;
using System.Threading;
namespace DocAdmin.COMMON
{
/// <summary>
/// Trace 的摘要說(shuō)明。
/// </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);
//如果未給定路徑,取當(dāng)前路徑
if(m_dir==""|| m_dir == null)
{
m_dir=".";
}
//如果給定路徑不是logs結(jié)尾,加logs
if(!m_dir.EndsWith("logs"))
{
m_dir+="\\logs";
}
//如果未給定文件名,默認(rèn)為T(mén)race.log
if(m_file == "")
{
m_file = "Trace.log" ;
}
//文件擴(kuò)展名,默認(rèn)為.log
if(!m_file.EndsWith(".log"))
{
m_file += ".log" ;
}
try
{
Directory.CreateDirectory(m_dir);
}
catch{}
}
}
/// <summary>
/// 若需要往控制臺(tái)輸出,調(diào)用方需給出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>
/// 格式化待寫(xiě)的信息
/// </summary>
/// <param name="location">程序位置</param>
/// <param name="type">日志類(lèi)型(信息、錯(cuò)誤等)</param>
/// <param name="msg">日志內(nèi)容</param>
/// <returns>返回StringWriter</returns>
private static StringWriter BuildMessage(string location, string type,string msg)
{
StringWriter sw=new StringWriter();
//給日志信息加時(shí)間,不帶日期,帶毫秒
sw.Write("<{0}>",DateTime.Now.ToString("HH:mm:ss:fff")) ;
//將格式化的信息寫(xiě)入StringWriter
sw.Write("[" + location + "]" + "<" + type + ">" + ": " + msg + "\n");
return sw;
}
/// <summary>
/// 給調(diào)用方已格式化的信息加時(shí)間
/// </summary>
/// <param name="format">調(diào)用方給出的格式</param>
/// <param name="p">日志內(nèi)容</param>
/// <returns>返回StringWriter</returns>
private static StringWriter BuildMessage(string format, params object[] p)
{
StringWriter sw=new StringWriter();
//給日志信息加時(shí)間,不帶日期,帶毫秒
sw.Write("<{0}>",DateTime.Now.ToString("HH:mm:ss:fff")) ;
//將信息寫(xiě)入StringWriter
sw.Write(format,p);
return sw;
}
/// <summary>
/// 在給出的Log文件名中,插入日期
/// </summary>
/// <returns></returns>
private static string LogName()
{
StringWriter sw=new StringWriter();
//將log文件名稱(chēng)和擴(kuò)展名分開(kāi)
char []sp = {'.'} ;
string []name = m_file.Split(sp) ;
//在文件名稱(chēng)后面加日期后,再加上擴(kuò)展名
sw.Write("{0}_{1}.{2}",
name[0],
DateTime.Now.ToString("yyyyMMdd"),
name[1]);
return sw.ToString();
}
/// <summary>
/// 為待歸檔文件產(chǎn)生節(jié)點(diǎn)數(shù)
/// </summary>
/// <param name="file_name">文件名</param>
/// <returns>節(jié)點(diǎn)數(shù)</returns>
private static int GetArchiveFileNode(string file_name)
{
int node=0;
StringWriter pattern=new StringWriter();
//在文件名稱(chēng)和擴(kuò)展名之間加入_*作為搜索模式
char []sp = {'.'} ;
string []name = m_file.Split(sp) ;
pattern.Write("{0}_*.{1}",name[0],name[1]);
//在日志目錄中查找所有符合上述模式的文件
string[] files=Directory.GetFiles(
m_dir,
pattern.ToString());
//為這些文件確定歸檔的節(jié)點(diǎn)
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>
/// 歸檔:文件超過(guò)10M后
/// </summary>
/// <param name="fname">產(chǎn)生的歸檔文件名</param>
private static void ArchiveThisFile(string fname)
{
//為待歸檔文件產(chǎn)生節(jié)點(diǎn)數(shù)
int node=GetArchiveFileNode(fname);
//分離文件名
char []sp = {'.'} ;
string []name = fname.Split(sp) ;
while(true)
{
//將節(jié)點(diǎn)數(shù)插入到文件名中間,作為待歸檔的文件名
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>
/// 寫(xiě)日志
/// </summary>
/// <param name="location">日志位置</param>
/// <param name="type">日志類(lèi)型</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,可寫(xiě)入,在文件尾追加記錄
FileStream fs=new FileStream
(
path,
FileMode.Append,
FileAccess.Write,
FileShare.ReadWrite
);
//實(shí)例一個(gè)StreamWriter
StreamWriter fsw=new StreamWriter(fs);
if(sw==null)
{
//格式化待寫(xiě)的信息
sw=BuildMessage(location,type,msg);
}
//將字符串寫(xiě)到StreamWriter
fsw.Write(sw.ToString());
//獲取文件大小
lsize=fs.Length;
//關(guān)閉StreamWriter和FileStream
fsw.Close();
fs.Close();
if(lsize>1024*1024*10)
{
//文件超過(guò)10M后,歸檔
ArchiveThisFile(lfile);
}
//如果需要輸出到控制臺(tái)
if(m_C!=null)
{
if(sw==null)
{
//格式化待寫(xiě)的信息
sw=BuildMessage(location,type,msg);
}
//往控制臺(tái)寫(xiě)信息
m_C.Write(sw.ToString());
}
}
}
/// <summary>
/// 寫(xiě)日志
/// </summary>
/// <param name="format">日志格式</param>
/// <param name="p">日志內(nèi)容</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,可寫(xiě)入,在文件尾追加記錄
FileStream fs=new FileStream
(
path,
FileMode.Append,
FileAccess.Write,
FileShare.ReadWrite
);
//實(shí)例一個(gè)StreamWriter
StreamWriter fsw=new StreamWriter(fs);
if(sw==null)
{
//格式化待寫(xiě)的信息
sw=BuildMessage(format,p);
}
//將字符串寫(xiě)到StreamWriter
fsw.Write(sw.ToString());
//獲取文件大小
lsize=fs.Length;
//關(guān)閉StreamWriter和FileStream
fsw.Close();
fs.Close();
if(lsize>1024*1024*10)
{
//文件超過(guò)10M后,歸檔
ArchiveThisFile(lfile);
}
//如果需要輸出到控制臺(tái)
if(m_C!=null)
{
if(sw==null)
{
//格式化待寫(xiě)的信息
sw=BuildMessage(format,p);
}
//往控制臺(tái)寫(xiě)信息
m_C.Write(sw.ToString());
}
}
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -