在 Win 8.1/WinJS 上使用 Cordova-WebApp 不断地记录到一个文件

Constantly logging to a file with Cordova-WebApp on Win 8.1/WinJS

在不使用内部日志系统 (LoggingSession) 的情况下不断写入日志文件的最佳方法是什么?我做了类似的事情:

function raisedWhenNewLogMessageArrived(message) {
        var fileName = getcurrentDate() + ".log";

        var appDataDir = WinJS.Application.local.folder;
        appDataDir.getFolderAsync("log", Windows.Storage.CreationCollisionOption.openIfExists).then(
            function (folder) {
                folder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.openIfExists).then(
                    function (file) {
                        Windows.Storage.FileIO.appendTextAsync(file,message + "\n").then(
                                    function () {
                                        win("OK");
                                    },
                                    function (e) {
                                        fail(e);
                                    });
                    },
                            function (e) {
                                fail(e);
                            })
            },
                    function (e) {
                        fail(e);
                    }
                    );
}

但是,如果有大量传入的日志消息(启动时大约 800 条),这当然会崩溃。我还尝试让文件不断打开并写入,但这也会崩溃。像 FileOutputStream 这样的东西会是更好的选择吗?我将如何使用它?

在此先感谢任何帮助!

我建议将所有代码分离到 FileIO.appendTextAsync,以便缓存 StorageFile 对象。 StorageFile 实际上只是路径名的抽象,以允许文件系统实际上不支持的文件。那么,将 StorageFile 放在手头并不意味着您将文件打开。 FileIO.appendTextAsync 将负责打开流、写入流和关闭流。

因此,您可以执行一次 getFolderAsync 和 createFileAsync,而不是对每封邮件都执行一次。然后我怀疑 appendTextAsync 将能够跟上您的日志记录流量。鉴于 WinRT 被编写为线程安全的,appendTextAsync 的实现应该可以很好地处理并发问题。那么,您的日志记录方法只是使用缓存的 StorageFile 对象围绕 appendTextAsync 的简单包装器。

作为替代方案,请查看 Windows.Foundation.Diagnostics 中的 FileLoggingSession class,它专门用于进行基于文件的连续日志记录,并且还生成可以带入 Windows Windows SDK 中的性能分析器和跟踪报告器工具。有关详细信息,请参阅 FileLoggingSession sample and the Windows Performance Analyzer documentation.