为了方便分析问题,NewLife所有组件都带有日志输出。日志默认输出到Log文件夹,Main入口使用XTrace.UseConsole后同时输出文本日志文件和控制台。但有些项目在稳定后不想输出控制台日志或者文本日志,今天我们来聊聊其中的奥秘。
关于日志的详细介绍,可以阅读日志ILog(文件日志/控制台日志/窗口日志/网络日志)。
使用日志
新建控制台项目(其它项目类似),nuget引入 NewLife.Core 和 NewLife.XCode,运行以下代码:
using NewLife.Log;
using NewLife.Serialization;
using XCode.Membership;
XTrace.UseConsole();
var list = Role.FindAll();
XTrace.WriteLine(list.ToJson(true));
Console.WriteLine("OK!");
可以得到常见的控制台日志输出:
同时,工作目录的Log子目录下也有日志(仅截取一段):
#Software: ConsoleApp27
#ProcessID: 16860 x64
#AppDomain: ConsoleApp27
#FileName: D:\Test\ConsoleApp27\ConsoleApp27\bin\Debug\net8.0\ConsoleApp27.exe
#BaseDirectory: D:\Test\ConsoleApp27\ConsoleApp27\bin\Debug\net8.0\
#TempPath: C:\Users\Stone\AppData\Local\Temp\
#CommandLine: D:\Test\ConsoleApp27\ConsoleApp27\bin\Debug\net8.0\ConsoleApp27.dll
#ApplicationType: Console
#CLR: 8.0.4, .NET 8.0.4
#OS: Microsoft Windows NT 10.0.22631.0, X6/Stone
#CPU: 8
#GC: IsServerGC=False, LatencyMode=Interactive
#ThreadPool: Min=32/32, Max=32767/1000, Available=32765/1000
#SystemStarted: 00:04:56.7810000
#Date: 2024-04-21
#详解:https://newlifex.com/core/log
#字段: 时间 线程ID 线程池Y/网页W/普通N/定时T 线程名/任务ID 消息内容
#Fields: Time ThreadID Kind Name Message
22:01:33.067 1 N - NewLife.Core v10.9.2024.0402 Build 2024-04-02 .NET 8.0
22:01:33.070 1 N - NewLife组件核心库 ©2002-2024 NewLife
22:01:33.070 1 N - ConsoleApp27 v1.0.0 Build 2000-01-01 .NET 8.0
22:01:33.070 1 N - ConsoleApp27
22:01:33.070 1 N - XCode v11.11.2024.0402 Build 2024-04-02 .NET Standard 2.1
22:01:33.070 1 N - NewLife数据中间件 ©2002-2024 NewLife
22:01:33.071 1 N - 当前配置为输出SQL日志,如果觉得日志过多,可以修改配置关闭[Config/XCode.config:ShowSQL=false]。
22:01:33.412 1 N - 自动为[Membership]设置SQLite连接字符串:Data Source=Data\Membership.db;Migration=On
22:01:33.436 1 N - [Membership]待检查数据表:Role
关闭日志
各组件默认日志输出指向XTrace.Log这个全局静态属性,它的默认值就是文本文件日志。
在Main入口函数第一行写入XTrace.UseConsole后,XTrace.Log的值就被修改为控制台日志和文本文件日志的混合体,也就是同时写两份日志。
因此,我们可以通过修改XTrace.Log来改变日志输出行为,甚至关闭日志。
关闭文本日志,仅使用控制台日志,代码如下:
//XTrace.UseConsole();
// 仅保留控制台日志
XTrace.Log = new ConsoleLog();
彻底关闭文本日志和控制台日志,全部代码如下:
using NewLife.Log;
using NewLife.Serialization;
using XCode.Membership;
//XTrace.UseConsole();
// 仅保留控制台日志
//XTrace.Log = new ConsoleLog();
// 彻底关闭日志
XTrace.Log = Logger.Null;
var list = Role.FindAll();
XTrace.WriteLine(list.ToJson(true));
Console.WriteLine("OK!");
其中Logger.Null是一个实现了ILog接口的空日志提供者,向其中写入的日志,全部都将会被抛弃掉。