【Abp VNext】实战入门(三):【3】控制台应用程序 —— Seriallog日志记录


一、前言

为了方便程序中问题追踪查看分析,需要打印或者保存日志,特别是针对生成环境没有日志记录除了问题就各种大眼瞪小眼各种猜测;

日志记录输出的形式很多,可以是在控制台直接打印出来,可以是记事本记录,也可以是各种数据库记录;

记录日志的插件也很多,比如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

三、总结

很简单就解决了日志存储问题,千万别自己造轮子去手动写什么日志记录,这只是很基础的用法,要保存数据库、要发送邮件或者其他什么的都可以用Seriallog日志工具,更多功能自行发觉;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值