转载

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}");             } 

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

Win10手记-为应用集成日志工具Logger

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

Win10手记-为应用集成日志工具Logger

总结

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

原文  http://www.cnblogs.com/mantgh/p/5127680.html
正文到此结束
Loading...