Доброго времени суток. Мне необходимо логировать запросы к базе на insert и update в определенных частях приложения. Начитался про стандартное логирование Yii, попробовал - не впечатлило. Во-первых нельзя, как я понял, логировать не все запросы, а только в определенных местах, а во-вторых все это логируется в виде, непригодном для последующего выполнения, а мне эти запросы потом нужно выполнять в другие базы. Если кто понял проблему и хочет предложить репликацию, то ее не рассматриваю из-за совершенно разной конфигурации серверов.
Вопрос такой: если я использую AR, могу ли все-таки добиться того, что-бы логировать запросы в виде UPDATE table SET column = * WHERE id =1
и в определенных местах с последующей записью в БД?
Пока вижу только переписывание всех запросов через QueryBuilder. Буду благодарен за помощь.
Можно написать свой класс логгера (LogTarget вроде), поставить категорию чтоб логгировал sql запросы, руками отфильтровывать необходимые запросы (например по вхождению instert/update), и логгировать в нужном вам формате, поставить чтоб сбрасывал лог немедленно.
Но вы уверенны что логгирование - лучший вариант? Может все-таки можно решить вашу проблему на уровне БД? Что за разная конфигурация такая что мешает использовать вам репликацию или бинлоги?
К сожалению, я не подскажу по поводу конфигурации точно, ребята долго мучились и в итоге ни к чему не пришли. А по поводу своего класса логгера не совсем понял. Вы имеете в виду переопределить существующие и написать под свои нужды?
Олег Лысенко: Да, именно. В yii система логгировния работае так: есть главный компонент который так сказать принимат логи. Он уже респределяет логи по так называемым целям yii/log/Target. Вам нужно унаследоваться от этого класса, написать там свою обработку, и потом сконифгурировать в конфиге компонент логгирования чтоб он юзал этот класс. Все запросы к БД логгируются вот так : Yii::info($rawSql, 'yii\db\Command::query'); Соответсвенно, у вашей цели должна быть категория yii\db\Command::query.
Плюс не забудьте что цели сбрасывают лог в файл не сразу, а пачками, в целях производительности. Вам это нужно будет убрать, ибо у вас будет парралельная работа нескольких скриптов и порядок будет неверный.
Слегка не то, что мне нужно, так как это дока по Yii2, мне на предыдущей платформе надо делать, но я покопаю по классам. А что касается транзакций, то в чем проблема их откатить? не понял вопроса, если честно
Проблема транзакций вот в чем: при каждом запросе вы пишете в файл. Писать нужно сразу же, ибо паралельно может выполняться несколько скриптов. В случае отката транзакции, вам нужно удалить из этого файла выполненные запросы транзакции. Как вы это будете делать - лично я представить не могу. Разве что писать не в файл, а в какой-нить Redis.
Спасибо за советы, по поводу транзакций тут такая штука: идея у меня такая, чтобы писать логи запросов в таблицу БД, потом по крону запускать скрипт и, свитчась между базами, выполнять эти запросы, вариант с файлами мне вообще не подходит, поэтому и не хочу юзать стандартное логирование Yii, а чем копать их соурсы и наследовать и писать под себя, наверное проще отказаться от AR тут и воспользоваться query bilder и спокойно писать нужные запросы в нужную мне таблицу, вот такая идея собственно