博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Win10手记-为应用集成日志工具Logger
阅读量:6160 次
发布时间:2019-06-21

本文共 4156 字,大约阅读时间需要 13 分钟。

日志工具由来已久,是很受大家欢迎的debug工具。其中.NET平台上很出名的是log4net,但是由于Windows 10通用应用项目没有了System.Configuration引用,所以也就不能很好使用log4net工具了。

Windows Runtime框架大家从它面世以来一直在吐槽,log4net也因为其缺少api不能使用,但是我们仍然可以找到替代方案。Windows.Foundation.Diagnostics命名空间下就提供了一套简单的日志工具,能够正常使用下去。

 

方案

 

根据MSDN查到的信息,Windows Runtime API中的LoggingChannel和logSession类提供了所需的功能,官方也封装了一段示例代码。在此基础上,我又进一步封装了一下:

 

public class LogManager    {        public static void Log(string message)        {            Logger.GetLogger().logChannel.LogMessage(message, LoggingLevel.Information);        }        public static void LogError(string message)        {            Logger.GetLogger().logChannel.LogMessage(message, LoggingLevel.Error);        }        public static void InitiateLogger()        {            Logger.GetLogger().InitiateLogger();            Logger.GetLogger().Deletefile();        }    }    class Logger    {        public LoggingChannel logChannel;        public LoggingSession logSession;        private StorageFolder logUploadFolder;        public const string LOG_SESSION_RESROUCE_NAME = "LogSession";        static private Logger logger;        private const int DAYS_TO_DELETE = 15;        public async void InitiateLogger()        {            logChannel = new LoggingChannel("YSYChannel",null);            logSession = new LoggingSession("YSY Session");            logSession.AddLoggingChannel(logChannel);            await RegisterUnhandledErrorHandler();        }        ///          /// 单例        ///          /// 
static public Logger GetLogger() { if (logger == null) { logger = new Logger(); } return logger; } private async Task RegisterUnhandledErrorHandler() { logUploadFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("MyLogFile", CreationCollisionOption.OpenIfExists); CoreApplication.UnhandledErrorDetected += CoreApplication_UnhandledErrorDetected; } /// /// 处理任何未处理的异常 /// /// /// private async void CoreApplication_UnhandledErrorDetected(object sender, UnhandledErrorDetectedEventArgs e) { try { logChannel.LogMessage("Caught the exception"); e.UnhandledError.Propagate(); } catch (Exception ex) { logChannel.LogMessage($"UnhandledErro: {ex.Message}", ex.Message), LoggingLevel.Critical); //logChannel.LogMessage(string.Format("Effor Message: {0}", ex.Message)); if (logSession != null) { //var filename = DateTime.Now.ToString("yyyyMMdd-HHmmssTzz") + ".etl"; var filename = DateTime.Now.ToString("yyyyMMdd") + ".etl"; var logSaveTast =await logSession .SaveToFileAsync(logUploadFolder, filename); } // throw; } } /// /// 删除之前日期的日志 /// public async void Deletefile() { try { var logFiles = await logUploadFolder.GetFilesAsync(); foreach (var logFile in logFiles) { if ((DateTime.Now - logFile.DateCreated).Days > DAYS_TO_DELETE) { await logFile.DeleteAsync(); } } } catch (Exception ex) { logChannel.LogMessage(ex.Message); } } }

 

使用

 

Logger类采用单例写法,使用之前我们需要先进行初始化。一般我们应当在App.xaml.cs文件中的OnLaunch方法中调用初始化方法,如下:

 

protected override void OnLaunched(LaunchActivatedEventArgs e)        {            //初始化日志工具            LogManager.InitiateLogger();            LogManager.Log("应用启动");        }

 

初始化方法会在应用独立存储目录下创建一个MyLogFile日志文件夹,当日的日志文件将会在此文件夹中创建。

下面代码则会将http错误请求信息写入进此日志文件,以供我们后续处理。

 

catch(Exception ex)            {                LogManager.LogError($"http请求错误:{ex.Message}");            }

 

我们可以在应用独立存储文件夹中看到我们的日志文件,如下:

 

 

双击打开日志文件后,即可在Windows行为分析器中查看详细信息,如下:

 

 

总结

 

以上日志工具为目前可选的方案,同时我们也可很容易自己写一套基于文本输出的日志工具,随着Windows 10的普及,会有更多更好用的框架出现。

 

转载地址:http://bkefa.baihongyu.com/

你可能感兴趣的文章
《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明
查看>>
Summary: Difference between null and empty String
查看>>
2014牡丹江——Hierarchical Notation
查看>>
delphi BLE 后台
查看>>
创建ServiceArea
查看>>
java读properties的通用类,兼容linux和windows
查看>>
[SpringMVC]SpringMVC学习笔记一: springmvc原理及实例解析.
查看>>
Seven times have I despised my soul 《我曾七次鄙视自己的灵魂》
查看>>
PHP的类中的常量,静态变量的问题。
查看>>
Swift 封装
查看>>
js可以控制文件上传的速度吗?
查看>>
深度神经网络入门教程Deep Neural Networks: A Getting Started Tutorial
查看>>
Mathematica颜色系,你喜欢哪一个?
查看>>
laravel的blade模板的布局嵌套
查看>>
通过VS2010性能分析来查找代码中那些地方最损耗资源
查看>>
项目开发相关规范
查看>>
【最大连接数】Linux的文件最大连接数
查看>>
实现WebSocket和WAMP协议的开源库WampSharp
查看>>
通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃
查看>>
BugkuCTF web3
查看>>