日志类型:调试日志、追踪日志、诊断日志、事件日志
调试日志: 运用 调试器 Debugger 静态类里面的一些方法输出
在Debug 下编译才生效,Relase下编译后不起作用。
public static void Run()
{
Debugger.Log(0, null, "只是一个日志");
Console.Read();
}
追踪日志: 观察者模式/发布订阅模式
public static void Run()
{
var Source = new TraceSource("Trace", SourceLevels.Information);
Source.TraceEvent(TraceEventType.Error, 1, "这是一条错误信息");
Console.Read();
}
创建跟踪源 TraceSource 发布者 SourceLevels 过滤的等级
TraceEvent 发布事件 TraceEventType 过滤的事件等级
以上代码是 创建了一个 过滤info以上的日志追踪源,并且发布了一个 Error等级的事件
订阅监听者 TraceListener
可以自己指定 比如说 将日志 在控制台命令输出,或者把日志输出到文件里面去
public static void Run()
{
using var fileStream = File.OpenWrite("log.txt");
var Source = new TraceSource("Trace", SourceLevels.Information);
Source.Listeners.Add(new ConsoleTraceListener());//文本形式控制台输出
Source.Listeners.Add(new TextWriterTraceListener(fileStream)); //文件流
Source.TraceEvent(TraceEventType.Error, 1, "这是一条错误信息");
Source.Flush(); //文件流 缓冲区输出
Console.Read();
}
这样的话 就是 默认IDE输出窗口,以及控制台输出,log.txt文件里面都会写入日志
订阅监听把内容输出到CSV文件
public static void Run2()
{
const string filename = "log1.csv";
File.AppendAllText(filename, $"SourceName,EventType,EventId,Message,N/A,ProcessId,N/A,ThreadId,DateTime,{Environment.NewLine}");
using var fileStream = new FileStream(filename, FileMode.Append);
var listener = new DelimitedListTraceListener(fileStream)
{
Delimiter = ",",
TraceOutputOptions = TraceOptions.DateTime | TraceOptions.ProcessId | TraceOptions.ThreadId
//TraceOptions 有的一些属性值 输出的基本上模板也就是这些信息
};
var source = new TraceSource("CsvTrace", SourceLevels.All);
source.Listeners.Add(new ConsoleTraceListener());
source.Listeners.Add(listener);
source.TraceEvent(TraceEventType.Information, 1, $"这是一条{TraceEventType.Information}消息");
source.Flush();
}
类似于log.txt 只不过有了一些样式分割 以csv的形式处理了一下
日志级别:
ASP.NET Core中提供了6种日志级别,按严重性从低到高排列,分别是
Trace = 0、Debug = 1、Information = 2、Warning = 3、Error = 4、Critical = 5 。
低于设置级别的日志不会输出。
诊断日志:
角色:发布者小弟 DiagnosticListener 发布者大哥 Observer
建立发布者与订阅者 适配关系SubscribeWithAdapter
订阅声明:DiagnosticName
public static class Test2
{
//诊断日志
public static void Run()
{
//声明发布者小弟AppLog
var source = new DiagnosticListener("AppLog");
//声明发布者小弟AppLog2
var source2 = new DiagnosticListener("AppLog2");
//发布者小弟AppLog要发布干的事情 给key是Hello 的消息 传参数
source.Write("Hello", new
{
Type = 1,
Msg = "2020年5月11日"
});
//发布者小弟AppLog2要发布干的事情 给key是Hello2 的消息 传参数
source2.Write("Hello2", new
{
Type = 2,
Msg = "2020年5月11日"
});
//发布管理 DiagnosticListener 发布者小弟 Observer 发布者大哥
DiagnosticListener.AllListeners.Subscribe(new Observer<DiagnosticListener>(listener =>
{
//发布者大哥进行 适配管理
if (listener.Name == "AppLog")
{
//将发布者小弟AppLog与订阅者的适配关系
listener.SubscribeWithAdapter(new CustomSourceCollector());
}
//发布者大哥进行 适配管理
if (listener.Name == "AppLog2")
{
//将发布者小弟AppLog2与订阅者的适配关系
listener.SubscribeWithAdapter(new CustomSourceCollector());
}
}));
}
//发布者大哥 真正的发布管理者
public class Observer<T> : IObserver<T>
{
private readonly Action<T> _onNext;
public Observer(Action<T> onNext)
{
_onNext = onNext;
}
public void OnCompleted() { }
public void OnError(Exception error) { }
public void OnNext(T value)
{
_onNext(value);
}
}
//订阅者
public class CustomSourceCollector
{
//订阅的哪个key Hello 接收Hello的参数
[DiagnosticName("Hello")]
public void OnHello(int type, string msg)
{
Console.WriteLine($"Type:{type}");
Console.WriteLine($"Msg:{msg}");
}
//订阅的哪个key Hello2 接收Hello2的参数
[DiagnosticName("Hello2")]
public void OnHello2(int type, string msg)
{
Console.WriteLine($"Type:{type}");
Console.WriteLine($"Msg:{msg}");
}
}
}
Asp.Net Core中:
日志配置:
Asp.Net Core 由于Program.cs中默认使用WebHost.CreateDefaultBuilder方法添加了2个日志提供器。已经配置了
使用得话也的相对简单,依赖注入ILogger
第三方日志:
Nlog的使用方法