Вы не пишете нижний колонтитул gzip, содержащий CRC и длину данных:
std::streamoff size = source.tellg();
int totalSize = size;
int tcrc = 0;
...
n = source.rdbuf()->sgetn( in, CHUNK );
strm.avail_in = (uInt)n;
tcrc = crc32( tcrc, (uint8_t*)in, n );
...
(void)deflateEnd( &strm );
dest.write( (char*)&tcrc, sizeof( tcrc ) );
dest.write( (char*)&totalSize, sizeof( totalSize ) );
return write_len;
Ваш метод __write_magic_header
также неверен, поскольку он выделяет только 10 байтов, но затем записывает 10 символов с помощью sprintf
который фактически напишет 11 байтов, переполняющих ваш буфер.
В окнах вы не можете отправлять двоичные данные через std::cout
, у вас та же проблема, что и при открытии файла с ofstream
без указания binary
. Чтобы исправить эту проблему, перед использованием std::cout
:
_setmode( _fileno( stdout ), _O_BINARY );
необходимо указать следующее:
#ifdef
, Макросы, которые вы используете, являются подробностями реализации и не должны давать / незначительной разницы в производительности современного компилятора. Необходимо дифференцироваться между входом и трассировкой. В то время как строки немного нечетки, я склонен думать о входе как "не материал разработчика". Вещи как необработанные исключения, повредите файлы и т.д. Они определенно не нормальны, и должны быть очень нечастой проблемой.
Трассировка - то, чем интересуется разработчик. Отслеживания стека, параметры метода, что веб-сервер возвратил Состояние HTTP 401,3 и т.д. Они являются действительно шумными, и могут произвести много данных в короткий срок. Обычно у нас есть разные уровни трассировки, для урезания шума.
Для входа в систему клиентского приложения я думаю, что журналы событий являются способом пойти (я должен был бы проверить дважды, но я думаю, что медицинский Контроль ASP.NET может записать в журнал событий также). У обычных пользователей есть полномочия записать в журнал событий, пока у Вас есть Установка (который установлен администратором так или иначе), создают источник события.
Большинство Ваших преимуществ для входа Sql, в то время как верный, не применимо к регистрации событий:
Для трассировки, которой определенные детали исключения или ошибок часть, мне нравятся плоские файлы - их легко поддержать, легкий к grep, и могут быть импортированы в Sql для анализа, если мне нравится.
90% времени, Вам не нужны они, и они установлены ПРЕДУПРЕДИТЬ или ОШИБКА. Но при установке их на ИНФОРМАЦИЮ или ОТЛАДКУ Вы генерируете тонну данных. RDBMS имеет много издержек - для производительности (ACID, параллелизм, и т.д.), устройство хранения данных (журналы транзакций, диски SCSI RAID-5, и т.д.), и администрирование (резервные копии, обслуживание сервера, и т.д.) - все из которых являются ненужными для журналов трассировки.
Я не зарегистрировался бы прямо к базе данных. Как Вы говорите, проблемы базы данных становятся хитрыми для входа :)
Я зарегистрировался бы к файловой системе и затем имел бы задание, которое вставляет объем от файлов до базы данных. Лично мне нравится иметь журналы в базе данных в журнале, выполненном, прежде всего, для масштабирующейся ситуации - я в значительной степени предполагаю, что у меня будет больше чем одно выполнение машины, и удобно смочь эффективно иметь объединенный журнал. (Каждая запись должна указать машину, она прибывает из, конечно.)
Отчет и приложения просмотра могут быть сделаны очень легко от базы данных - может быть меньше специализированных на журнале инструментов создания отчетов там в данный момент, но в значительной степени все базы данных обобщили функциональность создания отчетов.
Для простоты входа я использовал бы платформу как log4net, который вынимает большое усилие из него и является проверенным на практике решением. Кроме чего-либо еще, которое означает, можно изменить выходную стратегию без изменений кода. Вы могли даже зарегистрироваться и к журналу событий и к базе данных при необходимости, или отправить некоторые журналы в одно место и некоторых к другому. (Я принял.NET здесь, но существуют подобные платформы журналирования для многих платформ.)
Одно примечание о записи в журнал событий: это требует определенных полномочий для Ваших пользователей приложения, которые в некоторых средах могут быть ограничены по умолчанию.
Где я в, мы делаем большую часть нашего входа к базе данных с плоскими файлами как резервное копирование. Это довольно хорошо, мы можем сделать, вещам нравится, заставляют канал RSS для приложения смотреть в течение нескольких дней, когда мы вносим изменение.
Одна вещь, которая нуждается в рассмотрении о регистрации событий, состоит в том, что существуют продукты там, которые могут контролировать журналы событий Ваших серверов (как Microsoft Operations Manager) и разумно сделать уведомление и собрать статистику по их содержанию.
"Минус" основанного на SQL входа то, что он добавляет другой слой зависимостей к Вашему приложению, которое может или не может всегда быть приемлемым. Я сделал обоих в своей карьере. Я несколько раз даже использовал базирующуюся очередь сообщений MSMQ, чтобы поставить события журнала в очередь и освободить очередь в базу данных MSSQL, чтобы избавить от необходимости мое клиентское программное обеспечение иметь соединение с DB.