当前位置: 首页 > article >正文

WPF 手撸插件 七 日志记录(二)

1、本文使用Serilog进行记录日志,目前想只用log4net进行日志记录,但是Serilog有想学习一下,所有这里使用控制台项目来学习一下Serilog。我使用的还是.Net Framework 4.5.

2、NuGet 安装Serilog 2.12.0、Serilog.Sinks.Console 4.1.0,如下图。

3、代码示例。

3.1、将信息输入到控制台,代码如下。

using Serilog;
using Serilog.Sinks.SystemConsole;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();
            logger.Information("信息日志");
            Console.ReadKey();
        }
    }
}

运行效果如下图。

3.2、将日志信息输出到文件,添加NuGet   Serilog.Sinks.File 4.1.0,如下图。

示例代码如下。其中自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期 

using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.SystemConsole.Themes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration()
                .WriteTo.Console(theme:AnsiConsoleTheme.Code)
                .WriteTo.File(@"Log/log.txt",rollingInterval:RollingInterval.Day,rollOnFileSizeLimit:true)//自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期
                .CreateLogger();
            logger.Information("信息日志");
            Console.ReadKey();
        }
    }
}

效果如下图。 

 3.3、将日志以json数据形式打印到控制台和文件中,效果如下图。

创建一个LogInfo类,代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppSerilog
{
    public class LogInfo
    {
        public int Index { get; set; }

        public string Description { get; set; }
    }
}

Main函数代码如下。

using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.SystemConsole.Themes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration()
                .WriteTo.Console(theme:AnsiConsoleTheme.Code)
                .WriteTo.File(@"Log/log.txt",rollingInterval:RollingInterval.Day,rollOnFileSizeLimit:true)//自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期
                .CreateLogger();
            logger.Information("信息日志");
            
            var logInfo = new LogInfo
            {
                Index=1,
                Description="日志描述"
            };

            logger.Information("{@logInfo}", logInfo);
            Console.ReadKey();
        }
    }
}

3.4、几种常见的信息输出方式,效果如下图。

代码如下。

using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.SystemConsole.Themes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration()
                .WriteTo.Console(theme:AnsiConsoleTheme.Code)
                .WriteTo.File(@"Log/log.txt",rollingInterval:RollingInterval.Day,rollOnFileSizeLimit:true)//自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期
                .CreateLogger();
            logger.Information("信息日志");
            
            var logInfo = new LogInfo
            {
                Index=1,
                Description="日志描述"
            };

            logger.Information("{logInfo}", logInfo);
            logger.Information("{@logInfo}", logInfo);
            logger.Information("{$logInfo}", logInfo);


            logger.Information("-----------------------");

            var dicLogInfo = new Dictionary<string, object>
            {
                {"Index",logInfo.Index },
                {"Description",logInfo.Description },
            };

            logger.Information("{dicLogInfo}", dicLogInfo);
            logger.Information("{@dicLogInfo}", dicLogInfo);
            logger.Information("{$dicLogInfo}", dicLogInfo);
            Console.ReadKey();
        }
    }
}

3.5、SerilogTimings 在应用程序中记录操作的执行时间。‌通过SerilogTimings,‌开发者可以在日志中包含关于操作执行时长的信息,‌这对于性能监控和调试非常有用。‌

示例如下,首先添加NuGet SerilogTimings 2.3.0,如下图。

示例代码如下。

using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.SystemConsole.Themes;
using SerilogTimings;
using SerilogTimings.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration()                
                .WriteTo.Console(theme: AnsiConsoleTheme.Code)
                .WriteTo.File(@"Log/log.txt",rollingInterval:RollingInterval.Day,rollOnFileSizeLimit:true)//自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期
                .CreateLogger();

            logger.Information("信息日志");
            
            var logInfo = new LogInfo
            {
                Index=1,
                Description="日志描述"
            };

            logger.Information("{logInfo}", logInfo);
            logger.Information("{@logInfo}", logInfo);
            logger.Information("{$logInfo}", logInfo);


            logger.Information("-----------------------");

            var dicLogInfo = new Dictionary<string, object>
            {
                {"Index",logInfo.Index },
                {"Description",logInfo.Description },
            };

            logger.Information("{dicLogInfo}", dicLogInfo);
            logger.Information("{@dicLogInfo}", dicLogInfo);
            logger.Information("{$dicLogInfo}", dicLogInfo);

            TimeOper(logger, logInfo);

            Console.ReadKey();
        }

        public static async void TimeOper(ILogger logger, LogInfo logInfo)
        {
            using (logger.TimeOperation("Submitting payment for {Index}", logInfo.Index))
            {
                // Timed block of code goes here
                await Task.Delay(50);
                logger.Information("执行日志{Description}", logInfo.Description);
            }

            var opr=logger.BeginOperation("BeginOperation {Index}", logInfo.Index);
            await Task.Delay(50);
            logger.Information("执行日志 BeginOperation {Description}", logInfo.Description);

            opr.Complete();

        }
    }

}

 运行效果如下图。

 3.6、使用Destructurama.Attributed 1.0.7 对日志内容进行一些隐藏,由于我这里使用的是.Net Framework4.5,所以用法上不要过度的计较。

NuGet引入 Destructurama.Attributed 1.0.7 如下图。

运行效果如下图。Description中的数据被***替代了。

 示例代码如下。

using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.SystemConsole.Themes;
using SerilogTimings;
using SerilogTimings.Extensions;
using Destructurama;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration()
                .Destructure.UsingAttributes()
                .WriteTo.Console(theme: AnsiConsoleTheme.Code)
                .WriteTo.File(@"Log/log.txt",rollingInterval:RollingInterval.Day,rollOnFileSizeLimit:true)//自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期
                .Destructure.ByTransforming<LogInfo>(obj=> new{
                    Index = obj.Index,
                    Description = "***"
                })
                
                .CreateLogger();

            logger.Information("信息日志");
            
            var logInfo = new LogInfo
            {
                Index=1,
                Description="日志描述"
            };

            logger.Information("{logInfo}", logInfo);
            logger.Information("{@logInfo}", logInfo);
            logger.Information("{$logInfo}", logInfo);


            logger.Information("-----------------------");

            var dicLogInfo = new Dictionary<string, object>
            {
                {"Index",logInfo.Index },
                {"Description",logInfo.Description },
            };

            logger.Information("{dicLogInfo}", dicLogInfo);
            logger.Information("{@dicLogInfo}", dicLogInfo);
            logger.Information("{$dicLogInfo}", dicLogInfo);

            TimeOper(logger, logInfo);

            Console.ReadKey();
        }

        public static async void TimeOper(ILogger logger, LogInfo logInfo)
        {
            using (logger.TimeOperation("Submitting payment for {Index}", logInfo.Index))
            {
                // Timed block of code goes here
                await Task.Delay(50);
                logger.Information("执行日志{Description}", logInfo.Description);
            }

            var opr=logger.BeginOperation("BeginOperation {Index}", logInfo.Index);
            await Task.Delay(50);
            logger.Information("执行日志 BeginOperation {Description}", logInfo.Description);

            opr.Complete();

        }
    }

}

3.7、使用异步,Serilog.Sinks.Async 1.5.0 。Serilog.Sinks.Async 是 Serilog 的一个扩展库,‌它提供了异步日志记录的功能。‌使用这个库,‌你可以将日志消息异步地写入到不同的日志存储中,‌比如文件、‌数据库或远程日志服务等。‌这样做的好处是可以提高应用程序的性能,‌因为日志记录操作不会阻塞主线程。‌

NuGet 安装Serilog.Sinks.Async 1.5.0,如下图。

 示例代码如下。

using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.SystemConsole.Themes;
using SerilogTimings;
using SerilogTimings.Extensions;
using Destructurama;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleAppSerilog
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、输出信息到控制台
            ILogger logger = new LoggerConfiguration()
                .Destructure.UsingAttributes()
                //Async 异步写入控制台
                .WriteTo.Async(a=>a.Console(theme: AnsiConsoleTheme.Code))
                //Async 异步写入文件
                .WriteTo.Async(a=>a.File(@"Log/log.txt",rollingInterval:RollingInterval.Day,rollOnFileSizeLimit:true))//自动创建Log文件夹;rollingInterval:RollingInterval.Day,log文件名后自动添加当天日期
                .Destructure.ByTransforming<LogInfo>(obj=> new{
                    Index = obj.Index,
                    Description = "***"
                })
                
                .CreateLogger();

            logger.Information("信息日志");
            
            var logInfo = new LogInfo
            {
                Index=1,
                Description="日志描述"
            };

            logger.Information("{logInfo}", logInfo);
            logger.Information("{@logInfo}", logInfo);
            logger.Information("{$logInfo}", logInfo);


            logger.Information("-----------------------");

            var dicLogInfo = new Dictionary<string, object>
            {
                {"Index",logInfo.Index },
                {"Description",logInfo.Description },
            };

            logger.Information("{dicLogInfo}", dicLogInfo);
            logger.Information("{@dicLogInfo}", dicLogInfo);
            logger.Information("{$dicLogInfo}", dicLogInfo);

            TimeOper(logger, logInfo);
            
            Log.CloseAndFlush();
            //Log.CloseAndFlush(); 在 Serilog 中是一个非常重要的调用,‌它用于确保所有缓存或排队的日志消息都被正确处理并写入到它们的目标存储中。‌
            //当你的应用程序准备关闭或退出时,‌调用这个方法是一个好习惯,‌因为它可以防止日志消息的丢失。‌

            Console.ReadKey();
        }

        public static async void TimeOper(ILogger logger, LogInfo logInfo)
        {
            using (logger.TimeOperation("Submitting payment for {Index}", logInfo.Index))
            {
                // Timed block of code goes here
                await Task.Delay(50);
                logger.Information("执行日志{Description}", logInfo.Description);
            }

            var opr=logger.BeginOperation("BeginOperation {Index}", logInfo.Index);
            await Task.Delay(50);
            logger.Information("执行日志 BeginOperation {Description}", logInfo.Description);

            opr.Complete();

        }
    }

}

3.8、Log.CloseAndFlush(); 在 Serilog 中是一个非常重要的调用,‌它用于确保所有缓存或排队的日志消息都被正确处理并写入到它们的目标存储中。‌当你的应用程序准备关闭或退出时,‌调用这个方法是一个好习惯,‌因为它可以防止日志消息的丢失。‌

4、示例代码可以在这里下载。https://download.csdn.net/download/xingchengaiwei/89687805

其中的ConsoleAppSerilog项目。


http://www.kler.cn/a/291692.html

相关文章:

  • 精通 Numpy 数组:详解数据类型查看、转换与索引要点
  • Python tkinter写的《电脑装配单》和 Html版 可打印 可导出 excel 文件
  • 西游记战力排名、笔记等
  • Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程
  • 【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例
  • 火山引擎发布数据飞轮 2.0,AI 重塑企业数据消费
  • Unity(2022.3.41LTS) - UI详细介绍-Scrollbar(滚动条)
  • 【华为】测试工程师面试题汇总,你可知道华为的高薪技术岗有多香~
  • 中国航天科工笔试25考什么?如何通过人才测评|附真题库面试攻略
  • 布隆过滤器和布谷鸟过滤器
  • 设计模式 | 单例模式
  • 修改jupyter notebook 默认浏览器(不动配置文件,改系统默认浏览器)
  • Python基础语法(17多线程线程锁单例模式)
  • JS中【普通函数中的this】vs【箭头函数中的this】
  • 【Python控制台小游戏】剑与魔法
  • P3631 [APIO2011] 方格染色
  • 深度学习速通系列:Bert模型vs大型语言模型(LLM)
  • 【前端面试】采用react前后,浏览器-解析渲染UI的变化
  • 解决jupyter notebook启动需要密码的问题
  • Zabbix_Proxy自动化安装脚本
  • 五分钟搭建微信机器人保姆级教程
  • SSG页面加上了 revalidate,是不是就变成了 ISG?
  • WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验
  • python-Flask搭建简易登录界面
  • Java 7.3 - 分布式 id
  • linux——进程