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

  • 相关阅读:
    bzoj2876 [Noi2012]骑行川藏
    关于线性基的一些理解
    bzoj2115 [Wc2011] Xor
    bzoj2884 albus就是要第一个出场
    bzoj2460 [BeiJing2011]元素
    bzoj2005 [Noi2010]能量采集
    关于积性函数的一些理解
    bzoj4300 绝世好题
    Servlet—文件上传
    JNDI—目录接口名
  • 原文地址:https://www.cnblogs.com/mantgh/p/5127680.html
Copyright © 2020-2023  润新知