Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在使用Html/WinJS开发的Metro应用程序中实现日志记录_Javascript_Windows 8_Windows Runtime_Winjs_Error Log - Fatal编程技术网

Javascript 在使用Html/WinJS开发的Metro应用程序中实现日志记录

Javascript 在使用Html/WinJS开发的Metro应用程序中实现日志记录,javascript,windows-8,windows-runtime,winjs,error-log,Javascript,Windows 8,Windows Runtime,Winjs,Error Log,我需要在用Html/WinJS开发的Windows 8 Metro应用程序中提供错误日志 这样用户就可以从应用程序本地文件夹中的日志文件中了解出了什么问题 我已经检查了WinJS.log(消息、标记、类型);它将写入控制台,但无法找到任何可以在本地文件中获取的内容 最好的方法是什么?如果在WinJS开发的metro应用程序中有任何第三方库/js可用于错误记录 提前感谢。WinJS.log只是一个占位符。如果没有正确的初始化,它什么也不做(事实上,它根本没有设置)。如果您只是在应用程序启动时调用W

我需要在用Html/WinJS开发的Windows 8 Metro应用程序中提供错误日志 这样用户就可以从应用程序本地文件夹中的日志文件中了解出了什么问题

我已经检查了WinJS.log(消息、标记、类型);它将写入控制台,但无法找到任何可以在本地文件中获取的内容

最好的方法是什么?如果在WinJS开发的metro应用程序中有任何第三方库/js可用于错误记录


提前感谢。

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

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

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
函数,它将在一个承诺内创建一个新的日志文件(使用当前日期/时间作为文件名的一部分)。然后,一个名为
actionFn
的函数被传递给
startolog
函数。通过传递名为
action
的选项的可选属性,默认的“写入控制台”行为将被覆盖(如果您不想被覆盖,您可以在不执行该操作的情况下调用
startog
,然后从
WinJS.log
复制函数引用,并将其替换为您自己的函数,然后再调用它)。当调用
log
函数时,它现在调用
actionFn
,该函数使用先前创建的承诺来验证日志文件实际上可供写入,然后再继续。如果它还没有准备好,它将排队。因此,这意味着即使文件可能没有立即准备好,日志最终也会包含您期望的结果。由于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) 
});

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

WiredParie很好地介绍了WinJS.log的使用——关键是您可以随意替换默认行为。至于记录SDK,请查看的分析部分。有一些SDK可用,比如Localytics、Adobe Omniture和MarkedUp,您可以很容易地将它们绑定到WinJS.log实现中。非常清楚的解释,感谢您共享代码!谢谢你的代码,但它不适合我。如果我在app.onactivated方法中运行startFileLog,我的应用程序就会崩溃,最后会出现一个包含winjs:scheduler错误的日志。例如:
winjs:scheduler:Transitioning job(1)from:running to:blocked
我建议打开一个新问题,而不是尝试在注释中解决问题。