Логгер и производиельность
От: na1s  
Дата: 15.03.10 04:13
Оценка:
Привет всем.
Хотелось бы услышать советы как сделать логгер лучше.
У нас есть логгер, и вот он выводит инфу, но выводит он ее, каждый раз открывая и закрывая файл после записи.
Из-за этого с логгер работает очень медленно, хотя я конечно не уверен, может быть и из-за большого количества записей.
Как бы можно было бы ускорить работу с логгером?

15.03.10 11:24: Перенесено модератором из 'C/C++' — Кодт
Re: Логгер и производиельность
От: Bell Россия  
Дата: 15.03.10 05:18
Оценка:
Здравствуйте, na1s, Вы писали:

N>Как бы можно было бы ускорить работу с логгером?


Наверное самый простой вариант — буферизация Складировать записи, а писать их в файл, когда количество достигнет некоторой границы.
Любите книгу — источник знаний (с) М.Горький
Re: Логгер и производиельность
От: Pavel Dvorkin Россия  
Дата: 15.03.10 05:58
Оценка:
Здравствуйте, na1s, Вы писали:

N>Привет всем.

N>Хотелось бы услышать советы как сделать логгер лучше.
N>У нас есть логгер, и вот он выводит инфу, но выводит он ее, каждый раз открывая и закрывая файл после записи.
N>Из-за этого с логгер работает очень медленно, хотя я конечно не уверен, может быть и из-за большого количества записей.
N>Как бы можно было бы ускорить работу с логгером?

Писал свой логгер. Выводы следующие.

Если после каждой записи делать fflush (открывать и закрывать — это лишнее), то работа резко замедляется. Попытка перейти на чистый Win32 (FlushFileBuffers) тоже ничего не дала.
В конечном счете пришлось реализовать буферизацию. Записи заносятся в список, который пакетом записывается в файл периодически. Что еще можно — принудительно записывать в файл, если появилась запись с признаком "важная", естественно, при этом запишутся и все предыдущие.
With best regards
Pavel Dvorkin
Re: Логгер и производиельность
От: okman Беларусь https://searchinform.ru/
Дата: 15.03.10 06:50
Оценка: 2 (1) +2
Здравствуйте.

Присоединяюсь к вышесказанному.
В качестве буфера я использовал файл, отображаемый в память, который сбрасывался
на диск при заполнении. С очень хорошими результатами.
Re: Логгер и производиельность
От: Guard_h4s Россия  
Дата: 15.03.10 08:07
Оценка:
Если не поможет все вышеперечисленное — смотрите в сторону отдельного приложения — логгера
и связи с ним через сокеты или именованые каналы. Больше работы, зато надежно
Re: Логгер и производиельность
От: dilmah США  
Дата: 15.03.10 08:08
Оценка:
N>Как бы можно было бы ускорить работу с логгером?

void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
Re: Логгер и производиельность
От: SuhanovSergey  
Дата: 15.03.10 08:14
Оценка:
Здравствуйте, na1s, Вы писали:

N>Привет всем.

N>Хотелось бы услышать советы как сделать логгер лучше.
N>У нас есть логгер, и вот он выводит инфу, но выводит он ее, каждый раз открывая и закрывая файл после записи.
N>Из-за этого с логгер работает очень медленно, хотя я конечно не уверен, может быть и из-за большого количества записей.
N>Как бы можно было бы ускорить работу с логгером?

Открывать и закрывать каждый раз это, конечно, слишком. Чучше далать flush. Но это всё-равно не сильно улучшит производительность. По своему опыту flush после каждой записи бывает очень полезен, чтобы увидеть, что программа делала непредственно перед падением. Попробуйте сделать лог менее шумным.
Re: Логгер и производиельность
От: Caracrist https://1pwd.org/
Дата: 15.03.10 08:41
Оценка:
Здравствуйте, na1s, Вы писали:

N>Привет всем.

N>Хотелось бы услышать советы как сделать логгер лучше.
N>У нас есть логгер, и вот он выводит инфу, но выводит он ее, каждый раз открывая и закрывая файл после записи.
N>Из-за этого с логгер работает очень медленно, хотя я конечно не уверен, может быть и из-за большого количества записей.
N>Как бы можно было бы ускорить работу с логгером?

http://msdn.microsoft.com/en-us/library/ms810613.aspx
создавать файлы ограниченного размера, и при заполнении просто переходить на следующий...
log1
log2
....
на все случаи включая падения, система ответственна за flushing. работать должно быстрее..
в общем одни плюсы
~~~~~
~lol~~
~~~ Single Password Solution
Re: Логгер и производиельность
От: Sni4ok  
Дата: 15.03.10 09:38
Оценка:
Здравствуйте, na1s, Вы писали:

сам процесс логирования разумно выносить в отдельную нитку- поскольку это самая тормазная операция(сотни микросекунд на запись если в файл, и миллисекунды если в бд), также при подготовке строки к записи разумно не пользоваться стандартными стримами- в зависимости от компилятора и stl'я они могут быть очень медленными (десятки а то и сотни микросекунд на запись).
Re[2]: Логгер и производиельность
От: na1s  
Дата: 15.03.10 11:11
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, na1s, Вы писали:


N>>Привет всем.

N>>Хотелось бы услышать советы как сделать логгер лучше.
N>>У нас есть логгер, и вот он выводит инфу, но выводит он ее, каждый раз открывая и закрывая файл после записи.
N>>Из-за этого с логгер работает очень медленно, хотя я конечно не уверен, может быть и из-за большого количества записей.
N>>Как бы можно было бы ускорить работу с логгером?

PD>Писал свой логгер. Выводы следующие.


PD>Если после каждой записи делать fflush (открывать и закрывать — это лишнее), то работа резко замедляется. Попытка перейти на чистый Win32 (FlushFileBuffers) тоже ничего не дала.

PD>В конечном счете пришлось реализовать буферизацию. Записи заносятся в список, который пакетом записывается в файл периодически. Что еще можно — принудительно записывать в файл, если появилась запись с признаком "важная", естественно, при этом запишутся и все предыдущие.

А как быть если, например segfault, и нельзя ничего посмотреть, так как данные пропадут?
Re[3]: Логгер и производиельность
От: Pavel Dvorkin Россия  
Дата: 15.03.10 11:39
Оценка:
Здравствуйте, na1s, Вы писали:


N>А как быть если, например segfault, и нельзя ничего посмотреть, так как данные пропадут?


Что такое segfault — не знаю, но, полагаю, падение программы. Если причина аппаратная (сбой питания) — ничего не поделаешь, что успело — то записалось. Если программная — можно ловить исключения и при невозможности возобновления работы как минимум сбросить то, что уже накопилось, прежде чем закрыться. См. SetUnhandledExceptionHandler
With best regards
Pavel Dvorkin
Re[2]: Логгер и производиельность
От: rus blood Россия  
Дата: 15.03.10 12:26
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>сам процесс логирования разумно выносить в отдельную нитку- поскольку это самая тормазная операция(сотни микросекунд на запись если в файл, и миллисекунды если в бд), также при подготовке строки к записи разумно не пользоваться стандартными стримами- в зависимости от компилятора и stl'я они могут быть очень медленными (десятки а то и сотни микросекунд на запись).


+100.

Однозначно вывод в отдельном потоке.

Самый жесткий вариант — когда файл находится на сети, и есть несколько желающих что-нить в него записать.
Вариант с набором записей и сбросом по достижении какого-то предела не пойдет, т.к. в случае нескольких пользователей лога сильно портится временной порядок сообщений.

— асинхронные попытки получить файл на запись (с одновременным накоплением сообщений)
— асинхронный сброс накопленных сообщений в файл
— ограничение на время удержания файла в открытом состоянии (даже если остались сообщения) с учетом кол-ва накопленных сообщений (чем больше сообщений, тем меньше время)
— использование глобального ивента для нотификации об открытом состоянии файла (избавляет приложения на той же машине от бесплодных попыток получить доступ к файлу).
Имею скафандр — готов путешествовать!
Re[3]: Логгер и производиельность
От: jazzer Россия Skype: enerjazzer
Дата: 15.03.10 13:05
Оценка:
Здравствуйте, na1s, Вы писали:

N>А как быть если, например segfault, и нельзя ничего посмотреть, так как данные пропадут?


в результате крэша должен остаться дамп памяти, в нем все можно посмотреть, только надо предусмотреть удобный вход в память логгера
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Логгер и производиельность
От: Аноним  
Дата: 17.03.10 15:14
Оценка: +1
Здравствуйте, rus blood, Вы писали:

RB>Вариант с набором записей и сбросом по достижении какого-то предела не пойдет, т.к. в случае нескольких пользователей лога сильно портится временной порядок сообщений.

почему? в буфер кладется текст соощения + timestamp. последовательность добавления сообщений обеспечивается например очередью. не вижу проблем кроме "своевременности" обновления логфайла на диске
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.