天天看點

C#日志記錄

    /// <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();

    }