最簡單的C#日志記錄類


日常寫代碼經常要記錄各種運行日志,網上開源的免費,功能強大的很多,但是有時候感覺為了寫一個幾百甚至幾十行代碼的小程序去下載一個“龐大的日志記錄組建(xxlog.dll)”

不太值得,因此簡單自己寫一個類,使用簡單,體積小!基本滿足記錄功能!

using Gaofajin.Attribute;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace Gaofajin.LogWriter
{
    /// <summary>
    /// 日志記錄到文件
    /// </summary>
   
    public class TxtLog
    {
       public string Dir { get; set; }
       public string path { get; set; }
       static TxtLog log = null;
       static readonly object @lock = new object();
       static System.Threading.ReaderWriterLockSlim Slim = new System.Threading.ReaderWriterLockSlim( System.Threading.LockRecursionPolicy.SupportsRecursion);
        public static  TxtLog Instance
        {
            get
            {
               if (log == null)
                {
                    if (log == null)
                    {
                        lock (@lock)
                        {
                            log = new TxtLog();
                        }
                    }
                }
                return log;
            }
        }
        private TxtLog()
        {

        }
        /// <summary>
        /// 寫入日志到指定文件名
        /// </summary>
        /// <param name="Msg">要寫到日志文件的信息</param>
        public string  WriteLineToFile(string Msg,LogType type)
        {
            if(string.IsNullOrEmpty(Dir)||Dir ==System.Windows.Forms.Application.StartupPath + @"\Logs\" + DateTime.Now.ToString("yyyy年MM月dd日"))
            {
                return WriteLineToTimeFile(Msg,type);
            }
            StreamWriter sw = null;
            try
            {
                Slim.EnterWriteLock();
                checkLog(Dir);
                checkfile(Dir, path);
                LogInfo li = GetLog(type);
                string fileName = Dir + "\\" + path;
                sw = File.AppendText(fileName);
                sw.WriteLine("日志時間:" + DateTime.Now.ToString()+ ",文件名:" + li.FileName+ ",方法名:" + li.MethodName+ "行號:" + li.Line + ",列:" + li.Column+",日志類型:"+li.LogType);
                sw.WriteLine("日志內容:" + Msg);
                return nameof(WriteLineToFile) + "日志記錄操作成功!";
            }
            catch(Exception ex)
            {
                return nameof(WriteLineToFile)+"日志記錄操作錯誤:" +ex.Message;
            }
            finally
            {
                sw.Close();
                Slim.ExitWriteLock();
            }
        }
        /// <summary>
        /// 在以小時為單位的文件名稱里追加一行
        /// </summary>
        /// <param name="Msg">要寫到日志文件的信息</param>
         string WriteLineToTimeFile(string Msg,LogType type)
        {
            StreamWriter sw = null;
            try
            {
                Slim.EnterWriteLock();
                Dir = System.Windows.Forms.Application.StartupPath + @"\Logs\" + DateTime.Now.ToString("yyyy年MM月dd日");
                checkLog(Dir);
                string file = DateTime.Now.ToString("yyyy年MM月dd日HH時") + ".log";
                checkfile(Dir, file);
                string fileName = Dir + "\\" + file;
                LogInfo li = GetLog(type);
                sw = File.AppendText(fileName);
                sw.WriteLine("日志時間:" + DateTime.Now.ToString() + ",文件名:" + li.FileName + ",方法名:" + li.MethodName + "行號:" + li.Line + ",列:" + li.Column + ",日志類型:" + li.LogType);
                sw.WriteLine("日志內容:" + Msg);
                return nameof(WriteLineToTimeFile)+"日志記錄操作成功!";
            }
            catch(Exception ex)
            {
                return nameof(WriteLineToTimeFile) + "日志記錄發生錯誤:" +ex.Message ;
            }
            finally
            {
                sw.Close();
                Slim.ExitWriteLock();
            }
        }
        //檢查日志文件夾是否存在
         void checkLog(string Path)
        {
            if (!Directory.Exists(Path))
            {
                Directory.CreateDirectory(Path);
            }
        }
        /// <summary>
        /// 傳入路徑名稱和文件名稱,創建日志文件
        /// </summary>
        /// <param name="DirName"></param>
        /// <param name="FileName"></param>
         void checkfile(string DirName,string FileName)
        {
            if (!File.Exists(DirName+@"\" + FileName ))
            {
                File.Create(DirName + @"\" + FileName ).Close();
            }
        }
        public string SetLogFilePath(string logFilePath)
        {
            if (string.IsNullOrEmpty(logFilePath))
            {
                return nameof(SetLogFilePath) + "輸入參數不能為空!";
            }
            Dir = logFilePath.Substring(0,logFilePath.LastIndexOf("\\"));
            path = logFilePath.Substring(logFilePath.LastIndexOf("\\")+1,logFilePath.Length- logFilePath.LastIndexOf("\\")-1);
            return nameof(SetLogFilePath)+"調用成功!";
        }
        internal struct LogInfo
        {
            internal string FileName { get; set; }
            internal string MethodName { get; set; }
            internal int Line { get; set; }
            internal int Column { get; set; }
            internal string LogType{get;set;}
        }
         internal   LogInfo GetLog(LogType type)
        {
            StackTrace st = new StackTrace(2,true);
            StackFrame sf = st.GetFrame(0);
            LogInfo li = new LogInfo() {
                FileName = sf.GetFileName(),
                MethodName = sf.GetMethod().Name,
                Line = sf.GetFileLineNumber(),
                Column = sf.GetFileColumnNumber(),
            };
            string logType = "-Error";
       
            switch (type)
            {
                case LogType.Error:
                    logType = "-Error";
                    break;
                case LogType.Info:
                    logType = "-Info";
                    break;
                case LogType.Waring:
                    logType = "-Waring";
                    break;
                case LogType.Success:
                    logType = "-Success";
                    break;
                case LogType.Failure:
                    logType = "-Failure";
                    break;
                default:
                    logType = "-Error";
                    break;
            }
            li.LogType = logType;
            return li;
        }
    
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM