Получение запросом данных журнала регистрации хранящегося в SQLite

В статье показано как, используя новый функционал платформы, получать данные из журнала регистрации привычным запросом.

Начиная с версии платформы 8.3.5.1068 журнал регистрации хранится в файловой базе данных SQLite.

Вспоминаем про функциональность внешних источников данных.

Соединяем два механизма и получаем такой вот результат:

ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER=SQLite3 ODBC Driver;Database=" + ФайлЖурналаРегистрации + ";BigInt=1;";
ВнешниеИсточникиДанных.ЖурналРегистрации.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.ЖурналРегистрации.УстановитьСоединение();

Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| ЗаписиЖурнала.Код,
| ЗаписиЖурнала.Важность,
| ЗаписиЖурнала.Дата,
| ЗаписиЖурнала.СтатусТранзакции,
| ЗаписиЖурнала.ДатаТранзакции,
| ЗаписиЖурнала.ИдентификаторТранзакции,
| ЗаписиЖурнала.Пользователь,
| ЗаписиЖурнала.Пользователь.Код,
| ЗаписиЖурнала.Пользователь.Наименование,
| ЗаписиЖурнала.Компьютер.Код,
| ЗаписиЖурнала.Компьютер.Наименование,
| ЗаписиЖурнала.Приложение.Код,
| ЗаписиЖурнала.Приложение.Наименование,
| ЗаписиЖурнала.Событие.Код,
| ЗаписиЖурнала.Событие.Наименование,
| ЗаписиЖурнала.Комментарий,
| ЗаписиЖурнала.Данные,
| ЗаписиЖурнала.ПредставлениеДанных,
| ЗаписиЖурнала.РабочийСервер,
| ЗаписиЖурнала.РабочийСервер.Код,
| ЗаписиЖурнала.РабочийСервер.Наименование,
| ЗаписиЖурнала.ОсновнойПорт,
| ЗаписиЖурнала.ВспомогательныйПорт
|ИЗ
| ВнешнийИсточникДанных.ЖурналРегистрации.Таблица.ЗаписиЖурнала КАК ЗаписиЖурнала";

ТаблицаДанных = Запрос.Выполнить().Выгрузить();
ВнешниеИсточникиДанных.ЖурналРегистрации.РазорватьСоединение();

Не забываем скачать и установить ODBC-драйвер для SQLite нужной разрядности.

Обращаю внимание на параметр в строке подключения «BigInt=1″, только так, поле хранящее дату будет возвращать корректный результат. Кстати, дата хранится как целое число. Например, если дата равна 635453673444260, то чтобы перевести в привычный тип Дата, нужно сделать так:

ОбычнаяДата = '00010101000000' + 635453673444260/10000; //03.09.2014 18:55:44

Если остались вопросы, просто посмотрите ЖР.cf и встроенную обработку «Пример».

Спасибо за внимание.

32 Comments

  1. petrov_al

    Очень интересный подход через внешниии источники данных. По сути можно иметь it-базу и там анализировать журналы разных баз.

    Reply ↓
  2. AlX0id

    Но есть один нюанс. Единожды переключив журнал в новый формат — обратно не вернешься. А текущие версии КИПа не поддерживают новый журнал регистрации в принципе %)

    Reply ↓
  3. metmetmet

    А что можно сказать по производительность в сравнении со старым механизмом?

    Reply ↓
  4. awk

    (3) metmetmet, Ускорилось…

    Reply ↓
  5. cool.vlad4

    о мой бог, неужели все таки додумались сделали на sqlite. это ж какой ад и кошмар был

    Reply ↓
  6. kiruha

    (4) awk,

    То что это ускоряет чтение не надо быть 7 пядей во лбу

    Интересно как запись , есть ли блокировки из за этого — т.к. стандартно 1С пишет каждый чих пользователя,

    SQLLite при записи блокируют всю таблицу

    Reply ↓
  7. BabySG

    (6) kiruha, очевидно, что пользователь БД в этом случае один и блокировки не страшны в принципе 🙂

    Reply ↓
  8. kiruha

    На каждого пользователя своя база SQLLIte ?

    Reply ↓
  9. AlX0id

    (6) kiruha, Сомнительно, что там вообще накладываются блокировки — ибо нафига? Кого может волновать грязное чтение журнала регистрации?

    Reply ↓
  10. AlX0id

    (10) JohnyDeath,

    Почитал — да, так и есть.. В лучшем случае можно включить WAL как я понимаю.

    Reply ↓
  11. maxx

    Классно. Интересно, если базы с более старой платформы 1С переводить на 8.3, то к уже имеющийся журнал регистрации как перегнать в SQLLite?

    Reply ↓
  12. zombi81

    А скриншот есть что на выходе получаем? Так как таблица есть EventLog там все поля по -английски называются и информация в таблице невнятная.

    Reply ↓
  13. rtnm

    (13) zombi81, Да, имена таблиц и полей используют английские названия. В своем примере, я как раз частично их перевел для внешнего источника, используя в основном устоявшиеся термины. Можете изучить ЖР.cf и я думаю станет понятнее.

    Reply ↓
  14. adapter

    (1) petrov_al, тоже самое можно было делать и на 8.2. Без sqlLite, но суть та же. Вот смотри

    http://infostart.ru/public/283362/

    Reply ↓
  15. AlX0id

    (12) maxx,

    Автоматом вроде конвертится..

    Reply ↓
  16. ediks

    (16) Что-то мне кажется, что автоматом не конвертится.

    Reply ↓
  17. AllexSoft

    (15) adapter, разница только в 10тыс рублей 😉 сейчас тоже самое но из коробки бесплатно

    Reply ↓
  18. AlX0id

    (17) ediks,

    Ну вот ток что на тестовой базе перевел на новый формат, старые файлы журнала поудалял — вся старая информация осталась.

    Reply ↓
  19. ediks

    (19) Не, я предполагал, что не нужно нажимать никакие кнопки. Типа само, без участия оператора все происходит.

    А так я тоже конвертнул — появился новый файл 1Cv8.lgd. Скачал конфигу и посмотрел, что получается.

    Вот только вопрос — сколько будет конвертироваться журнал размером 120 Гб (все, что нажито нелегким трудом за много лет)?

    И какой будет размер базы данных журнала? У меня после конвертации тестового журнала размером 10 Мб получилась база размером 17 Мб.

    Reply ↓
  20. AllexSoft

    зачем держать такие журналы? они все равно не используемы.. забэкапил то что нажито и ничего переносить не надо. ИМХО

    Reply ↓
  21. AlX0id

    (20) ediks,

    Режьте его серпом по корень ) Все равно в старом журнале разобраться в 120 гигах практически нереально )

    Reply ↓
  22. ediks

    (22) Пока только вопрос стоит об архивировании этого гигантского журнала. Вопрос о конвертации такого журнала был поставлен с чисто теоретической, познавательной целью.

    У нас и мальчика-то 1С 8.3.5 нет 🙂

    Reply ↓
  23. awk

    (7) BabySG, В SQLite нет блокировок таблиц. Есть блокировка баз. Только один пользователь может писать. Остальные только читают.

    Reply ↓
  24. AlexO

    (26) JohnyDeath, по теме есть что? Или только троллить зашел?

    Reply ↓
  25. pepe

    Для файловой базы все работает, а вот для серверной версии не работает. Хочу вытянуть список документов которые изменял пользователь. Даже через режим «Конфигуратор» не могу подключится для получение структуры. В файловой все ок.

    Reply ↓
  26. pepe

    С вопросом разобрался. Нужно ставить SQLite на сервер 1С и у сервера должен быть доступ к файлу.

    Reply ↓
  27. orefkov

    К вопросу о блокировках в sqlite.

    Для начала отмечу, что блокировки в sqlite накладываются на всю базу.

    Когда и как они накладываются, зависит от способа обращения к файлу базы данных sqlite.

    Независимо от способа — писать в базу sqlite в один момент времени может только один писатель.

    А вот насчет читателей — есть нюансы.

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

    В этом режиме писатель блокирует только других писателей, но не блокирует читателей, также как и наличие читателей не блокируют писателя.

    Просто каждый читатель видит то состояние базы данных, какое оно было на момент начала чтения, и не видит изменений, вносимых в этот момент писателем.

    Отмечу, что в этом режиме изменения записываются в отдельный файл, и периодически наступает «чекпоинт», когда данные из дополнительного файла переносятся в основной.

    В этот момент блокируются все — и читатели, и писатель.

    Если режим WAL для данной базы данных не включен, наличие читателей не дает писать, а наличие писателя — не дает читать.

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

    Режим WAL нельзя использовать, если обращение к файлу базы данных выполняется одновременно с разных компьютеров.

    При многопоточном обращении к файлу БД из одного процесса есть возможность установить несколько соединений с одним файлом БД.

    В этом случае для читающего соединения можно установить режим «read uncommited», когда одно соединение сразу видит изменения, вносимые другим соединением еще до завершения транзакции. Если и читать и писать через одно соединение, то там всегда сразу видно вносимые изменения.

    Вот так вот коротенько о блокировках в sqlite.

    А вот сама идея вести лог сразу в базу данных sqlite — мне кажется, 1С облажалась, как всегда, пытаясь выдумать свой велосипед.

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

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

    Нет необходимости «на лету» писать в формате, пригодном для анализа. Тем более, что sqlite — не самый быстрый способ писать в файлы.

    Например, apache, ngnix спокойно и не парясь ведет лог в текстовые файлы. Хотя, о чём это я — nginix быстрый, ему так надо. А для 1С наверняка запись в журнал регистрации не является «бутылочным горлышком» платформы, и ускорять запись в этом месте нет особого смысла, потому что это копейки по сравнению с другими тормозными местами.

    Reply ↓
  28. swwb

    Кто может подсказать?. Есть большой журнал регистраций ~ 30 Gb, пользователей много+ работает автоматическая выгрузка из другой системы. В общем, в лог постоянно что-то пишется.

    Посмотреть историю изменений по документу просто нереально, журнал повисает и вешает за собой базу. Есть какие то пути решения? Хочется смотреть журнал на горячую при работающей базе.

    Reply ↓
  29. awk

    (30) orefkov,

    29.10.2013 Как мы улучшили журнал регистрации

    Реализовано в версии 8.3.5.1068.

    Мы значительно переработали журнал регистрации для того, чтобы увеличить скорость выполнения запросов к журналу и повысить надёжность хранения данных.

    Для этого, в том числе, потребовалось изменить формат хранения журнала регистрации. Теперь он хранится в одном файле базы данных SQLite. Этот файл имеет расширение lgd.

    Наши тесты показывают, что практически по всем условиям отбора выборка данных ускорилась. При некоторых условиях выборка ускорилась существенно. Например, в случае отбора по пользователю, разделителям и по данным, представленным одним значением. Что касается записи, то скорость однопоточной записи тоже немного ускорилась. А вот скорость многопоточной записи возросла почти в полтора раза. Как в файловом варианте, так и в клиент-серверном.

    Создавая новую реализацию журнала, мы стремились учесть пожелания по архивированию журнала и сокращению его размера. Теперь во встроенном языке есть два метода, которые позволяют копировать данные журнала регистрации или удалять их, используя условия фильтрации. Это методы СкопироватьЖурналРегистрации() и ОчиститьЖурналРегистрации(). С их помощью архивирование или очистку журнала можно выполнять автоматически, регламентными заданиями, в период наименьшей загрузки системы.

    Также мы ввели в журнале ещё одно изменение. Время событий хранится теперь в формате всемирного координированного времени (UTC). Это позволят избежать проблем, связанных с работой в разных часовых поясах.

    Показать

    http://v8.1c.ru/o7/201310log/index.htm

    Это как писать надо было, что бы дозапись в файл тормазила…. :))))

    Reply ↓
  30. adapter

    (31) swwb, решение уже сказали выше:

    orefkov

    быстро писать в текст и медленно инкрементировать в удобную для анализа систему

    .

    logManager так и работает (http://infostart.ru/public/283362/)

    Reply ↓
  31. progr-2008

    При сокращении журнала не всегда срабатывает корректно запись в файл.

    Reply ↓
  32. sergathome

    При попытке читать лог ОДНОЙ БАЗЫ блокируется запись в него, что приводит к остановке работы rmngr, что в свою очередь, приводит к остановке обслуживания ВСЕХ БАЗ СЕРВЕРА.

    Дадад, это не баг, это фича…

    ЗЫ Неудача нового формата для крупных масштабов признана 1С фактом с версии 8.3.12 возможности интерактивно выбирать формат журнала регистрации (т.е. опытные люди выбирают старый формат). (http://www.gilev.ru/oldjr/)

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *