解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
11.27 KiB
X
# ÈÕÖ¾ILog ## ¸ÅÊö `NewLife.Log.ILog` ÊÇ NewLife.Core µÄºËÐÄÈÕÖ¾½Ó¿Ú£¬ÌṩͳһµÄÈÕÖ¾¼Ç¼¹æ·¶¡£NewLife ȫϵÁÐ×é¼þ¾ùʹÓøýӿڼǼÈÕÖ¾¡£ ͨ¹ý¾²Ì¬Àà `XTrace` ¿ÉÒÔ·½±ãµØÊ¹ÓÃÈÕÖ¾¹¦ÄÜ£¬Ö§³Ö£º - ÎļþÈÕÖ¾£¨Ä¬ÈÏ£© - ¿ØÖÆÌ¨ÈÕÖ¾ - ÍøÂçÈÕÖ¾ - ×Ô¶¨ÒåÈÕ־ʵÏÖ **ÃüÃû¿Õ¼ä**: `NewLife.Log` **Ô´Âë**: [NewLife.Core/Log/ILog.cs](https://github.com/NewLifeX/X/blob/master/NewLife.Core/Log/ILog.cs) **Îĵµ**: https://newlifex.com/core/log --- ## ¿ìËÙÈëÃÅ ### »ù´¡Ó÷¨ ```csharp using NewLife.Log; // ·½Ê½1£ºÊ¹Óà XTrace ¾²Ì¬Àà£¨ÍÆ¼ö£© XTrace.WriteLine("ÕâÊÇÒ»ÌõÐÅÏ¢"); XTrace.WriteLine("Óû§{0}µÇ¼", "admin"); // ·½Ê½2£ºÖ±½ÓʹÓà ILog ½Ó¿Ú ILog log = XTrace.Log; log.Info("ÕâÊÇÒ»ÌõÐÅÏ¢"); log.Error("ÕâÊÇÒ»Ìõ´íÎó"); ``` ### ÈÕÖ¾¼¶±ð ```csharp XTrace.Log.Debug("µ÷ÊÔÐÅÏ¢"); // µ÷ÊÔÈÕÖ¾ XTrace.Log.Info("ÆÕͨÐÅÏ¢"); // ÐÅÏ¢ÈÕÖ¾ XTrace.Log.Warn("¾¯¸æÐÅÏ¢"); // ¾¯¸æÈÕÖ¾ XTrace.Log.Error("´íÎóÐÅÏ¢"); // ´íÎóÈÕÖ¾ XTrace.Log.Fatal("ÑÏÖØ´íÎó"); // ÑÏÖØ´íÎóÈÕÖ¾ ``` ### Êä³öÒì³£ ```csharp try { // ÒµÎñ´úÂë } catch (Exception ex) { XTrace.WriteException(ex); // Êä³öÒì³£¶ÑÕ» } ``` --- ## ILog ½Ó¿Ú ```csharp public interface ILog { /// <summary>дÈÕÖ¾</summary> void Write(LogLevel level, String format, params Object?[] args); /// <summary>µ÷ÊÔÈÕÖ¾</summary> void Debug(String format, params Object?[] args); /// <summary>ÐÅÏ¢ÈÕÖ¾</summary> void Info(String format, params Object?[] args); /// <summary>¾¯¸æÈÕÖ¾</summary> void Warn(String format, params Object?[] args); /// <summary>´íÎóÈÕÖ¾</summary> void Error(String format, params Object?[] args); /// <summary>ÑÏÖØ´íÎóÈÕÖ¾</summary> void Fatal(String format, params Object?[] args); /// <summary>ÊÇ·ñÆôÓÃÈÕÖ¾¡£Îªfalseʱ²»Êä³öÈκÎÈÕÖ¾</summary> Boolean Enable { get; set; } /// <summary>ÈÕÖ¾µÈ¼¶£¬Ö»Êä³ö´óÓÚµÈÓڸü¶±ðµÄÈÕÖ¾£¬Ä¬ÈÏInfo</summary> LogLevel Level { get; set; } } ``` ### ÈÕÖ¾¼¶±ð LogLevel ```csharp public enum LogLevel { /// <summary>¹Ø±ÕÈÕÖ¾</summary> Off = 0, /// <summary>ÑÏÖØ´íÎó¡£µ¼ÖÂÓ¦ÓóÌÐòÍ˳ö</summary> Fatal = 1, /// <summary>´íÎó¡£Ó°Ï칦ÄÜÔËÐУ¬ÐèÒªÁ¢¼´´¦Àí</summary> Error = 2, /// <summary>¾¯¸æ¡£²»Ó°Ï칦ÄÜ£¬µ«ÐèÒª¹Ø×¢</summary> Warn = 3, /// <summary>ÐÅÏ¢¡£³£¹æÈÕÖ¾ÐÅÏ¢</summary> Info = 4, /// <summary>µ÷ÊÔ¡£µ÷ÊÔÈÕÖ¾£¬Éú²ú»·¾³Ó¦¹Ø±Õ</summary> Debug = 5, /// <summary>È«²¿</summary> All = 6 } ``` --- ## XTrace ¾²Ì¬Àà `XTrace` ÊÇÈÕÖ¾µÄÖ÷ҪʹÓÃÈë¿Ú£¬Ìṩ±ã½ÝµÄ¾²Ì¬·½·¨¡£ ### »ù´¡·½·¨ ```csharp // Êä³öÐÅÏ¢ÈÕÖ¾ XTrace.WriteLine("ÏûÏ¢"); XTrace.WriteLine("Óû§{0}ÔÚ{1}µÇ¼", "admin", DateTime.Now); // Êä³öÒì³£ XTrace.WriteException(ex); ``` ### ¹Ø¼üÊôÐÔ ```csharp // »ñÈ¡»òÉèÖÃÈÕ־ʵÏÖ ILog log = XTrace.Log; // ĬÈÏΪÎļþÈÕÖ¾ XTrace.Log = new ConsoleLog(); // Çл»Îª¿ØÖÆÌ¨ÈÕÖ¾ // ÊÇ·ñµ÷ÊÔģʽ XTrace.Debug = true; // ¿ªÆôµ÷ÊÔ£¬Êä³öDebug¼¶±ðÈÕÖ¾ // ÈÕ־·¾¶ XTrace.LogPath = "Logs"; // ÉèÖÃÈÕÖ¾Îļþ¼Ð ``` --- ## ĬÈÏÎļþÈÕÖ¾ NewLife ĬÈÏʹÓà `TextFileLog`£¬½«ÈÕÖ¾Êä³öµ½Îı¾Îļþ¡£ ### ÌØÐÔ - ×Ô¶¯°´ÈÕÆÚ·Ö¸îÈÕÖ¾Îļþ£¨Èç `2025-01-07.log`£© - Ò첽дÈ룬²»×èÈûÒµÎñÏß³Ì - ×Ô¶¯±¸·ÝºÍÇåÀí¾ÉÈÕÖ¾ - Ö§³ÖÅäÖÃÈÕ־·¾¶¡¢×î´óÎļþ´óСµÈ ### ÅäÖà ÔÚ `NewLife.config` »ò `appsettings.json` ÖÐÅäÖ㺠```xml <!-- NewLife.config --> <Config> <Setting> <LogPath>Logs</LogPath> <!-- ÈÕ־·¾¶ --> <LogLevel>Info</LogLevel> <!-- ÈÕÖ¾¼¶±ð --> <LogFileFormat>{0:yyyy-MM-dd}.log</LogFileFormat> <!-- ÎļþÃüÃû¸ñʽ --> </Setting> </Config> ``` ```json // appsettings.json { "NewLife": { "Setting": { "LogPath": "Logs", "LogLevel": "Info", "LogFileFormat": "{0:yyyy-MM-dd}.log" } } } ``` ### ÈÕÖ¾ÎļþʾÀý ``` 2025-01-07 10:15:23.456 Info Ó¦ÓóÌÐòÆô¶¯ 2025-01-07 10:15:24.123 Info Óû§adminµÇ¼ 2025-01-07 10:20:15.789 Warn Á¬½Ó³ØÒÑÂú 2025-01-07 10:25:30.456 Error Êý¾Ý¿âÁ¬½Ó³¬Ê± System.TimeoutException: Á¬½Ó³¬Ê± at MyApp.Database.Query(String sql) at MyApp.Service.GetData() ``` --- ## ¿ØÖÆÌ¨ÈÕÖ¾ ÔÚ¿ØÖÆÌ¨Ó¦ÓÃÖУ¬¿ÉÒÔʹÓà `UseConsole()` ½«ÈÕÖ¾Êä³öµ½¿ØÖÆÌ¨¡£ ### ʹÓ÷½·¨ ```csharp class Program { static void Main(String[] args) { // ÖØ¶¨ÏòÈÕÖ¾µ½¿ØÖÆÌ¨ XTrace.UseConsole(); XTrace.WriteLine("Ó¦ÓóÌÐòÆô¶¯"); XTrace.Log.Error("ÕâÊÇÒ»Ìõ´íÎó"); } } ``` ### ²ÊÉ«Êä³ö ¿ØÖÆÌ¨ÈÕÖ¾Ö§³Ö²ÊÉ«Êä³ö£¬²»Í¬ÈÕÖ¾¼¶±ðʹÓò»Í¬ÑÕÉ«£º - **Debug**: »ÒÉ« - **Info**: °×É« - **Warn**: »ÆÉ« - **Error**: ºìÉ« - **Fatal**: ÑóºìÉ« ### ¶àÏ̲߳ÊÉ« ```csharp XTrace.UseConsole(useColor: true); // ÆôÓòÊÉ«Êä³ö ThreadPool.QueueUserWorkItem(_ => { XTrace.WriteLine("Ïß³Ì1"); // ×Ô¶¯Ê¹Óò»Í¬ÑÕÉ« }); ThreadPool.QueueUserWorkItem(_ => { XTrace.WriteLine("Ïß³Ì2"); // ×Ô¶¯Ê¹Óò»Í¬ÑÕÉ« }); ``` --- ## ÍøÂçÈÕÖ¾ ½«ÈÕ־ͨ¹ýÍøÂç·¢Ë͵½Ô¶³ÌÈÕÖ¾·þÎñÆ÷¡£ ### ʹÓ÷½·¨ ```csharp // ÅäÖÃÍøÂçÈÕÖ¾ XTrace.Log = new NetworkLog("tcp://logserver:514"); XTrace.WriteLine("ÕâÌõÈÕÖ¾»á·¢Ë͵½Ô¶³Ì·þÎñÆ÷"); ``` ### ÊÊÓó¡¾° - ¼¯ÖÐʽÈÕÖ¾ÊÕ¼¯ - ·Ö²¼Ê½ÏµÍ³ÈÕÖ¾¾ÛºÏ - ÈÝÆ÷»¯Ó¦ÓÃÈÕÖ¾Êä³ö --- ## ¸´ºÏÈÕÖ¾ ͬʱÊä³öµ½¶à¸öÄ¿±ê¡£ ### ʹÓ÷½·¨ ```csharp using NewLife.Log; var compositeLog = new CompositeLog(); compositeLog.Add(new TextFileLog()); // ÎļþÈÕÖ¾ compositeLog.Add(new ConsoleLog()); // ¿ØÖÆÌ¨ÈÕÖ¾ compositeLog.Add(new NetworkLog("tcp://logserver:514")); // ÍøÂçÈÕÖ¾ XTrace.Log = compositeLog; ``` --- ## ×Ô¶¨ÒåÈÕÖ¾ ʵÏÖ `ILog` ½Ó¿Ú´´½¨×Ô¶¨ÒåÈÕÖ¾¡£ ### ʾÀý£ºÊý¾Ý¿âÈÕÖ¾ ```csharp public class DatabaseLog : ILog { public Boolean Enable { get; set; } = true; public LogLevel Level { get; set; } = LogLevel.Info; public void Write(LogLevel level, String format, params Object?[] args) { if (!Enable || level > Level) return; var message = args.Length > 0 ? String.Format(format, args) : format; // дÈëÊý¾Ý¿â Database.Insert("Logs", new { Level = level.ToString(), Message = message, CreateTime = DateTime.Now }); } public void Debug(String format, params Object?[] args) => Write(LogLevel.Debug, format, args); public void Info(String format, params Object?[] args) => Write(LogLevel.Info, format, args); public void Warn(String format, params Object?[] args) => Write(LogLevel.Warn, format, args); public void Error(String format, params Object?[] args) => Write(LogLevel.Error, format, args); public void Fatal(String format, params Object?[] args) => Write(LogLevel.Fatal, format, args); } // ʹÓà XTrace.Log = new DatabaseLog(); ``` --- ## ʹÓó¡¾° ### 1. Ó¦ÓóÌÐòÆô¶¯ÈÕÖ¾ ```csharp class Program { static void Main(String[] args) { XTrace.WriteLine("Ó¦ÓóÌÐòÆô¶¯"); XTrace.WriteLine("°æ±¾£º{0}", Assembly.GetExecutingAssembly().GetName().Version); XTrace.WriteLine("ÔËÐÐʱ£º{0}", Runtime.Version); try { RunApplication(); } catch (Exception ex) { XTrace.WriteException(ex); XTrace.Log.Fatal("Ó¦ÓóÌÐòÒì³£Í˳ö"); } } } ``` ### 2. ½Ó¿Úµ÷ÓÃÈÕÖ¾ ```csharp public class UserService { public void Login(String username, String password) { XTrace.WriteLine("Óû§{0}³¢ÊԵǼ", username); if (ValidateUser(username, password)) { XTrace.WriteLine("Óû§{0}µÇ¼³É¹¦", username); } else { XTrace.Log.Warn("Óû§{0}µÇ¼ʧ°Ü£ºÃÜÂë´íÎó", username); } } } ``` ### 3. Òì³£´¦Àí ```csharp try { var data = await FetchDataAsync(); ProcessData(data); } catch (TimeoutException ex) { XTrace.Log.Warn("Êý¾Ý»ñÈ¡³¬Ê±£º{0}", ex.Message); } catch (Exception ex) { XTrace.WriteException(ex); throw; } ``` ### 4. µ÷ÊÔÈÕÖ¾ ```csharp #if DEBUG XTrace.Debug = true; // ¿ª·¢»·¾³¿ªÆôµ÷ÊÔ #endif XTrace.Log.Debug("¿ªÊ¼´¦ÀíÊý¾Ý£º{0}Ìõ", data.Length); foreach (var item in data) { XTrace.Log.Debug("´¦ÀíÏîÄ¿£º{0}", item.Id); ProcessItem(item); } XTrace.Log.Debug("Êý¾Ý´¦ÀíÍê³É"); ``` --- ## ×î¼Ñʵ¼ù ### 1. ºÏÀíʹÓÃÈÕÖ¾¼¶±ð ```csharp // Debug£ºµ÷ÊÔÐÅÏ¢£¬Éú²ú»·¾³Ó¦¹Ø±Õ XTrace.Log.Debug("±äÁ¿Öµ£º{0}", value); // Info£º³£¹æÐÅÏ¢£¬¼ÇÂ¼ÖØÒª²Ù×÷ XTrace.Log.Info("Óû§{0}µÇ¼", username); // Warn£º¾¯¸æÐÅÏ¢£¬²»Ó°Ï칦Äܵ«Ðè¹Ø×¢ XTrace.Log.Warn("Á¬½Ó³ØÊ¹ÓÃÂÊ£º{0}%", usage); // Error£º´íÎóÐÅÏ¢£¬Ó°Ï칦ÄÜÔËÐÐ XTrace.Log.Error("Êý¾Ý¿âÁ¬½Óʧ°Ü£º{0}", ex.Message); // Fatal£ºÑÏÖØ´íÎ󣬵¼ÖÂÓ¦ÓÃÍ˳ö XTrace.Log.Fatal("ÅäÖÃÎļþË𻵣¬Ó¦ÓóÌÐòÍ˳ö"); ``` ### 2. ±ÜÃâÈÕÖ¾ÐÅÏ¢¹ý¶à ```csharp // ²»ÍƼö£ºÑ­»·ÖÐÊä³öÈÕÖ¾ foreach (var item in items) // 100ÍòÌõÊý¾Ý { XTrace.Log.Debug("´¦Àí£º{0}", item); // ²úÉú100ÍòÌõÈÕÖ¾£¡ } // ÍÆ¼ö£º»ã×ÜÊä³ö var count = 0; foreach (var item in items) { ProcessItem(item); count++; } XTrace.Log.Info("´¦ÀíÍê³É£º{0}Ìõ", count); ``` ### 3. ʹÓýṹ»¯ÈÕÖ¾ ```csharp // ÍÆ¼ö£ºÊ¹ÓÃռλ·û XTrace.Log.Info("Óû§{0}´Ó{1}µÇ¼£¬IP={2}", username, location, ip); // ²»ÍƼö£º×Ö·û´®Æ´½Ó XTrace.Log.Info("Óû§" + username + "´Ó" + location + "µÇ¼£¬IP=" + ip); ``` ### 4. ÐÔÄÜ¿¼ÂÇ ```csharp // ÍÆ¼ö£ºÏÈÅжϼ¶±ð if (XTrace.Log.Enable && XTrace.Log.Level >= LogLevel.Debug) { var expensiveData = GetExpensiveDebugInfo(); // °º¹ó²Ù×÷ XTrace.Log.Debug("µ÷ÊÔÐÅÏ¢£º{0}", expensiveData); } // ²»ÍƼö£ºÖ±½Óµ÷Óà XTrace.Log.Debug("µ÷ÊÔÐÅÏ¢£º{0}", GetExpensiveDebugInfo()); // ¼´Ê¹Debug¹Ø±ÕÒ²»áÖ´ÐÐ ``` --- ## ÅäÖùÜÀí ### ͨ¹ý´úÂëÅäÖà ```csharp // ÉèÖÃÈÕÖ¾¼¶±ð XTrace.Log.Level = LogLevel.Warn; // Ö»Êä³öWarn¼°ÒÔÉÏ // ¹Ø±ÕÈÕÖ¾ XTrace.Log.Enable = false; // ÉèÖÃÈÕ־·¾¶ XTrace.LogPath = "C:\\Logs"; ``` ### ͨ¹ýÅäÖÃÎļþ ```xml <!-- NewLife.config --> <Config> <Setting> <LogPath>Logs</LogPath> <LogLevel>Info</LogLevel> <Debug>false</Debug> </Setting> </Config> ``` ### ÔËÐÐʱÐÞ¸Ä ```csharp // ÁÙʱ¿ªÆôµ÷ÊÔ var oldDebug = XTrace.Debug; XTrace.Debug = true; try { DebugMethod(); } finally { XTrace.Debug = oldDebug; // »Ö¸´ÉèÖà } ``` --- ## È«¾ÖÒì³£´¦Àí XTrace ×Ô¶¯²¶»ñδ´¦ÀíÒì³££º ```csharp static XTrace() { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; } ``` µ±·¢Éúδ´¦ÀíÒ쳣ʱ£¬»á×Ô¶¯Êä³öÒì³£ÈÕÖ¾¡£ --- ## ³£¼ûÎÊÌâ ### 1. ÈçºÎ¹Ø±ÕÈÕÖ¾£¿ ```csharp // ·½Ê½1£º¹Ø±ÕÈÕÖ¾Êä³ö XTrace.Log.Enable = false; // ·½Ê½2£ºÉèÖÃÈÕÖ¾¼¶±ðΪOff XTrace.Log.Level = LogLevel.Off; // ·½Ê½3£ºÊ¹ÓÿÕÈÕÖ¾ XTrace.Log = Logger.Null; ``` ### 2. ÈÕÖ¾ÎļþÔÚÄÄÀ ĬÈÏÔÚÓ¦ÓóÌÐò¸ùĿ¼µÄ `Logs` Îļþ¼ÐÏ£¬ÎļþÃû¸ñʽΪ `yyyy-MM-dd.log`¡£ ### 3. ÈçºÎÊä³öµ½¶à¸öÄ¿±ê£¿ ```csharp var compositeLog = new CompositeLog(); compositeLog.Add(new TextFileLog()); compositeLog.Add(new ConsoleLog()); XTrace.Log = compositeLog; ``` ### 4. ÈÕÖ¾ÎļþÌ«´óÔõô°ì£¿ ÅäÖÃÈÕÖ¾±¸·ÝºÍÇåÀí²ßÂÔ£º ```csharp var textLog = new TextFileLog(); textLog.MaxBytes = 10 * 1024 * 1024; // ×î´ó10MB textLog.Backups = 10; // ±£Áô10¸ö±¸·Ý ``` ### 5. ÈçºÎÔÚASP.NET CoreÖÐʹÓã¿ ```csharp // Startup.cs »ò Program.cs public void Configure(IApplicationBuilder app) { // ÈÕÖ¾ÒÑ×Ô¶¯³õʼ»¯£¬Ö±½ÓʹÓà XTrace.WriteLine("Ó¦ÓóÌÐòÆô¶¯"); } ``` --- ## ²Î¿¼×ÊÁÏ - **ÔÚÏßÎĵµ**: https://newlifex.com/core/log - **Ô´Âë**: https://github.com/NewLifeX/X/tree/master/NewLife.Core/Log - **Á´Â·×·×Ù**: [tracer-Á´Â·×·×ÙITracer.md](/NewLife/X/Blob/master/Doc/tracer-Á´Â·×·×ÙITracer.md) --- ## ¸üÐÂÈÕÖ¾ - **2025-01**: ÍêÉÆÎĵµ£¬²¹³äÏêϸʾÀý - **2024**: Ö§³Ö .NET 9.0 - **2023**: ÓÅ»¯Ò첽дÈëÐÔÄÜ - **2022**: Ôö¼ÓÍøÂçÈÕÖ¾Ö§³Ö - **2020**: ÖØ¹¹ÈÕÖ¾¼Ü¹¹£¬Í³Ò»½Ó¿Ú