Я программирую на Linux, а не на MacOSX, но, вероятно, там тоже самое.
Если в вашей программе регистрируется только один поток, это означает, что вы буферизируете данные регистрации в этом потоке регистрации, а затем записывает их в файл, вероятно, в более крупную часть, чтобы избежать слишком большого количества операций ввода-вывода и ускорить процесс регистрации .
Плохо то, что если один поток завершит работу с ошибками, весь процесс будет уничтожен вместе с буферизованными данными.
Решения (для Linux), о которых я знаю:
Передача данных регистрации через сокет без использования буферизационного потока регистрации (например, syslog ). В этом случае ОС, вероятно, позаботится о данных, записанных в сокет, и даже если ваше приложение завершится сбоем, данные должны быть получены на другом конце и успешно зарегистрированы.
Не используйте поток журналирования, каждый поток может синхронно записывать в файл. В этом случае потери данных журнала после сбоя должны быть очень малы или не уменьшаться. Хотя это медленнее.
Я пока не знаю лучших решений этой проблемы, хотя было бы интересно узнать их.