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

时间:2021-06-14 20:04:07

日志工具由来已久,是很受大家欢迎的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}");
}

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

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

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

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

总结

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