一、前言
为了方便程序中问题追踪查看分析,需要打印或者保存日志,特别是针对生成环境没有日志记录除了问题就各种大眼瞪小眼各种猜测;
日志记录输出的形式很多,可以是在控制台直接打印出来,可以是记事本记录,也可以是各种数据库记录;
记录日志的插件也很多,比如Log4.net 、NLog、SerialLog等等
本文主要讲解 .net core 控制台应用程序 自带的 SeralLog 日志工具,采用记事本的方式保存日志信息;
运行环境:VS2019+.Net5控制台应用程序+SerialLog日志工具+Win10系统
二、使用步骤
1、创建.netcore控制台应用程序:
项目已经自带SerialLog的引用和配置;//Program.cs
public static async Task<int> Main(string[] args)
{
//1、日志输出配置:配置好以后方便后面使用
DebugPrint();
//2、保存日志:打印到控制台窗口 和保存到记事本Logs/log.txt中
Log.Debug("调试信息");
Log.Information("常规信息");
Serilog.Log.Information("常规信息");
Log.Warning("警告");
Log.Error("错误信息");
Serilog.Log.Fatal("致命错误");
}
/// <summary>
/// 调试打印:日志输出配置 方便其他地方使用 Log.Error("");
/// </summary>
internal static void DebugPrint()
{
Log.Logger = new LoggerConfiguration() //配置SerialLog日志工具
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Error)
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt")) //日志保存到根目录 Logs/logs.txt 里面
.WriteTo.Async(c => c.Console()) //日志同时打印到控制台窗口中
.CreateLogger();
}
2、日志记录二次封装:
有时候在进行日志输出记录的时候,需要记录当前日志位置所属的类、方法、以及代码行数,便于后续分析问题,查找代码,所以对日志记录进行二次封装方便使用;穿件一个PMDS.cs 的静态来//PMDS.cs
/// <summary>
/// 常规提示信息
/// </summary>
/// <param name="message">传入错误信息</param>
/// <param name="memberName">当前所在方法:不用传参</param>
/// <param name="sourceFilePath">当前所属类:不用传参</param>
/// <param name="sourceLineNumber">当前所在代码行数:不用传参</param>
public static void Log_Info(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
Serilog.Log.Information($"message:{message} "); //错误信息
Serilog.Log.Information($"member name: {memberName}");//当前所在方法
Serilog.Log.Information($"source file path:{sourceFilePath} ");//当前所属类
Serilog.Log.Information($"source line number: {sourceLineNumber}");//当前所在代码行数
}
/// <summary>
/// 日志:警告信息
/// </summary>
public static void Log_Warn(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
Serilog.Log.Warning($"message:{message} ");
Serilog.Log.Warning($"member name: {memberName}");
Serilog.Log.Warning($"source file path:{sourceFilePath} ");
Serilog.Log.Warning($"source line number: {sourceLineNumber}");
}
/// <summary>
/// 日志:错误信息
/// </summary>
public static void Log_Error(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
Serilog.Log.Error($"message:{message} ");
Serilog.Log.Error($"member name: {memberName}");
Serilog.Log.Error($"source file path:{sourceFilePath} ");
Serilog.Log.Error($"source line number: {sourceLineNumber}");
}
/// <summary>
/// 日志:致命错误
/// </summary>
public static void Log_Fatal(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
Serilog.Log.Fatal($"message:{message} ");
Serilog.Log.Fatal($"member name: {memberName}");
Serilog.Log.Fatal($"source file path:{sourceFilePath} ");
Serilog.Log.Fatal($"source line number: {sourceLineNumber}");
}
/// <summary>
/// 日志:调试信息
/// </summary>
public static void Log_Debug(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
Serilog.Log.Debug($"message:{message} ");
Serilog.Log.Debug($"member name: {memberName}");
Serilog.Log.Debug($"source file path:{sourceFilePath} ");
Serilog.Log.Debug($"source line number: {sourceLineNumber}");
}
调用方法:
PMDS.Log_Info("8、开启设备信息刷新服务:");
日志输出:
日志存储路径:Logs/log.txt
2021-05-09 19:18:10.629 +08:00 [WRN] message:8、开启设备信息刷新服务:
2021-05-09 19:18:10.629 +08:00 [WRN] member name: StartServiceAsync
2021-05-09 19:18:10.629 +08:00 [WRN] source file path:E:\Projects\GasMonitoring\GasMonitoring.ConsoleService\MainService.cs
2021-05-09 19:18:10.629 +08:00 [WRN] source line number: 124