Re[3]: Логирование работы с бд в другой бд
От: Milena США  
Дата: 23.10.19 19:47
Оценка: 17 (3)
Здравствуйте, BlackEric, Вы писали:

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


M>>PostgreSQL уже пишет лог, поэтому можно (основываюсь на опыте с другой СУБД) просто постоочно читать лог из системных таблиц с отбором ненужного и асинхронно писать в data lake (чтобы была schema on read и недорого).


BE>Что-то я не знаю где у постгреса логи такого уровня. Я в нем не спец, правда.


Я имею в виду обычный транзакционный лог базы данных, которую пишет любая СУБД. Я делала подобное в SQL Server, но в целом это доступно в любой БД, так как это основа ее функционирования, просто реализация разная будет.
То, что я описала, можно сделать через write-ahead log stream: https://stackoverflow.com/questions/36291676/query-transaction-log-in-postgresql/36292724


Если вам ещё нужен лог всех запросов к БД, то его нужно отдельно включить в настройках PostgreSQL — см. тут: https://tableplus.com/blog/2018/10/how-to-show-queries-log-in-postgresql.html
Re: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 12.11.19 06:57
Оценка: 79 (2)
Здравствуйте, BlackEric, Вы писали:

В общем повесили все это дело на pipeline медиатора ()Behaviors:

public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
    //Trace.WriteLine("Before handler");

    var response = await next();

    //Trace.WriteLine("After handler");
    
    bool IsLog = response is ILoggedResponse;

    if (IsLog)
    {
        string output = JsonConvert.SerializeObject(response);

        _log.LogInformation($"User {userId} has access for data: {output}");
    }

    return response;
}
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: Milena США  
Дата: 23.10.19 14:13
Оценка: 78 (2)
Здравствуйте, BlackEric, Вы писали:

BE>В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.

Как бы это реализовать?
BE>Очевидные проблемы:
BE>1. Оно не должно тормозить
BE>2. Логирование должно быть в одном месте что бы не забывать его включать/отключать. Соответственно вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.

PostgreSQL уже пишет лог, поэтому можно (основываюсь на опыте с другой СУБД) просто постоочно читать лог из системных таблиц с отбором ненужного и асинхронно писать в data lake (чтобы была schema on read и недорого).
Re[2]: Логирование работы с бд в другой бд
От: RushDevion Россия  
Дата: 12.11.19 09:52
Оценка: +2
Понужу чуток.
Имхо, если TRequest/TResponse — это DTO-шки, то лучше такое атрибутами решать (e.g. [Autolog]), а не маркерными интерфейсами.
Оно чище/расширяемей получится.
Скажем, если появятся разные форматы логирования (e.g. минимальный/подробный), это будет доп.поле в атрибуте,
а не лишний член в ILoggedResponse, который каждому из наследников придется реализовывать.
Re[5]: Логирование работы с бд в другой бд
От: RushDevion Россия  
Дата: 24.10.19 15:58
Оценка: 1 (1)
BE>История изменений

Имхо, полноценно реализовать такое через автоматический парсинг логов не реально.
Под "полноценно" я имею в виду что в нормальный аудит должны попадать:
информация о пользователе приложения (не пользователе БД!), окружении (e.g. через какой клиент поступил запрос, с какого IP и т.п.),
запрошенной операции (причем не просто read/write базы, а в бизнес-терминах, e.g. "попытка изменения пароля", "попытка проведения платежа" и т.п.),
значения данных до/после изменения.

Вообще задача хорошо ложится на Event Sourcing парадигму. Тогда лог изменений (поток событий) будет из коробки.
Но и в классической схеме с репозиториями можно попробовать построить pipeline обработки входящих запросов по CQRS схеме.
Т.е. чтобы на каждую бизнес транзакцию был свой IQueryHandler<T>/ICommandHandler<T>.
Тогда поверх можно единожды написать универсальный декоратор, который будет логировать контекст (пользователь, IP и т.п.), входные параметры и результаты выполнения.
Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 12:21
Оценка:
Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.
В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.
Работа с основной предполагается через EF Core.

Как бы это реализовать?
Очевидные проблемы:
1. Оно не должно тормозить
2. Логирование должно быть в одном месте что бы не забывать его включать/отключать. Соответственно вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 23.10.19 12:26
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

А цель этого какая?
Sic luceat lux!
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 12:34
Оценка:
Здравствуйте, Kernan, Вы писали:

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


BE>>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

K>А цель этого какая?

Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: vsb Казахстан  
Дата: 23.10.19 12:56
Оценка:
В Java вся работа с базой идёт через JDBC. Это набор интерфейсов, которые реализует драйвер. Собственно я бы сделал свою реализацию этих интерфейсов, которая просто пробрасывает все вызовы к драйверу, а после успешного завершения операции логгировала бы эту операцию во второй базе. Если в .NET похожая архитектура драйверов базы, можно попробовать примерно так же сделать.
Re: Логирование работы с бд в другой бд
От: AleksandrN Россия  
Дата: 23.10.19 13:17
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

BE>В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.
BE>Работа с основной предполагается через EF Core.

Посмотри на GridGain. Там есть средства интеграции с РСУБД, в том числе и с PostgreSQL. Эта интеграция использует GridGain как In-memory кэш для РСУБД. Но GridGain ещё умеет сохранять данные на диск. Возможно, это как раз то, что тебе нужно. Но детальнее подсказать, к сожалению, не смогу т.к. сам знаком с GridGain'ом поверхностно.
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 13:17
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>В Java вся работа с базой идёт через JDBC. Это набор интерфейсов, которые реализует драйвер. Собственно я бы сделал свою реализацию этих интерфейсов, которая просто пробрасывает все вызовы к драйверу, а после успешного завершения операции логгировала бы эту операцию во второй базе. Если в .NET похожая архитектура драйверов базы, можно попробовать примерно так же сделать.


Не хотелось бы в драйвера лезть.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 13:27
Оценка:
Здравствуйте, BlackEric, Вы писали:

А в CQRS внедрить логирование?
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: Sharov Россия  
Дата: 23.10.19 15:19
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.


Не проще репликацию настроить?
Кодом людям нужно помогать!
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:27
Оценка:
Здравствуйте, Sharov, Вы писали:

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


BE>>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.


S>Не проще репликацию настроить?


Репликацию тоже хотят, но это не заменяет логирования всего и вся.
https://github.com/BlackEric001
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:28
Оценка:
Здравствуйте, Milena, Вы писали:

M>PostgreSQL уже пишет лог, поэтому можно (основываюсь на опыте с другой СУБД) просто постоочно читать лог из системных таблиц с отбором ненужного и асинхронно писать в data lake (чтобы была schema on read и недорого).


Что-то я не знаю где у постгреса логи такого уровня. Я в нем не спец, правда.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:32
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

BE>В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.
BE>Работа с основной предполагается через EF Core.

BE>Как бы это реализовать?

BE>Очевидные проблемы:
BE>1. Оно не должно тормозить
BE>2. Логирование должно быть в одном месте что бы не забывать его включать/отключать. Соответственно вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.

У меня вырисовывается что-то типа класса с двумя дженерик функциями для get и post.
Они будут в себя принимать реквест, его логировать и через медиатор передавать реквест в репозиторный хандлер. Ну и обратно респонс репозитория логировать.
https://github.com/BlackEric001
Re[4]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:57
Оценка:
Здравствуйте, Milena, Вы писали:

M>Я имею в виду обычный транзакционный лог базы данных, которую пишет любая СУБД. Я делала подобное в SQL Server, но в целом это доступно в любой БД, так как это основа ее функционирования, просто реализация разная будет.

M>То, что я описала, можно сделать через write-ahead log stream: https://stackoverflow.com/questions/36291676/query-transaction-log-in-postgresql/36292724


M>Если вам ещё нужен лог всех запросов к БД, то его нужно отдельно включить в настройках PostgreSQL — см. тут: https://tableplus.com/blog/2018/10/how-to-show-queries-log-in-postgresql.html


Спасибо, это близко к тому что нужно.
https://github.com/BlackEric001
Re[3]: Логирование работы с бд в другой бд
От: wildwind Россия  
Дата: 23.10.19 20:03
Оценка:
Здравствуйте, BlackEric, Вы писали:

K>>А цель этого какая?

BE>Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.

Так цель-то какая? Аудит? Восстановление после сбоя? История изменений?
Отредактировано 23.10.2019 20:06 wildwind . Предыдущая версия .
Re: Логирование работы с бд в другой бд
От: wildwind Россия  
Дата: 23.10.19 20:05
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>1. Оно не должно тормозить


Так не бывает, в общем случае.

BE>вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.


Ты же понимаешь, что эти требования взаимоисключающие.
Re[4]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 24.10.19 07:18
Оценка:
Здравствуйте, wildwind, Вы писали:

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


K>>>А цель этого какая?

BE>>Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.

W>Так цель-то какая? Аудит? Восстановление после сбоя? История изменений?


История изменений
https://github.com/BlackEric001
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 24.10.19 07:19
Оценка:
Здравствуйте, wildwind, Вы писали:

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


BE>>1. Оно не должно тормозить


W>Так не бывает, в общем случае.


BE>>вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.


W>Ты же понимаешь, что эти требования взаимоисключающие.


Ага. Все в пределах разумного должно быть.
https://github.com/BlackEric001
Re[5]: Логирование работы с бд в другой бд
От: wildwind Россия  
Дата: 24.10.19 14:24
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>История изменений


Тогда причем тут чтение?

И в каком виде заказчик хочет видеть этот лог, и что еще с ним делать?
Re: Логирование работы с бд в другой бд
От: Слава  
Дата: 24.10.19 17:02
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Как бы это реализовать?


Предложите ему купить Оракл. Там подобное уже наверняка реализовано, через те же логи аудита.
Re[6]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 25.10.19 06:21
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Вообще задача хорошо ложится на Event Sourcing парадигму. Тогда лог изменений (поток событий) будет из коробки.

RD>Но и в классической схеме с репозиториями можно попробовать построить pipeline обработки входящих запросов по CQRS схеме.
RD>Т.е. чтобы на каждую бизнес транзакцию был свой IQueryHandler<T>/ICommandHandler<T>.
RD>Тогда поверх можно единожды написать универсальный декоратор, который будет логировать контекст (пользователь, IP и т.п.), входные параметры и результаты выполнения.

Да, мы к этому варианту и пришли. Будем пробовать так делать.
https://github.com/BlackEric001
Re[5]: Логирование работы с бд в другой бд
От: AleksandrN Россия  
Дата: 25.10.19 07:57
Оценка:
Здравствуйте, BlackEric, Вы писали:

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


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


K>>>>А цель этого какая?

BE>>>Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.

W>>Так цель-то какая? Аудит? Восстановление после сбоя? История изменений?


BE>История изменений


Допустимо ли, что у пользователя, имеющего доступ к таблице, по которой нужно хранить историю, будет доступ к истории?

Если допустимо, то можно сделать таким образом:
Для каждой таблицы, по которой нужна история, сделать таблицу с историей изменений, в которой будут колонки с такими-же именами и колонки с именами <имя колонки>_PREV.
На INSERT, UPDATE и DELETE повесить триггеры в которых будет делаться вставка в таблицу с историей.
Re[3]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 12.11.19 08:50
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Понужу чуток.

RD>Имхо, если TRequest/TResponse — это DTO-шки, то лучше такое атрибутами решать (e.g. [Autolog]), а не маркерными интерфейсами.
RD>Оно чище/расширяемей получится.
RD>Скажем, если появятся разные форматы логирования (e.g. минимальный/подробный), это будет доп.поле в атрибуте,
RD>а не лишний член в ILoggedResponse, который каждому из наследников придется реализовывать.

Да, пожалуй. Учтем на будещее.
https://github.com/BlackEric001
Re[3]: Логирование работы с бд в другой бд
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 18.02.20 18:27
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Понужу чуток.

RD>Имхо, если TRequest/TResponse — это DTO-шки, то лучше такое атрибутами решать (e.g. [Autolog]), а не маркерными интерфейсами.
RD>Оно чище/расширяемей получится.
RD>Скажем, если появятся разные форматы логирования (e.g. минимальный/подробный), это будет доп.поле в атрибуте,
RD>а не лишний член в ILoggedResponse, который каждому из наследников придется реализовывать.
Предположу, что по скорости исполнения маркерный интерфейс будет быстрее.
Respectfully,
Alexander Fedin.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.