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

news2024/9/25 13:20:40

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.coloradmin.cn/o/2083948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能学习辅助系统——后端部分

目录 前言 一、准备工作 1.需求&环境搭建 1.1需求说明 1.2环境搭建 2.开发规范 2.1 开发规范-REST 2.2 开发规范-统一响应结果 3.开发流程 二、部门管理 1.查询部门 &#xff08;1&#xff09;原型和需求 &#xff08;2&#xff09;接口文档 &#xff08;3&…

阿里巴巴1688 阿里228滑块 网站分析(不涉及逆向)

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

R语言统计分析——回归模型深层次分析

参考资料&#xff1a;R语言实战【第2版】 本文主要讨论回归模型的泛化能力和变量相对重要性的方法。 1、交叉验证 从定义上看&#xff0c;回归方法就是从一堆数据中获取最优模型参数。对于OLS&#xff08;普通最小二乘&#xff09;回归&#xff0c;通过使得预测误差&#xff0…

【书生大模型实战营(暑假场)】进阶任务六 MindSearch CPU-only 版部署

进阶任务六 MindSearch CPU-only 版部署 任务文档GitHub CodeSpace硅基流动HuggingFace Space 任务&#xff1a; MindSearch 部署到Github Codespace 和 Hugging Face Space 笔者部署在 HuggingFace 的 MindSearch 模型链接为&#xff1a;ccdgyro/MindSearch 1 开发机创建和环…

重塑视频监控体验:WebRTC技术如何赋能智慧工厂视频高效管理场景

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。 EasyCVR平台不仅兼容多种主流标准协议及私有协议/SDK的接入&#xff08;如&…

汽车线束品牌服务商推荐-力可欣:致力于汽车连接线束和汽车连接器的开发、生产和应用

汽车线束品牌服务商推荐-力可欣&#xff1a;致力于汽车连接线束和汽车连接器的开发、生产和应用

医院建筑的电气设计——保障医疗质量与安全的坚固基石

医疗资源与水平的提升成为了衡量民生福祉的重要标尺。随着一批批新建医院及既有医院的华丽蜕变&#xff0c;从社区医院到综合医院&#xff0c;再到医疗城、医疗集聚区的崛起&#xff0c;不仅彰显了政府对民生健康的深切关怀&#xff0c;也预示着我国医疗体系正迈向智能化、高效…

C++初学(17)

17.1、字符函数库cctype C有一个与字符相关的、非常方便的函数软件包&#xff0c;它可以简化如确定字符是否为大写字母、数字或标点符号等工作。这些函数的原型是在头文件cctype中定义的。如果ch是一个字母&#xff0c;则isalpha(ch)函数返回一个非零值&#xff0c;否则返回0。…

关于zotero无法识别拖入的pdf和caj的题录信息

一、首先要安装好茉莉花插件 1、点击链接&#xff0c;进入Zotero 插件商店&#xff0c; Zotero 插件商店 | Zotero 中文社区 (zotero-chinese.com) 搜索&#xff1a;Jasminum&#xff0c;选择好版本&#xff0c;点击下载 2、 下载好后&#xff0c;点击“工具”&#xff0c;…

兔子序列(c语言)

1.//描述 //兔子发现了一个数字序列&#xff0c;于是开始研究这个序列。兔子觉得一个序列应该需要有一个命名&#xff0c; // 命名应该要与这个序列有关。由于兔子十分讨厌完全平方数&#xff0c; // 所以兔子开创了一个新的命名方式&#xff1a;这个序列中最大的不是完全平方数…

kubectl陈述式资源管理

目录 概念 kubectl的基础命令 *每天常用的查看集群的基本信息 deployment的部署方式 deployment 的特点 基于deployment创建pod 手动缩容 service的类型以及工作原理 创建service service的类型 修改service的类型为nodeport **nodeport实验&#xff1a;对外暴露端…

数据结构(Java)实现:栈和队列

文章目录 1. 栈的模拟实现1.1 普通栈的模拟实现1.2 泛型栈的模拟实现 2. 栈的介绍3. 栈的使用4. 栈的应用场景4.1 改变元素的序列4.2 将递归转换为循环4.3 使用栈解题 5. 栈的链表实现6. 队列概念7. 队列的使用8. 模拟队列的实现8.1 链式队列8.2 顺序队列 9. 双端队列 1. 栈的模…

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图 1、本节实现的内容 上一节我们讨论了纹理贴图的相关基础操作,但上一节的纹理贴图操作基本上都是规则图形,包括圆形和球形虽然复杂一点,但是它也是规则的。这一节课我们要讨论一下,怎么在不规则图形上纹理贴图…

​polarctf靶场[web]upload1​

[web]upload1 考点&#xff1a;文件上传漏洞 不信邪&#xff0c;先上传php&#xff0c;发现被拦截 在上传jpg和png图片&#xff0c;发现也被拦截 所以先拦截抓包&#xff0c;上传个有一句话木马的png图片 将文件后缀改为php&#xff0c;先在重发器发送&#xff0c;发现上传成…

MATLAB 计算凹凸多边形的面积(85)

MATLAB 计算凹凸多边形的面积(84) 一、算法介绍二、算法实现1.代码一、算法介绍 计算凹凸多边形的面积,并输出计算结果,可视化 二、算法实现 1.代码 % 设置多边形的顶点坐标 % 这里以一个五边形为例 x = [1, 3, 4

深入理解DPO(Direct Preference Optimization)算法

目录 1. 什么是DPO&#xff1f;2. Bradley-Terry模型2.1 奖励模型的训练 3. 从PPO到DPO4. DPO的简单实现5. 梯度分析Ref 1. 什么是DPO&#xff1f; 直接偏好优化&#xff08;Direct Preference Optimization, DPO&#xff09;是一种不需要强化学习的对齐算法。由于去除了复杂的…

数分基础(03-2)客户特征分析-简单可视化

文章目录 简单可视化1. 并排柱状图2. 堆叠柱状图2.1 画图2.2 对数刻度 简单可视化 接上一篇 数分基础&#xff08;03-1&#xff09;客户特征分析&#xff0c;运行本篇代码之前&#xff0c;先运行上一篇的代码。 为了能够对比和总览三个客户群体Cluster 0 - Cluster 1 的特征&…

冯·诺依曼计算机:现代计算机的“DNA”

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

XSS LABS - Level 16 过关思路

关注这个靶场的其他相关笔记&#xff1a;XSS - LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 进入靶场&#xff0c;右击页面&#xff0c;查看网页源码&#xff0c;搜索关键词 test 查看页面回显点&#xff1a; 页面只有一个回显点&#xff0c;跟前面关卡不同&am…

Python实时聊天室架构与API实战应用

尊敬的各位读者&#xff0c;欢迎参与本次共享研讨项目——利用Python构建实时聊天室。在本项目中&#xff0c;我们将引进一款前沿工具——发布订阅频道API&#xff0c;以实现聊天室内的实时交互功能。 在当今信息泛滥的社会环境下&#xff0c;实时交流已成为人们日常生活中不可…