解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ÈÕÖ¾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/dev/Doc/tracer-Á´Â·×·×ÙITracer.md)
---
## ¸üÐÂÈÕÖ¾
- **2025-01**: ÍêÉÆÎĵµ£¬²¹³äÏêϸʾÀý
- **2024**: Ö§³Ö .NET 9.0
- **2023**: ÓÅ»¯Ò첽дÈëÐÔÄÜ
- **2022**: Ôö¼ÓÍøÂçÈÕÖ¾Ö§³Ö
- **2020**: ÖØ¹¹ÈÕÖ¾¼Ü¹¹£¬Í³Ò»½Ó¿Ú
|