zoukankan      html  css  js  c++  java
  • 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的普及,会有更多更好用的框架出现。

  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/mantgh/p/5127680.html
Copyright © 2011-2022 走看看