/// <summary>
/// 接口類 TCP的通信日志處理
/// </summary>
public class ShowInfo
{
public delegate void WriteTView(string str);
private WriteTView _myViewWrite;
public delegate void WriteTLog(object str);
private WriteTLog _myLogWrite;
/// <summary>
/// 構造
/// </summary>
public ShowInfo()
{
_myViewWrite = WriteDemo;
_myLogWrite = LogManager.LogRunInfo;
}
/// <summary>
/// 構造
/// </summary>
/// <param name="write"></param>
public ShowInfo(WriteTView write)
{
_myViewWrite = write;
_myLogWrite = LogManager.LogRunInfo;
}
/// <summary>
/// 顯示的demo
/// </summary>
/// <param name="str"></param>
private void WriteDemo(string str)
{
Trace.WriteLine(str);
}
/// <summary>
/// 設定顯示的回調函數
/// </summary>
/// <param name="write"></param>
public void SetViewWrite(WriteTView write)
{
_myViewWrite = write;
}
/// <summary>
/// 設定記錄的回調函數
/// </summary>
/// <param name="write"></param>
public void SetLogWrite(WriteTLog write)
{
_myLogWrite = write;
}
/// <summary>
/// 顯示
/// </summary>
/// <param name="obj"></param>
public void WriteView(object obj)
{
if (obj is Exception)
{
_myLogWrite(obj);
}
else if (obj is string)
{
_myViewWrite(obj as string);
}
}
/// <summary>
/// 記錄到日志檔案中
/// </summary>
/// <param name="str"></param>
public void WriteToLog(object obj)
{
if (_myLogWrite != null)
{
_myLogWrite(obj);
}
}
/// <summary>
/// 記錄到日志檔案中
/// </summary>
/// <param name="condition"></param>
/// <param name="str"></param>
public void WriteToLog(bool condition, object obj)
{
if (condition)
{
if (_myLogWrite != null)
{
_myLogWrite(obj);
}
}
}
#region 輸出
/// <summary>
/// 顯示
/// </summary>
/// <param name="format"></param>
/// <param name="arg"></param>
public void WriteToView(string format, params Object[] arg)
{
string str = String.Format(format, arg);
WriteView(str);
}
/// <summary>
/// 滿足條件方可顯示或記錄
/// </summary>
/// <param name="condition">輸出條件</param>
/// <param name="str">要輸出的輸出字元串</param>
/// <param name="isWriteLog">是否記錄到日志檔案</param>
/// <param name="isWriteView">是否顯示</param>
public void WriteToView(bool condition, string str, bool isWriteLog, bool isWriteView)
{
if (condition)
{
if (isWriteView)
{
WriteView(str);
}
if (isWriteLog)
{
WriteToLog(str);
}
}
}
/// <summary>
/// 滿足條件方可記錄,不顯示
/// </summary>
/// <param name="condition">輸出條件</param>
/// <param name="str">要輸出的輸出字元串</param>
public void WriteToView(bool condition, string str)
{
WriteToView(condition, str, true, false);
}
/// <summary>
/// 滿足條件方可記錄,并标記是否顯示
/// </summary>
/// <param name="condition">輸出條件</param>
/// <param name="str">要輸出的輸出字元串</param>
/// <param name="isWriteView">是否顯示</param>
public void WriteToView(bool condition, string str, bool isWriteView)
{
WriteToView(condition, str, true, isWriteView);
}
/// <summary>
/// 顯示或記錄
/// </summary>
/// <param name="str"></param>
/// <param name="isWriteLog"></param>
public void WriteToView(string str, bool isWriteLog, bool isWriteView)
{
WriteToView(true, str, isWriteLog, isWriteView);
}
/// <summary>
///顯示,并标記是否記錄
/// </summary>
/// <param name="str"></param>
/// <param name="isWriteLog"></param>
public void WriteToView(string str, bool isWriteLog)
{
WriteToView(true, str, isWriteLog, true);
}
/// <summary>
/// 顯示并記錄
/// </summary>
/// <param name="info"></param>
public void WriteToView(string info)
{
WriteToView(true, info, true, true);
}
/// <summary>
/// 記錄,并标記是否顯示
/// </summary>
/// <param name="str"></param>
/// <param name="isWriteLog"></param>
public void WriteToLog(string str, bool isWriteView)
{
WriteToView(true, str, true, isWriteView);
}
#endregion
}
/// <summary>
/// 日志記錄
/// </summary>
public static class LogManager
{
/// <summary>
/// 檔案夾名稱
/// </summary>
public static string FolderName = "Log";
/// <summary>
/// 目前程序的ID
/// </summary>
public static string ID = Process.GetCurrentProcess().Id.ToString();
/// <summary>
/// 當天日志的個數
/// </summary>
private static int LogIndex = 1;
/// <summary>
/// 當天異常日志的個數
/// </summary>
private static int ExIndex = 1;
/// <summary>
/// 記錄日志的線程鎖
/// </summary>
private static object LOCKER_LOG = new object();
/// <summary>
/// 記錄異常的線程鎖
/// </summary>
private static object LOCKER_EX = new object();
/// <summary>
/// 記錄運作日志
/// </summary>
/// <param name="msg">日志内容</param>
//[MethodImpl(MethodImplOptions.Synchronized)]
public static void LogRunInfo(string msg)
{
lock (LOCKER_LOG)
{
string path;
string file;
try
{
path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase
, "LOG\\" + FolderName, DateTime.Now.Year.ToString(), DateTime.Now.Month.ToString());
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var name = string.Format("{0}_{1}_{2}", FolderName, ID, DateTime.Now.ToString("yyyyMMdd"));
file = string.Format("{0}.log", name);
var pathName = Path.Combine(path, file);
FileInfo fi = new FileInfo(pathName);
if (fi.Exists)
{
while (fi.Exists
&& fi.Length > 50 * 1024 * 1024)//50MB
{
file = string.Format("{0}_{1}.log", name, LogIndex);
pathName = Path.Combine(path, file);
fi = new FileInfo(pathName);
if (!fi.Exists)
{
break;
}
else if (fi.Length > 50 * 1024 * 1024)
{
//目前日志大于50MB
LogIndex++;
}
}
}
else
{
LogIndex = 1;
}
using (StreamWriter sw = new StreamWriter(pathName, true))
{
sw.WriteLine(string.Format("{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), msg));
sw.Dispose();
sw.Close();
}
}
catch
{
}
}
}
/// <summary>
/// 記錄異常日志
/// </summary>
/// <param name="ex">擷取的異常</param>
//[MethodImpl(MethodImplOptions.Synchronized)]
public static void LogRunInfo(Exception ex)
{
lock (LOCKER_EX)
{
string path;
string file;
try
{
//如果日志檔案為空,則預設在Debug目錄下建立 YYYY-mm-dd_Log.log檔案
path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "LOG\\" + FolderName);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var name = string.Format("{0}_Err_{1}", FolderName, DateTime.Now.ToString("yyyyMMdd"));
file = string.Format("{0}.log", name);
var pathName = Path.Combine(path, file);
FileInfo fi = new FileInfo(pathName);
if (fi.Exists)
{
while (fi.Exists
&& fi.Length > 50 * 1024 * 1024)//50MB
{
file = string.Format("{0}_{1}.log", name, ExIndex);
pathName = Path.Combine(path, file);
fi = new FileInfo(pathName);
if (!fi.Exists)
{
break;
}
else if (fi.Length > 50 * 1024 * 1024)
{
ExIndex++;
}
}
}
else
{
ExIndex = 1;
}
//把異常資訊輸出到檔案
using (StreamWriter fs = new StreamWriter(pathName, true))
{
fs.WriteLine("-------------------------------------------------------------");
fs.WriteLine("目前時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
fs.WriteLine("異常資訊:" + ex.Message);
fs.WriteLine("異常對象:" + ex.Source);
fs.WriteLine("調用堆棧:\n" + ex.StackTrace.Trim());
fs.WriteLine("觸發方法:" + ex.TargetSite);
fs.WriteLine("-------------------------------------------------------------");
fs.WriteLine();
fs.Dispose();
fs.Close();
}
}
catch
{
}
}
}
/// <summary>
/// 記錄日志
/// </summary>
/// <param name="obj"></param>
public static void LogRunInfo(object obj)
{
if (obj is Exception)
{
LogManager.LogRunInfo(obj as Exception);
}
if (obj is string)
{
LogManager.LogRunInfo(obj as string);
}
}
}
/// <summary>
/// 接口指針
/// </summary>
public class IWriteRec
{
public static ShowInfo g_ShowInfo = new ShowInfo();
}