ofstream_log_file_ << "Add useful debug message here " << extra_info_ << std::endl;В этом коде вызывается функция std::endl, которая помимо перевода строки для буферезированных потоков сбрасывает буфер в выходной файл. При небольшом количестве таких вызовов это даже полезно — в случае падения программы в логе останется полезная информация. Но для интенсивного логгирования, когда нужно писать в лог очень часто, эта дополнительная особенность снижает скорость в несчитанное количество раз.
Ускорить запись в лог очень просто — меняем std::endl на известный символ "\n".
ofstream_log_file_ << "Add useful debug message here " << extra_info_ << "\n";
Не понимаю смысл лога который при падении приложения не сохранит последние сообщения :) Если уж действительно встал вопрос быстродействия, что маловероятно, то решать его можно другими методами, например отправкой сообщений другому процессу который будет их ставить в очередь и сбрасывать на диск.
ОтветитьУдалитьЛог нужен не только, если что-то падает. А так получается самый быстрый и простой вариант.
ОтветитьУдалить"Быстрый" в плане потраченных на реализацию сил.
ОтветитьУдалитьИМХО, одним из самых правильных способов - это логгирование в syslog. Пишем простой враппер, чтобы можно было писать код вида:
ОтветитьУдалитьLOG( L_DEBUG ) << " bla-bla-bla " << endl;
и внутри все перенаправляем в сокет syslog-а.
В результате получаем и отложенное логгирование, и не будет потери сообщений при аварийном завершении.
Не нужно забывать, что не на всех платформах есть syslog(или даже сокеты). А свои реализации писать порой слишком накладно.
ОтветитьУдалитьstd::endl кроме всего прочего будет вставлять \r\n на одной платформе и \n на другой.
ОтветитьУдалитьstd::endl вставляет на всех платформах \n. А вот во что преобразуется \n — это определяется реализацией.
ОтветитьУдалитьТ.е. \n в конечном виде может преобразоваться реализацией в CR LF (0D 0A) или в LF CR (0A 0D) или ещё во что-то.
ОтветитьУдалитьЕщё см. стандарт 27.6.2.7: результат endl есть os.put(os.widen(’\n’) ), then os.flush().
2jia3ep: проверил, действительно, вы правы!
ОтветитьУдалить"\n" на Windows тоже пишется как 0D0A . Тогда беру свои слова обратно. Записи равнозначные.