C#Wpf关于日志的相关功能扩展
目录
一、日志Sink(接收器)
二、Trace追踪实现日志
三、日志滚动
一、日志Sink(接收器)
安装NuGet包:Serilog
Sink有很多种,这里介绍两种:
Console接收器(安装Serilog.Sinks.Console);
File接收器(安装Serilog.Sinks.File);
MinimumLevel:最小记录级别
rollingInterval:生成日志文件周期
outputTemplate:输出日志模板
继承ILogEventSink接口实现 Emit:当Sink器接收到新日志时触发
通过该接口将接收器接收的日志添加进内部日志集合
将该接口实现类实例化对象通过WriteTo.Sink(myEventSink)与Logger绑定
实现 ILogEventSink接口示例:
public List<string> Logs = new List<string>();private readonly ITextFormatter _formatter=new MessageTemplateTextFormatter("Message:{Message} [{Level}] Location:{FilePath}[{LineNumber}]");public void Emit(LogEvent logEvent){if (logEvent != null){var textWriter=new StringWriter();_formatter.Format(logEvent, textWriter);Logs.Add(textWriter.ToString());}}
Main程序:
MyEventSink myEventSink = new MyEventSink();string path = "Logs\\Error\\.txt";string outputTemplate = "{NewLine}Date: {Timestamp:yyyy-MM-dd HH:mm:ss.fff}\tLevel: {Level}\tCallName: {SourceContext}->{MemberName}"+ "{NewLine}Path: {FilePath}[{LineNumber}]"+ "{NewLine}Message: {Message}";Log.Logger = new LoggerConfiguration().Enrich.FromLogContext()//记录相关上下文信息.MinimumLevel.Debug().WriteTo.Sink(myEventSink).WriteTo.Logger(log => log.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.File(path, rollingInterval: RollingInterval.Day, outputTemplate: outputTemplate)).WriteTo.Console().CreateLogger();Log.Warning("*****************Warning***************");Log.Logger.Information("*******************Info****************");Log.Logger.CallError<Test>("#####################Error##################");foreach (string str in myEventSink.Logs){Console.WriteLine(str);}
static class LogExtension{public static void CallError<T>(this ILogger logger, string message,[CallerMemberName] string meberName = "",[CallerFilePath] string filepath = "",[CallerLineNumber] int lineNum = 0)=> logger.ForContext<T>().ForContext("MemberName", meberName).ForContext("FilePath", filepath).ForContext("LineNumber", lineNum).Error(message);public static void CallError<T>(this ILogger logger, Exception e, string message,[CallerMemberName] string meberName = "",[CallerFilePath] string filepath = "",[CallerLineNumber] int lineNum = 0)=> logger.ForContext<T>().ForContext("MemberName", meberName).ForContext("FilePath", filepath).ForContext("LineNumber", lineNum).Error(e, message);}
二、Trace追踪实现日志
继承抽象类TraceListener,重写方法TraceEvent
注意:添加监听对象Trace.Listeners.Add(this);
public override void TraceEvent(TraceEventCache? eventCache, string source, TraceEventType eventType, int id, string? message){switch (eventType){case TraceEventType.Error:Log.Logger.CallError<MyTraceListen>(message);break;case TraceEventType.Warning:Log.Logger.Warning(message);break;case TraceEventType.Information:Log.Logger.Information(message);break;default:break;}}
三、日志滚动
通过ObservableCollection类的CollectionChanged事件实现日志自动滚动到底部:
集合改变触发事件,更改附加属性AutoScroll值,值更改触发CallBack将日志滚动到底部;
注意:MouseEnter与MouseLeave两事件的响应原因:查看日志时,防止日志自动滚动到底部;
<DataGrid attach:ScrollHelper.AutoScroll="{Binding AutoScroll}"AutoGenerateColumns="False"CanUserAddRows="False"CanUserDeleteRows="False"CanUserReorderColumns="False"CanUserResizeColumns="False"CanUserResizeRows="False"CanUserSortColumns="False"ItemsSource="{Binding LogService.Logs}"><i:Interaction.Triggers><i:EventTrigger EventName="MouseEnter"><i:InvokeCommandAction Command="{Binding MouseEnterCommand}" /></i:EventTrigger><i:EventTrigger EventName="MouseLeave"><i:InvokeCommandAction Command="{Binding MouseLeaveCommand}" /></i:EventTrigger></i:Interaction.Triggers><DataGrid.Columns><DataGridTextColumn Binding="{Binding Time}" Header="时间" /><DataGridTextColumn Binding="{Binding Lev}" Header="级别" /><DataGridTextColumn Binding="{Binding Message}" Header="信息"><DataGridTextColumn.ElementStyle><Style><Setter Property="TextBlock.TextWrapping" Value="Wrap" /><Setter Property="TextBlock.TextAlignment" Value="Left" /></Style></DataGridTextColumn.ElementStyle></DataGridTextColumn></DataGrid.Columns><DataGrid.RowStyle><Style TargetType="DataGridRow" BasedOn="{StaticResource DataGridRowStyle}"><Style.Triggers><DataTrigger Binding="{Binding Lev}" Value="Error"><Setter Property="Foreground" Value="Red"/></DataTrigger><DataTrigger Binding="{Binding Lev}" Value="Warn"><Setter Property="Foreground" Value="Orange"/></DataTrigger></Style.Triggers></Style></DataGrid.RowStyle></DataGrid>
public LogService LogService { get; set; }=LogService.GetInstance();private bool _autoScroll;public bool AutoScroll{get { return _autoScroll; }set => SetProperty(ref _autoScroll, value);}[RelayCommand]public void MouseEnter(){LogService._logs.CollectionChanged -= Scroll;}[RelayCommand]public void MouseLeave(){LogService._logs.CollectionChanged += Scroll;}private void Scroll(object sender, NotifyCollectionChangedEventArgs e){AutoScroll = !AutoScroll;}public MainWinViewModel(){LogService.OpenListen();LogService._logs.CollectionChanged += Scroll;}
相关文章:
C#Wpf关于日志的相关功能扩展
目录 一、日志Sink(接收器) 二、Trace追踪实现日志 三、日志滚动 一、日志Sink(接收器) 安装NuGet包:Serilog Sink有很多种,这里介绍两种: Console接收器(安装Serilog.Sinks.Console); File接收器(安装…...
亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight
目录 Amazon QuickSight简介 Amazon QuickSight的独特之处 Amazon QuickSight注册 Amazon QuickSight使用 Redshift和Amazon QuickSightt平台构建数据可视化应用程序 构建数据仓库 数据可视化 Amazon QuickSight简介 亚马逊QuickSight是一项可用于交付的云级商业智能 (BI…...
MySQL安全性:用户认证、防范SQL注入和SSL/TLS配置详解
MySQL作为广泛使用的关系型数据库管理系统,安全性至关重要。在本篇技术博客中,我们将深入探讨MySQL的用户认证方式、防范SQL注入攻击的方法以及SSL/TLS加密的配置。 1. MySQL用户认证方式 MySQL支持多种用户认证方式,其中两种常见方式是cac…...
EMG肌肉信号处理合集 (一)
本文归纳了常见的肌肉信号预处理流程,方便EMG信号的后续分析。使用pyemgpipeline库 来进行信号的处理。文中使用了 UC Irvine 数据库的下肢数据。 目录 1 使用wrappers 定义数据类,来进行后续的操作 2 肌电信号DC偏置去除 3 带通滤波器处理 4 对肌电…...
学自动化测试?我劝你还是算了吧。。。
本人7年测试经验,在学测试之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说:自学软件测试,一般人我还是劝你算了吧?因为我就是那个一般人! 软件测试基础真的很简单&…...
第一百七十八回 介绍一个三方包组件:SlideSwitch
文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何创建垂直方向的Switch"相关的内容,本章回中将 介绍SlideSwitch组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们…...
Windows任务管理器内存性能界面各个参数含义
任务管理器的内存性能界面提供了一些关键参数,这些参数可以帮助你了解系统中内存的使用情况。以下是一些常见的参数及其含义: 已提交(Committed): 表示已分配的物理内存和虚拟内存的总和。已提交的内存包括当前正在使…...
深度学习人脸表情识别算法 - opencv python 机器视觉 计算机竞赛
文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系…...
全职RISC-V芯片D1开发板使用adb串口COM连接设备和文件上传下载
将两个USB端口都连接到工作电脑 推荐使用ADB工具访问开发板,下载连接如下: Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本:https://dl.google.com/android/repository/pla…...
STM32笔记---RTC
目录 一、RTC简介 二、主要特性 三、功能描述 3.1 读RTC寄存器 3.2 配置RTC寄存器 四、BKP简介 五、RTC_Init() 1. 函数BKP_ReadBackupRegister 2.RCC_LSEConfig设置外部低速晶振(LSE) 3.RTC基本结构 5.RTC_Init()实现 6.time.h 一、R…...
C语言之strstr函数的使用和模拟实现
C语言之strstr函数的模拟实现 文章目录 C语言之strstr函数的模拟实现1. strstr函数的介绍2. strstr函数的使用3. strstr的模拟实现3.1 实现思路3.2 实现代码 1. strstr函数的介绍 函数声明如下: char * strstr ( const char * str1, const char * str2 ); strs…...
【间歇振荡器2片555时基仿真】2022-9-24
缘由multisim出现这个应该怎么解决吖,急需解决-嵌入式-CSDN问答 输出一定要有电阻分压才能前后连接控制否则一定报错。...
MySQL与PostgreSQL 的一些SQL
MySQL 1、MYSQL输出重定向 将SQL内容输出到文件 nohup mysql -h127.0.0.1 -uroot -ppassword -Ne "sql语句;" > /home/mysql/data/xxxxx.txt &2、时间格式转换 时间转换,转10位时间戳 select UNIX_TIMESTAMP(2021-02-27 00:00:00)SELECT …...
Spring 七大组件
文章目录 Spring 七大组件 Spring 七大组件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式…...
【UGUI】实现跑酷游戏分数血量显示在UI中
//1.实现让玩家的金币分数显示在UI文本中 2.让血量和滑动条关联起来 这一节课主要学会获取组件并改变属性,举一反三! using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro;//1.实现让玩…...
Vue和React对比
Vue和React都是流行的前端JavaScript框架,它们有很多相似点和不同点,以下是它们的优缺点。 相似点: 都使用了组件化的开发模式,使得应用程序更易于理解和维护。都支持虚拟DOM,提高了页面重绘性能。都支持模板化编程方…...
iPhone的实时照片不能直接查看,但有不少替代方法可以查看
苹果在iPhone 6s和iPhone 6s Plus上推出了实时照片(livp)功能,该功能也出现在最新的iPhone中。正如你所知,实时照片功能是电影和静态图像的混合。也就是说,实时照片既不是照片也不是视频。 当你在iPhone上拍摄实时照片时,iOS会创建一个MOV文件和一个JPEG文件。 如果你…...
弹窗msvcp140_1.dll丢失的解决方法,超简单的方法分享
在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是缺少某个文件的错误。最近,我在使用某些软件时,遇到了一个名为“msvcp140_1.dll”的错误提示。这个错误通常出现在运行某些程序时,由于缺少了msvcp140…...
人工智能基础_机器学习047_用逻辑回归实现二分类以上的多分类_手写代码实现逻辑回归OVR概率计算---人工智能工作笔记0087
然后我们再来看一下如何我们自己使用代码实现逻辑回归的,对二分类以上,比如三分类的概率计算 我们还是使用莺尾花数据 首先我们把公式写出来 def sigmoid(z): 定义出来这个函数 可以看看到这需要我们理解OVR是如何进行多分类的,我们先来看这个 OVR分类器 思想 OVR(One-vs-…...
Interactive Visual Data Analysis
Words&Contents Home | Interactive Visual Data Analysis Book Outline 这本书对视觉、互动和分析方法进行了系统而全面的概述,作为数据可视化方面比较好的读物; 目录 Words&Contents Book Outline (一)Introduct…...
日志丢失、格式混乱、排查耗时>2小时?27天重构Docker日志架构,实现100%可追溯、零盲区监控
第一章:Docker日志架构重构的痛点与目标在大规模容器化生产环境中,Docker默认的日志驱动(json-file)暴露出显著瓶颈:日志文件无自动轮转、磁盘空间不可控、多容器日志检索低效、缺乏结构化字段支持,且无法与…...
如何部署Hermes Agent/OpenClaw?2026年阿里云及Coding Plan配置详细流程
如何部署Hermes Agent/OpenClaw?2026年阿里云及Coding Plan配置详细流程。OpenClaw(前身为Clawdbot/Moltbot)作为开源、本地优先的AI助理框架,凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力,成为个人办…...
Linux内核开发避坑指南:waitqueue的四种状态(TASK_INTERRUPTIBLE/UNINTERRUPTIBLE等)到底该怎么选?
Linux内核开发实战:waitqueue状态选择的黄金法则与避坑指南 在Linux内核开发中,waitqueue(等待队列)是驱动开发者最常使用的同步机制之一。当我们需要让进程等待某个硬件事件(如数据就绪)或资源可用时&…...
告别龟速!手把手教你给Termux换清华源,pkg update飞起来
告别龟速!手把手教你给Termux换清华源,pkg update飞起来 每次在Termux里执行pkg update时,看着那缓慢的进度条一点点往前挪,是不是感觉时间仿佛被拉长了?作为Android上最强大的终端模拟器,Termux的官方源服…...
如何快速配置Wand-Enhancer:WeMod客户端终极增强工具使用指南
如何快速配置Wand-Enhancer:WeMod客户端终极增强工具使用指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand-Enhancer是一款专为WeMod…...
抖音批量下载工具:从零开始构建高效视频收集工作流
抖音批量下载工具:从零开始构建高效视频收集工作流 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...
别再折腾环境变量了!手把手教你用VS2019自带的Python环境一键安装pandas
VS2019内置Python环境极简指南:零配置玩转数据分析 作为.NET或C开发者,当你第一次尝试在Visual Studio 2019中使用Python时,是否曾被环境变量配置、包安装失败等问题困扰?其实,VS2019早已内置了完整的Python开发工具链…...
避坑指南:STM32 HAL库与标准库下CAN通信配置的10个常见错误(基于STM32F405实测)
STM32 CAN通信实战避坑指南:HAL库与标准库配置差异全解析 在工业控制和汽车电子领域,CAN总线因其高可靠性和实时性成为首选通信方案。STM32系列MCU内置的bxCAN控制器为开发者提供了便捷的实现路径,但不同库函数(HAL与标准库&#…...
星穹铁道跃迁记录导出工具:终极免费数据分析指南 [特殊字符]
星穹铁道跃迁记录导出工具:终极免费数据分析指南 🚀 【免费下载链接】star-rail-warp-export Honkai: Star Rail Warp History Exporter 项目地址: https://gitcode.com/gh_mirrors/st/star-rail-warp-export 你是否想知道自己在《崩坏࿱…...
传统微波IDU与数字IP微波ODU扩展单元(数字微波IDU)技术对比分析
随着半导体技术的飞速迭代,数字微波通信设备的设计架构实现了从分体式到全室外集成式的跨越式发展,核心组件的功能定位与应用场景也随之发生深刻变革。早期传统数字微波ODU(室外单元)采用IDU(室内单元)与OD…...
