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 = 15;

        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的普及,会有更多更好用的框架出现。

时间: 2024-11-07 07:03:28

Win10手记-为应用集成日志工具Logger的相关文章

转 JDK自带日志工具Logger的研究使用

之前写过一篇也是使用jdk自带的日志,本文为借鉴别人的另一种方法,我是java共享者,共创java未来!! 关于Logger最近放假在家无聊,研究一个开源框架时发现它频繁运用到了一个叫Logger的相关类来进行日志记录,作为log4j的忠实粉丝,在大多数项目上都看到的是log4j和commons-logging,这个Logger为何物?点开源码看,才发现是JDK自带的日志类,非第三方开源Jar包,于是便起了好奇之心,想看看这个Logger与log4j和commons-logging有何不同,翻了

Win10手记-为应用集成SQLite(二)

接上篇内容,这里给大家分享我的辅助访问类,采用了异步方法,封装了常用的访问操作,一些操作还是纯CLI的. SQLiteDBManager using System; using System.Collections.Generic; using System.Collections; using System.Threading.Tasks; using SQLite.Net; using SQLite.Net.Async; using Windows.Storage; using System

日志工具 CSharp Logger

CSharp Logger是apache继log4net项目后设计的又一个日志工具.它用来向Windows的事件日志写入debug.info.warn和error四个等级的信息. http://csharp-logger.sourceforge.net/

.NET日志工具选型

什么是日志(logging)和跟踪(tracing)? 日志(有时候也称为跟踪)是以为调试和测试为目的被用来记录关于程序执行信息.开发人员.测试人员和支持工程师经常使用日志和跟踪技术识别软件问题,为了进行部署后的调试.监控在线生产系统和审计. 测试通常包括写文本消息到日志文件或将数据发送到监控应用.先进和现代的测试工具也支持复杂的数据结构,记录调用堆栈.线程行为,也支持通过网络或本地计算机上的应用程序进行实时监控. .NET日志和跟踪工具 C# Logger C# Logger是支持发送事件和消

日志工具

 日志工具对象logger应声明为private static final 1.声明为private是出于安全性考虑,防止logger对象被其他类非法使用 2.声明为static是为了防止重复new出logger对象,造成资源的浪费,同时防止logger被序列化,造成安全风险:(lib库设计除外) 3.声明为final是因为在类的生命周期内无需变更logger;  日志应分等级 说明:如果日志不分等级,则定位问题时,无法快速有效屏蔽大量低级别信息,给快速定位带来难度.日志可分为以下级别:debu

7种流行PHP集成开发工具(IDE)的比较

本文发掘集成开发环境(IDE)的所有用途,并比较 7 种流行的 IDE 的成本和优势. 编写关于 php 的系列文章让我更加深刻地了解了 PHP 开发人员的世界.我和许多 PHP程序员交谈过,最令我惊奇的是只有很少的人使用 IDE.大多数程序员使用文本编辑器,比如 Microsoft Windows 上的记事本.Emacs 或者 Vim. 我提到的这些文本编辑器(以及我没提到)都是很不错的 -- 我不想讨论哪个编辑器更好.但是,我要强调的是不使用文本编辑器会使您对 PHP 代码有更深的见解.几乎

Log4j 日志工具demo以及配置文件实例

在项目中产生日志是一个项目所必须的,现在用的比较广泛,比较流行的日志工具 就有 log4j :这个日志工具其实使用起来是很方便的:在使用的时候创建什么的都和java.util.logging.Logger一样的,而jdk的log日志信息的获取和导出是使用Handler 对象,而导出的信息的格式是通过Formatter对象来定义的而log4j的日志信息导入,以及格式是在配置文件中进行配置的.具体看下面: 1. 导入需要的架包:(1).log4j.jar  (2).commons-pool.jar

【工具推荐】ELMAH——可插拔错误日志工具

ELMAH 是 Error Logging Modules and Handlers for ASP.NET 的缩写.ELMAH可以让你记录下你的网站发生的任何一个错误,在将来,你可以重新检查这些错误.你可以从ELMAH项目的官方网站免费下载ELMAH:http://code.google.com/p/elmah/. ELMAH既支持ASP.NET Web Forms 又支持 ASP.NET MVC.你可以对ELMAH进行配置来存储各种不同的错误(XML文件,事件日志,Access数据库,SQL

Java 标准日志工具 Log4j 的使用(附源代码)

源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还不会用 Log4j,那你真的很有必要读一下这篇文章了.很多朋友反映想写程序日志,但是却不知道怎么把日志写到日志文件里,而且 Java 这方面的资料似乎不多.如<如何写log4j.xml日志配置文件> 所述.本文详细介绍了如何在项目中使用 Log4j 的步骤,并附加了一个例子性质的代码.