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將日志滾動到底部;

注意:MouseEnterMouseLeave兩事件的響應原因:查看日志時,防止日志自動滾動到底部;

        <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;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSM32RV003:國產高精度16位ADC低功耗RISC-V內核MCU

目錄 高精度ADC工業應用工業數據采集應用CSM32RV003簡介主要特性 高精度ADC工業應用 高精度ADC即高精度模數轉換器&#xff0c;是一種能夠將輸入模擬信號轉換為數字信號的芯片&#xff0c;在多種消費電子、工業、醫療和科研領域都有廣泛應用。高精度ADC的主要特點是能夠提供高…

深度學習圖像修復算法 - opencv python 機器視覺 計算機競賽

文章目錄 0 前言2 什么是圖像內容填充修復3 原理分析3.1 第一步&#xff1a;將圖像理解為一個概率分布的樣本3.2 補全圖像 3.3 快速生成假圖像3.4 生成對抗網絡(Generative Adversarial Net, GAN) 的架構3.5 使用G(z)生成偽圖像 4 在Tensorflow上構建DCGANs最后 0 前言 &#…

前端 HTML 的 DOM 事件相關知識有哪些?

HTML 的 DOM 事件是指在網頁上發生的各種事件&#xff0c;如點擊、鼠標移動、鍵盤輸入等。 通過 JavaScript 腳本可以對這些事件進行監聽和處理&#xff0c;以實現交互效果。以下是一些常見的 DOM 事件及其相關知識點&#xff1a; 1、click&#xff1a;點擊事件&#xff0c;在…

vue3引入vuex基礎

一&#xff1a;前言 使用 vuex 可以方便我們對數據的統一化管理&#xff0c;便于各組件間數據的傳遞&#xff0c;定義一個全局對象&#xff0c;在多組件之間進行維護更新。因此&#xff0c;vuex 是在項目開發中很重要的一個部分。接下來讓我們一起來看看如何使用 vuex 吧&#…

linux文件I/O:文件鎖的概念、函數以及代碼實現

文件鎖是一種用來保證多個進程對同一個文件的安全訪問的機制。文件鎖可以分為兩種類型&#xff1a;建議性鎖和強制性鎖。建議性鎖是一種協作式的鎖&#xff0c;它只有在所有參與的進程都遵守鎖的規則時才有效。強制性鎖是一種強制式的鎖&#xff0c;它由內核或文件系統來強制執…

使用Pytorch從零開始構建RNN

在這篇文章中&#xff0c;我們將了解 RNN&#xff08;即循環神經網絡&#xff09;&#xff0c;并嘗試通過 PyTorch 從頭開始??實現其中的部分內容。是的&#xff0c;這并不完全是從頭開始&#xff0c;因為我們仍然依賴 PyTorch autograd 來計算梯度并實現反向傳播&#xff0c…

Apache訪問控制

服務器相關的訪問控制 Options指令 Options指令是Apache服務器配置文件中的一個重要指令,它可以用于控制特定目錄啟用哪些服務器特性。Options指令可以在Apache服務器的核心配置、虛擬主機配置、特定目錄配置以及.htaccess文件中使用。 以下是一些常用的服務器特性選項: N…

Django(九、cookie與session)

文章目錄 一、cookie與session的介紹HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登錄功能 一、cookie與session的介紹 在講之前我們先來回憶一下HTTP的四大特性 HTTP四大特性 1.基于請求響應 2.基于TIC、IP作用于應用層上的協議 3.無狀態 保存…

二叉查找(排序)樹你需要了解一下

簡介 二叉排序樹&#xff08;Binary Sort Tree&#xff09;&#xff0c;又稱二叉查找樹&#xff08;Binary Search Tree&#xff09;&#xff0c;亦稱二叉搜索樹&#xff0c;是一種重要的數據結構。 它有以下特性&#xff1a; 若左子樹不空&#xff0c;則左子樹上所有結點的…

目標檢測YOLO系列從入門到精通技術詳解100篇-【圖像處理】目標檢測

目錄 幾個高頻面試題目 如何在超大分辨率的圖片中檢測目標? 1當超大分辨率圖像邂逅目標檢測任務 2You Only Look Twice

邊緣計算多角色智能計量插座 x 資產顯示標簽:實現資產追蹤與能耗管理的無縫結合

越來越多智慧園區、智慧工廠、智慧醫院、智慧商業、智慧倉儲物流等企業商家對精細化、多元化智能生態應用場景的提升&#xff0c;順應國家節能減排、環保的時代潮流&#xff0c;設計一款基于融合以太網/WiFi/藍牙智能控制的智能多角色插座應運而生&#xff0c;賦予智能插座以遙…

大數據學習(23)-hive on mapreduce對比hive on spark

&&大數據學習&& &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 承認自己的無知&#xff0c;乃是開啟智慧的大門 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主哦&#x1f91…

uniapp實現表單彈窗

uni.showModal({title: 刪除賬戶,confirmColor:#3A3A3A,cancelColor:#999999,confirmText:確定,editable:true,//顯示content:請輸入“delete”刪除賬戶,success: function (res) {console.log(res)if(res.confirm){if(res.contentdelete){console.log(123123123213)uni.setSto…

PCIE鏈路訓練-狀態跳轉1

A&#xff1a;12ms超時&#xff0c;或者再任何lane上檢測到Electrical Idle Exit&#xff1b; B&#xff1a; 1.發送“receiver detection”之后沒有一個lane的接收邏輯被rx檢測到 2.不滿足條件c&#xff0c;比如兩次detection出現差別&#xff1b; C&#xff1a;發送端在沒…

凸優化基礎與應用

諸神緘默不語-個人CSDN博文目錄 文章目錄 1. 線性規劃用SciPy求解 2. 二次規劃3. 半定規劃4. 錐規劃 凸優化是數學優化的一個重要分支&#xff0c;廣泛應用于各種工程和科學領域。它的核心特征在于優化問題的目標函數和約束條件是凸的&#xff0c;這使得找到全局最優解變得可行…

Ps:背景橡皮擦工具摳圖實例

背景橡皮擦工具 Background Eraser Tool由于是一個破壞性的工具&#xff08;直接刪除像素&#xff09;而少被人使用。 其實&#xff0c;它不僅是一個功能強大的摳圖工具&#xff0c;也是可以轉換為非破壞性運用的。 原圖&#xff08;注&#xff1a;圖片來自網絡&#xff09; 效…

微軟離Altman越近,離OpenAI就越遠!

大數據產業創新服務媒體 ——聚焦數據 改變商業 在OpenAI這場連續劇中&#xff08;之所以說是連續劇&#xff0c;這個事情肯定沒完&#xff0c;后面肯定還會出續集&#xff09;&#xff0c;讓我倍感意外的是&#xff0c;Altman剛跟OpenAI分手&#xff0c;“離婚手續”都還沒辦…

使用Pytorch從零開始構建WGAN

引言 在考慮生成對抗網絡的文獻時&#xff0c;Wasserstein GAN 因其與傳統 GAN 相比的訓練穩定性而成為關鍵概念之一。在本文中&#xff0c;我將介紹基于梯度懲罰的 WGAN 的概念。文章的結構安排如下&#xff1a; WGAN 背后的直覺&#xff1b;GAN 和 WGAN 的比較&#xff1b;…

selenium新版使用find_element/find_elements函數鎖定元素(替換原有find_element_by_xx)

css選擇器請參考&#xff1a;網絡爬蟲之css選擇器 原來的find_element_by_xx都被修改為find_element&#xff08;返回匹配到的第一個元素&#xff09;或find_elements&#xff08;返回全部的匹配元素&#xff09; from selenium.webdriver.common.by import By示例程序 選擇…

【Q3——30min】

1、介紹一下數據庫的三大范式 第一范式(1NF)&#xff1a;屬性不可分割&#xff0c;即每個屬性都是不可分割的原子項。(實體的屬性即表中的列) 第二范式(2NF)&#xff1a;滿足第一范式&#xff1b;且不存在部分依賴&#xff0c;即非主屬性必須完全依賴于主屬性。(主屬性即主鍵&a…