我已經將第三方框架集成到我的應用程序中。如何攔截我的應用程序代碼中的框架日誌消息?
定期地,此框架將消息寫入日誌。
有沒有什麼辦法可以在我的應用程序代碼中捕獲這些消息?
我需要從那裏提取一些有用的數據。
我已經將第三方框架集成到我的應用程序中。如何攔截我的應用程序代碼中的框架日誌消息?
定期地,此框架將消息寫入日誌。
有沒有什麼辦法可以在我的應用程序代碼中捕獲這些消息?
我需要從那裏提取一些有用的數據。
你說它把它寫到一個「日誌」 - 如果它是一個文件它也記錄下來,然後寫你自己的後臺任務,每隔一段時間查看文件大小,如果它改變了,然後發送喚醒給其他部分代碼。如果它的日誌記錄爲「標準輸出」或「標準錯誤」(fd == 1或fd == 2),則可以打開自己的日誌文件,然後重新分配FILE *。現在發送到stdout或stderr的所有內容都會發送到您的文件。
編輯:有很多職位上如何使用自由職業者 - 就像一行代碼 - 從這一個開始Rerouting stdin and stdout from C。你可能不得不嘗試模式,但我懷疑「a」會起作用,如果不嘗試「w」。如果該文件不存在,該文件將被創建。
代碼將類似`freopen(pathToMyLogFile,「a,stdout)',檢查返回代碼。在Xcode文檔視圖中搜索命令或使用終端中的man。
如果您知道框架的日誌記錄方法,我的意思是包含您感興趣的NSLog的方法,您可以使用自己的方法調用該方法並在打印之前捕獲消息。
在objC方法名稱映射到它的實現(IMP)。交換方法實現(IMP)稱爲方法混合。通過方法調整,您可以使方法A調用IMP B,反之亦然。有many資源可供您詳細解釋。
這種技術的適用性取決於框架日誌信息的方式。然而,這可以讓你領先實現你想要的。
你說得對,我的意思是std-out \ std-err。我如何確定框架使用哪一個?更重要的是,如何將其更改爲本地文件? – Rizon
映射第一個stdout,看看是否可行 - 如果不嘗試stderr。它的一行代碼可以改變每一種方式。 –
當然,我還必須在運行過程中不時地清除文件,所以它不會太大。對不對? – Rizon