6.4.5.6 Чтение файлов журнала аудита
Плагин журнала аудита поддерживает функции, предоставляющие SQL-интерфейс для чтения файлов журнала аудита в формате JSON. (Эта возможность не применяется к файлам журналов, записанным в других форматах.)
При инициализации и настройке плагина журнала аудита для записи в формате JSON он использует каталог, содержащий текущий файл журнала аудита, в качестве места поиска читаемых файлов журнала аудита. Плагин определяет расположение файла, базовое имя и суффикс по значению системной переменной audit_log_file, затем ищет файлы с именами, соответствующими следующему шаблону, где [...] обозначает необязательные части имени файла:
basename[.timestamp].suffix[.gz][.enc]
Если имя файла заканчивается на .enc, файл зашифрован, и для чтения его незашифрованного содержимого требуется пароль дешифрования, полученный из хранилища ключей. Дополнительную информацию о зашифрованных файлах журнала аудита см. в разделе Шифрование файлов журнала аудита.
Плагин игнорирует файлы, которые были переименованы вручную и не соответствуют шаблону, а также файлы, зашифрованные паролем, больше не доступным в хранилище ключей. Плагин открывает каждый оставшийся кандидатный файл, проверяет, что файл действительно содержит JSON события аудита, и сортирует файлы по меткам времени из первого события каждого файла. Результатом является последовательность файлов, доступ к которым осуществляется с помощью функций чтения журналов:
audit_log_read()считывает события из журнала аудита или закрывает процесс чтения.audit_log_read_bookmark()возвращает закладку для самого последнего события журнала аудита. Эта закладка подходит для передачи функцииaudit_log_read()для указания места начала чтения.
audit_log_read() принимает необязательный JSON строковый аргумент, и результатом успешного вызова любой из функций является JSON строка.
Для использования функций для чтения журнала аудита следуйте этим принципам:
-
Вызовите
audit_log_read()для чтения событий, начиная с заданной позиции или текущей позиции, или для закрытия чтения:-
Для инициализации последовательности чтения журнала аудита передайте аргумент, указывающий позицию начала. Один из способов сделать это — передать закладку, возвращаемую
audit_log_read_bookmark():SELECT audit_log_read(audit_log_read_bookmark());
-
Для продолжения чтения с текущей позиции в последовательности вызовите
audit_log_read()без указания позиции:SELECT audit_log_read();
-
Для явного закрытия последовательности чтения передайте
JSONnullаргумент:SELECT audit_log_read('null');Явное закрытие чтения не является необходимым. Чтение закрывается неявно при завершении сессии или инициализации новой последовательности чтения путем вызова
audit_log_read()с аргументом, указывающим позицию начала.
-
-
Успешный вызов
audit_log_read()для чтения событий возвращаетJSONстроку, содержащую массив событий аудита:Если последнее значение в возвращаемом массиве не является
JSONnullзначением, после прочитанных событий имеются дополнительные события, и можно снова вызватьaudit_log_read()для чтения большего их количества.Если последнее значение возвращаемого массива является
JSONnullзначением, в текущей последовательности чтения больше событий для чтения не осталось.
Каждый элемент массива, не являющийся
null, представляет собой событие, представленноеJSONхешем. Например:[ { "timestamp": "2020-05-18 13:39:33", "id": 0, "class": "connection", "event": "connect", ... }, { "timestamp": "2020-05-18 13:39:33", "id": 1, "class": "general", "event": "status", ... }, { "timestamp": "2020-05-18 13:39:33", "id": 2, "class": "connection", "event": "disconnect", ... }, null ]Дополнительную информацию о содержимом событий аудита в формате JSON см. в разделе Формат файла журнала аудита JSON.
-
Вызов
audit_log_read()для чтения событий без указания позиции приводит к ошибке в следующих случаях:Последовательность чтения еще не была инициализирована путем передачи позиции в
audit_log_read().В текущей последовательности чтения больше событий для чтения не осталось; то есть
audit_log_read()ранее возвратил массив, заканчивающийсяJSONnullзначением.Последняя последовательность чтения была закрыта путем передачи
JSONnullзначения вaudit_log_read().
Для чтения событий в этих случаях необходимо сначала инициализировать последовательность чтения, вызвав
audit_log_read()с аргументом, указывающим позицию.
Для указания позиции в audit_log_read() передайте закладку, которая является JSON хешем, содержащим timestamp и id элементы, уникально идентифицирующие определенное событие. Вот пример закладки, полученной путем вызова функции audit_log_read_bookmark():
mysql> SELECT audit_log_read_bookmark();
+-------------------------------------------------+
| audit_log_read_bookmark() |
+-------------------------------------------------+
| { "timestamp": "2020-05-18 21:03:44", "id": 0 } |
+-------------------------------------------------+
Передача текущей закладки функции audit_log_read() инициализирует чтение событий, начиная с позиции закладки:
mysql> SELECT audit_log_read(audit_log_read_bookmark());
+-----------------------------------------------------------------------+
| audit_log_read(audit_log_read_bookmark()) |
+-----------------------------------------------------------------------+
| [ {"timestamp":"2020-05-18 22:41:24","id":0,"class":"connection", ... |
+-----------------------------------------------------------------------+
Аргумент функции audit_log_read() является необязательным. Если он присутствует, он может быть JSON null значением для закрытия последовательности чтения или JSON хешем.
Внутри хеш-аргумента функции audit_log_read() элементы являются необязательными и управляют аспектами операции чтения, такими как позиция начала чтения или количество считываемых событий. Следующие элементы значимы (другие элементы игнорируются):
timestamp,id: Позиция в журнале аудита первого события для чтения. Если позиция опущена из аргумента, чтение продолжается с текущей позиции. Элементыtimestampиidвместе образуют закладку, уникально идентифицирующую конкретное событие. Если аргумент функцииaudit_log_read()включает любой из этих элементов, он должен включать оба для полного указания позиции, иначе произойдет ошибка.max_array_length: Максимальное количество событий для чтения из журнала. Если этот элемент опушен, по умолчанию считывается до конца журнала или до заполнения буфера чтения, что произойдет раньше.
Примеры аргументов, принимаемых функцией audit_log_read():
-
Чтение событий, начиная с события, имеющего точное значение метки времени и идентификатора события:
audit_log_read('{ "timestamp": "2020-05-24 12:30:00", "id": 0 }') -
Как в предыдущем примере, но не более 3 событий:
audit_log_read('{ "timestamp": "2020-05-24 12:30:00", "id": 0, "max_array_length": 3 }') -
Чтение событий с текущей позиции в последовательности чтения:
audit_log_read()
-
Чтение не более 5 событий, начиная с текущей позиции в последовательности чтения:
audit_log_read('{ "max_array_length": 5 }') -
Закрытие текущей последовательности чтения:
audit_log_read('null')
Для использования бинарной JSON строки с функциями, требующими небинарной строки (например, функциями, обрабатывающими JSON значения), выполните преобразование в utf8mb4. Предположим, что вызов для получения закладки возвращает это значение:
mysql> SET @mark := audit_log_read_bookmark();
mysql> SELECT @mark;
+-------------------------------------------------+
| @mark |
+-------------------------------------------------+
| { "timestamp": "2020-05-18 16:10:28", "id": 2 } |
+-------------------------------------------------+
Вызов audit_log_read() с этим аргументом может вернуть несколько событий. Чтобы ограничить audit_log_read() чтением не более N событий, преобразуйте строку в utf8mb4, а затем добавьте к ней элемент max_array_length с этим значением. Например, чтобы прочитать одно событие, измените строку следующим образом:
mysql> SET @mark = CONVERT(@mark USING utf8mb4);
mysql> SET @mark := JSON_SET(@mark, '$.max_array_length', 1);
mysql> SELECT @mark;
+----------------------------------------------------------------------+
| @mark |
+----------------------------------------------------------------------+
| {"id": 2, "timestamp": "2020-05-18 16:10:28", "max_array_length": 1} |
+----------------------------------------------------------------------+
Изменённая строка, при передаче в audit_log_read(), производит результат, содержащий не более одного события, независимо от того, сколько их доступно.
Чтобы прочитать определённое количество событий, начиная с текущей позиции, передайте JSON хэш, который включает значение max_array_length, но не позицию. Это утверждение, вызываемое многократно, возвращает пять событий каждый раз, пока не закончатся события:
SELECT audit_log_read('{"max_array_length": 5}');
Чтобы установить ограничение на количество байтов, которые audit_log_read() считывает, установите системную переменную audit_log_read_buffer_size. Начиная с MySQL 5.7.23, значение этой переменной по умолчанию составляет 32 КБ и может быть установлено во время выполнения. Каждый клиент должен установить значение своей сессии audit_log_read_buffer_size соответствующим образом для своего использования audit_log_read(). До MySQL 5.7.23, audit_log_read_buffer_size имеет значение по умолчанию 1 МБ, влияет на всех клиентов и может быть изменено только при запуске сервера.
Для дополнительной информации о функциях чтения журнала аудита, см. Функции журнала аудита.
© 2025 Oracle
Licensed under the GPLv2 License.