我需要在使用 Html/WinJS 开发的 Windows 8 Metro 应用程序中提供错误日志记录 这样用户就可以通过位于应用程序本地文件夹中的日志文件了解出了什么问题。
我检查了 WinJS.log(message, tags, type);它将写入控制台但无法找到任何我可以通过本地文件获取它的东西。
执行相同操作的最佳方法是什么?是否有任何第 3 方库/js 可用于在 WinJS 开发的 Metro 应用程序中进行错误记录?
提前致谢。
最佳答案
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
promise 打开文件:
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)
});
您可能希望在应用程序末尾创建一个函数来清理/关闭日志文件。
关于javascript - 在使用 Html/WinJS 开发的 Metro 应用程序中实现日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19726696/