Win10手记-为应用集成日志工具Logger
日志工具由来已久,是很受大家欢迎的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 = ; public async void InitiateLogger()
{
logChannel = new LoggingChannel("YSYChannel",null);
logSession = new LoggingSession("YSY Session"); logSession.AddLoggingChannel(logChannel); await RegisterUnhandledErrorHandler();
} /// <summary>
/// 单例
/// </summary>
/// <returns></returns>
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; } /// <summary>
/// 处理任何未处理的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
} /// <summary>
/// 删除之前日期的日志
/// </summary> 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的普及,会有更多更好用的框架出现。
Win10手记-为应用集成日志工具Logger的更多相关文章
- Win10手记-为应用集成SQLite(一)
SQLite是什么?熟悉移动端开发的朋友都会经常接触,无论是iOS的CoreData还是安卓的内置数据库,他们都是采用了SQLite这个轻量高效数据库,微信也是如此.可以说SQLite是目前移动端最为 ...
- Win10手记-为应用集成SQLite(二)
接上篇内容,这里给大家分享我的辅助访问类,采用了异步方法,封装了常用的访问操作,一些操作还是纯CLI的. SQLiteDBManager using System; using System.Coll ...
- Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- SAP ABAP RFC接口通用日志工具:abap fm logger
很早之前就想写个能记录函数模块日志的通用工具,最早尝试时,没有想清楚插入代码的体积问题.在一些群友的提醒下,了解到可以用宏来处理这一问题.不过当时比较忙,就没有动笔.最近又想起这件事,花了2天完成了一 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- Java主流日志工具库
在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...
- 权限管理系统之项目框架搭建并集成日志、mybatis和分页
前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据. 一.项目框架 首先要解决的是项目框架问题,搭建什么样的 ...
- SpringBoot学习笔记(五):SpringBoot集成lombok工具、SpringBoot集成Shiro安全框架
SpringBoot集成lombok工具 什么是lombok? 自动生成setget方法,构造函数,打印日志 官网:http://projectlombok.org/features/index. 平 ...
随机推荐
- Linux Oracle安装
lsnrctl status // 查看linux系统oracle的监听状态lsnrctl start // 启动linux系统oracle的监听状态 sqlplus /nolog // 连接 ...
- java学习笔记(五):公共类
什么是公共类,公共类就是和源文件名同名的类,举例来说:类的名称是 public class aaa{},那么源文件就应该是 aaa.java. 每个源文件中只能有一个公共类. 每个源文件可以有很多非公 ...
- Js学习(7)标准库-object对象
Js原生提供Object对象,O大写,所有的其他对象都继承自Object对象,都是Object的实例 Object对象的原生方法分为两类: 本身的方法:直接定义在Object对象的方法 实例方法:定义 ...
- 百度地图sdk sha1秘钥获取有种想吐的赶脚
撸代码坐的腰算背疼还只是弄一个不是项目里边需要的升级版本的so 日 需要sha1 指纹秘钥,还有项目包, 才能用百度地图sdk 这个找sha1 获取废了20分钟, 显示全盘找keytool.exe ...
- BeanUtils.copyProperties的简单示例
一.新建测试实体 1.UserA package com.dechy.hebswj.test; public class UserA { private String a; private Strin ...
- 设计模式之桥接模式 c++11
参考http://blog.csdn.net/calmreason/article/details/50909321 桥接模式 实现与抽象之间由指针关联 调用sample类 实际是调用sample类保 ...
- 搭建django
虚拟环境配置 pip install virtualenv 一般需要安装一个管理工具:pip install virtualenvwrapper-win 只有它可以使用workon 创建虚拟环境:mk ...
- 《C#从现象到本质》读书笔记(四)第4章C#和面向对象
<C#从现象到本质>读书笔记第4章C#和面向对象 面向对象程序设计OOP 面向对象的三大特性是: 1)封装:类可以将它的成员私有化,只暴露它认为应当暴露给外界的成员.通过私有化成员,外界不 ...
- Linux下配置yum
[一]用本地文件创建本地yum源 1. 创建iso存放目录和挂载目录 mkdir /mnt/iso mkdir /mnt/cdrom 2. 将iso镜像文件上传到/mnt/iso文件夹下 3. 将/m ...
- leetcode记录
2019 1月31: 141交叉链表, 2月: 2/1: 160环形链表 , 思路记得,但是指针里面逻辑搞错,这里不是用快慢指针而是同时的指针.:复习了141题还是有问题,把 ...