2

我需要在使用 Html/WinJS 开发的 Windows 8 Metro 应用程序中提供错误日志记录,以便用户可以从位于应用程序本地文件夹中的日志文件中了解问题所在。

我检查了 WinJS.log(message, tags, type); 它将写入控制台但无法找到任何我可以通过它在本地文件中获取它的东西。

最好的方法是什么?是否有任何 3rd 方库/js 可用于在 WinJS 开发的 Metro 应用程序中记录错误?

提前致谢。

4

1 回答 1

8

WinJS.log只是一个占位符。如果没有适当的初始化,它什么也不做(事实上,它根本没有设置)。如果您只是WinJS.Utilities.startLog()在应用程序启动时调用,则默认为控制台连接一个记录器。

如果你想要更完整的东西,你需要构建它。我在下面建立了一个小样本。

function startFileLog() {
    // choose where the file will be stored:
    var fileDestination = Windows.Storage.ApplicationData.current.localFolder;

    var logger = new WinJS.Promise(function (complete) {
        var logfilename = new Date().toISOString().replace(/[:-]/g, "");
        logfilename = "log-" + logfilename + ".log";
        fileDestination.createFileAsync(logfilename,
            Windows.Storage.CreationCollisionOption.generateUniqueName)
              .done(function (file) {
                complete(file);
            });
    });

    var actionFn = function (message, tag, type) {
        logger.then(function (file) {
            var m = WinJS.Utilities.formatLog(message, tag, type);
            Windows.Storage.FileIO.appendTextAsync(file, m).done();
        });
    };

    WinJS.Utilities.startLog({ action: actionFn });
}

通过调用startFileLog上面的函数,它会在 promise 中创建一个新的日志文件(通过使用当前日期/时间作为文件名的一部分)。然后,将调用的函数actionFn传递给该startLog函数。通过传递名为 的选项的可选属性action,默认的“写入控制台”行为被覆盖(如果您不希望它被覆盖,您可以startLog在没有操作的情况下调用,然后复制函数引用WinJS.log并将其替换为您自己的函数, 并调用它)。当log函数被调用时,它现在调用actionFn它使用之前创建的 Promise 来验证日志文件实际上是否可以在继续之前写入。如果它还没有准备好,它将被排队。因此,这意味着即使文件可能不会立即准备好,日志最终也会包含您期望的结果。由于 WinJS 的异步特性,如果应用程序在文件完全打开之前崩溃,将会有很短的时间段内丢失记录的项目。如果您愿意,您可以延迟应用程序启动,直到通过返回logger承诺打开文件:

function startFileLog() {
    /// ... etc..

   return logger;
}

startFileLog().then(function() {
    // the application can now be assured that the log file is ready to accept
    // writes ... (but again, it's all async, so a write may be missed in 
    // extreme cases) 
});

您可能希望在应用程序末尾创建一个函数来清理/关闭日志文件。

于 2013-11-01T14:50:42.363 回答