Explorar o código

增加日志记录

yuxi-lee %!s(int64=3) %!d(string=hai) anos
pai
achega
e33b9187eb
Modificáronse 5 ficheiros con 280 adicións e 0 borrados
  1. 60 0
      LocalLog/LocalTraceListener.cs
  2. 8 0
      Program.cs
  3. 8 0
      TextLog/ILogger.cs
  4. 135 0
      TextLog/Logger.cs
  5. 69 0
      TextLog/SyncLogger.cs

+ 60 - 0
LocalLog/LocalTraceListener.cs

@@ -0,0 +1,60 @@
+using LJLib.Tools.File;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace LJLib.LocalLog
+{
+    internal class LocalTraceListener : TraceListener
+    {
+#if !(WindowsCE || PocketPC)
+        private Dictionary<string, byte> oldStack = new Dictionary<string, byte>();
+#endif
+
+        private object _syncRoot = new object();
+
+        private ILogger _logger = null;
+        public bool HasStack { get; set; }
+        public LocalTraceListener(ILogger logger) { _logger = logger; }
+        public override void Write(string message)
+        {
+            lock (_syncRoot)
+            {
+                if (_logger != null)
+                {
+                    try
+                    {
+                        if (HasStack) // 包含堆栈信息
+                        {
+#if !(WindowsCE || PocketPC)
+                            var stack = (new StackTrace()).ToString();
+                            var key = stack;
+                            var index = message.IndexOf(": ");
+                            if (index >= 0)
+                            {
+                                key += message.Substring(0, index);
+                            }
+                            if (!oldStack.ContainsKey(key)) // 重复的堆栈信息不输出
+                            {
+                                oldStack.Add(key, 1);
+                                message += "\r\n" + stack;
+                                _logger.WriteLog(message);
+                            }
+#endif
+                        }
+                        else // 不包含堆栈信息
+                        {
+                            _logger.WriteLog(message);
+                        }
+                    }
+                    catch (Exception ex) { }
+                }
+            }
+        }
+
+        public override void WriteLine(string message)
+        {
+            Write(message);
+        }
+    }
+}

+ 8 - 0
Program.cs

@@ -1,9 +1,12 @@
+using LJLib.LocalLog;
+using LJLib.Tools.File;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Threading.Tasks;
 
@@ -13,6 +16,11 @@ namespace LJProxy
     {
         public static void Main(string[] args)
         {
+            var binpath = AppContext.BaseDirectory;
+            Trace.AutoFlush = false;
+            Trace.Listeners.Clear();
+            Trace.Listeners.Add(new LocalTraceListener(new SyncLogger(new Logger(binpath, "config.log.txt"))));
+
             CreateHostBuilder(args).Build().Run();
         }
 

+ 8 - 0
TextLog/ILogger.cs

@@ -0,0 +1,8 @@
+
+namespace LJLib.Tools.File
+{
+    internal interface ILogger
+    {
+        void WriteLog(string msg);
+    }
+}

+ 135 - 0
TextLog/Logger.cs

@@ -0,0 +1,135 @@
+using System;
+using System.IO;
+using System.Reflection;
+
+namespace LJLib.Tools.File
+{
+    internal class Logger : ILogger
+    {
+        private string _path;
+
+        private string _filename = "log.txt";
+
+        private object _syncRoot = new object();
+
+        public Logger()
+        {
+            _path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", "");
+        }
+
+        public Logger(string path)
+        {
+            _path = path;
+        }
+
+        public Logger(string path, string filename)
+        {
+            _path = path;
+            _filename = filename;
+        }
+
+        public virtual string Path
+        {
+            get { return _path; }
+        }
+
+        public virtual string FileName
+        {
+            get { return _filename; }
+            set { _filename = value; }
+        }
+
+        public virtual string FullName
+        {
+            get { return _path + "\\" + _filename; }
+        }
+
+        public virtual void WriteLog(string msg)
+        {
+            try
+            {
+                FileInfo file = new FileInfo(FullName);
+                if (file.Exists && file.Length > 10240000)
+                {
+                    string tmpfile = FullName + ".tmp";
+                    using (FileStream fs = file.Open(FileMode.Open, FileAccess.Read))
+                    using (StreamReader reader = new StreamReader(fs))
+                    {
+                        fs.Seek(-1024000, SeekOrigin.End);
+                        reader.ReadLine();
+                        using (StreamWriter sw = System.IO.File.AppendText(tmpfile))
+                        {
+                            while (!reader.EndOfStream)
+                            {
+                                string strline = reader.ReadLine();
+                                sw.WriteLine(strline);
+                            }
+                            sw.Flush();
+                            sw.Close();
+                        }
+                    }
+                    file.Delete();
+                    System.IO.File.Move(tmpfile, FullName);
+                }
+
+                using (StreamWriter sw = System.IO.File.AppendText(FullName))
+                {
+                    string rslt = "//====================================================================\r\n";
+                    rslt += "// 时间: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";
+                    rslt += "//--------------------------------------------------------------------\r\n";
+                    rslt += "// " + msg.Replace("\r\n", "\r\n// ") + "\r\n";
+                    rslt += "//====================================================================\r\n\r\n";
+                    sw.Write(rslt);
+                    sw.Flush();
+                    sw.Close();
+                }
+            }
+            catch (System.Exception ex)
+            {
+            	
+            }
+        }
+
+        public virtual void InsertLog(string msg)
+        {
+            try
+            {
+                using (FileStream fs = System.IO.File.Open(FullName, FileMode.OpenOrCreate))
+                {
+                    StreamReader reader = new StreamReader(fs);
+                    string filestr = reader.ReadToEnd();
+                    filestr = DateTime.Now.ToString("yyyy-MM-dd HH:mm") + " " + msg + "\r\n" + filestr;
+                    fs.Seek(0, SeekOrigin.Begin);
+                    StreamWriter writer = new StreamWriter(fs);
+                    writer.Write(filestr);
+                    writer.Flush();
+                }
+            }
+            catch (System.Exception ex)
+            {
+            	
+            }
+        }
+
+        public virtual bool IsSynchronized
+        {
+            get
+            {
+                return false;
+            }
+        }
+
+        public virtual object SyncRoot
+        {
+            get
+            {
+                return _syncRoot;
+            }
+        }
+
+        public static Logger Synchronized(Logger logger)
+        {
+            return new SyncLogger(logger);
+        }
+    }
+}

+ 69 - 0
TextLog/SyncLogger.cs

@@ -0,0 +1,69 @@
+
+namespace LJLib.Tools.File
+{
+    internal class SyncLogger : Logger
+    {
+        protected Logger _logger;
+
+        public SyncLogger(Logger logger)
+        {
+            _logger = logger;
+        }
+
+        public override string Path
+        {
+            get
+            {
+                return _logger.Path;
+            }
+        }
+
+        public override string FileName
+        {
+            get
+            {
+                return _logger.FileName;
+            }
+        }
+
+        public override string FullName
+        {
+            get
+            {
+                return _logger.FullName;
+            }
+        }
+
+        public override void WriteLog(string msg)
+        {
+            lock (_logger.SyncRoot)
+            {
+                _logger.WriteLog(msg);
+            }
+        }
+
+        public override void InsertLog(string msg)
+        {
+            lock (_logger.SyncRoot)
+            {
+                _logger.InsertLog(msg);
+            }
+        }
+
+        public override bool IsSynchronized
+        {
+            get
+            {
+                return true;
+            }
+        }
+
+        public override object SyncRoot
+        {
+            get
+            {
+                return _logger.SyncRoot;
+            }
+        }
+    }
+}