Поиск данных аудита (запросы, непосредственное сохранение)
Если требуется искать данные аудита, используйте сервис QueryAuditHistoryWithQueryCriteria. Подсистема аудита поддерживает возможности фильтрации, сортировки и разбивки на страницы для этого сервиса с помощью параметра query. Используется возможность запроса к базе данных фильтровать и сортировать данные. Запрос также принимает входные данные из специальных виджетов, созданных для улучшения фильтрации и обеспечения разбивки на страницы для результатов.
* 
Можно также использовать исходный сервис QueryAuditHistory. Однако этот сервис будет исключен в будущих выпусках ThingWorx Platform. Если вы предпочитаете использовать его, см. дополнительные сведения в разделе Поиск данных аудита (запросы, таблица данных).
Настоящий раздел организован следующим образом:
2. Поиск с ограниченным контекстом
Основные сведения о запросах
Сервис QueryAuditHistoryWithQueryCriteria имеет следующий формат:

QueryAuditHistoryWithQueryCriteria(maxItems [INTEGER], startDate [DATETIME], endDate [DATETIME],
auditCategory[STRING],query[QUERY], locale[STRING])
Параметры для этого сервиса описаны в следующей таблице.
Параметры для сервиса QueryAuditHistoryWithQueryCriteria
Параметр
Описание
Значение по умолчанию
maxItems
Максимальное число результатов, возвращаемых из запроса. (INTEGER)
* 
Если query содержит pageSize в запросе, этот параметр игнорируется.
500 элементов
locale
Сокращение имени языка, в котором должны возвращаться результаты. (STRING). Например, fr для французского языка или zh_CN для китайского языка (Китай). Список языковых настроек, поддерживаемых ThingWorx, см. в разделе Поддерживаемые языковые настройки ниже.
Языковая настройка зарегистрированного пользователя, отправившего запрос
startDate
Дата и время. Запрос будет искать сообщения аудита, начиная с даты и времени, которые указаны здесь. (DATETIME)
Не указано
endDate
Дата и время. Запрос останавливает поиск сообщений аудита по достижении указанных здесь даты и времени сообщений. (DATETIME)
Не указано
query
Строка запроса (в формате JSON). Пример запроса JSON, который можно использовать, следует за таблицей.
Этот параметр используется в нескольких сервисах ThingWorx. Полные сведения см. в разделе Параметр запроса для сервиса запросов.
Н/Д
По умолчанию запрос возвращает 500 строк. Чтобы изменить число строк, возвращаемых запросом, можно задать в параметре maxItems требуемое число строк. Существует верхний предел числа строк, который можно указать в параметре maxItems. По умолчанию этот предел составляет 5000 строк. Системный администратор может задать этот предел при конфигурировании подсистемы аудита. Системные администраторы должны обратиться к разделу Конфигурация подсистемы аудита.
Однако если ожидается значительно большее число результатов, используйте QUERY.
Ниже приведен пример запроса в формате JSON:
Пример 1. Запрос в формате JSON
Следующий запрос в формате JSON показывает, как можно построить фильтры, сортировку и постраничную разбивку для использования с сервисом QueryAuditHistoryWithQueryCriteria (реализация непосредственного сохранения):

{
"filters": {
"type": "EQ",
"fieldName": "user",
"value": "Administrator",
"isCaseSensitive": false
},
"sorts": {
"fieldName": "timestamp",
"isAscending": true,
"isCaseSensitive": true
},
"pagination":{
"pageSize":50,
"pageNumber":2
}
}
Поиск из контекста вещи
Сервис QueryAuditHistory для вещи работает аналогично сервисам QueryAuditHistory и QueryAuditHistoryWithQueryCriteria в подсистеме аудита, но с дополнительными ограничениями. Общее поведение и все параметры этого сервиса являются такими же, как и у сервиса подсистемы аудита. Ниже перечислены ограничения для этого сервиса.
1. Проверяет, является ли пользователь, вызывающий сервис, участником группы "Аудиторы". В противном случае результаты будут отфильтрованы по разрешениям этого пользователя.
2. При вызове сервиса QueryAuditHistory из конкретной вещи в поиске используются идентификаторы сущностей вместо наименований.
В следующей таблице описаны параметры для сервиса QueryAuditHistory в вещи.
Имя параметра
Описание
maxItems
Максимальное число возвращаемых элементов. Базовый тип для этого параметра - NUMBER.
startDate
Самая ранняя дата аудита для запроса. Базовый тип для этого параметра - DATETIME.
endDate
Последняя дата аудита для запроса. Базовый тип для этого параметра - DATETIME.
query
Определение запроса. Базовый тип для этого параметра - QUERY. Форматировать запрос как объект JSON.
locale
Языковая настройка таблицы локализации, которая используется для локализации результатов. Базовый тип для этого параметра - STRING.
Чтобы поддерживать запросы с ограниченным контекстом вещи для подсистемы аудита, была добавлена группа пользователей с именем "Аудиторы". Эта группа позволяет пользователям, не являющимся администраторами, видеть полные результаты сервиса QueryAuditHistory при его вызове из вещей, которые являются для них видимыми.
Например, администратор создает вещь ExampleThing и предоставляет доступ к этой вещи пользователю User_A, который является участником группы "Аудиторы". Администратор также предоставил доступ к этой вещи пользователю User_B, который не находится в каких-либо специальных группах пользователей. Если каждый пользователь выполняет сервис QueryAuditHistory из ExampleThing, ожидаются следующие результаты:
Пользователь
Участие в группах
Ожидаемый результат
Администратор
Администраторы
Возвращенная таблица InfoTable содержит все записи аудита, относящиеся к ExampleThing.
User_A
Аудиторы
Возвращенная таблица InfoTable содержит все записи аудита, относящиеся к ExampleThing.
User_B
Вне специальных групп
Возвращенная InfoTable содержит записи аудита, связанные только с User_B.
Запрос наследованных данных аудита при включении непосредственного сохранения
При включении непосредственного сохранения в конфигурации подсистемы аудита все сервисы, которые обрабатывают или используют данные, переключаются к модели непосредственного сохранения. Доступными будут только те данные, которые были созданы при ее включении. Чтобы разрешить пользователям доступ к данным, сохраненным в наследованном формате (записи таблицы данных в сущности AuditDataTable), другим способом, если доступ к этим записям должен быть объяснен/предоставлен.
* 
Рекомендуется экспортировать наследованные данные аудита в холодное хранилище в окне обслуживания перед переключением на непосредственное сохранение. Поскольку это не всегда возможно, в остальной части этого раздела предлагаются полезные обходные решения.
Можно использовать сущность AuditDataTable, чтобы запросить ("унаследованную") информацию аудита 1.0. Сущность AuditDataTable является частью подмножества сущностей "таблица данных", для которых существуют дополнительные ограничения, такие как запрещение обновления записей, и которые могут использовать большинство тех же сервисов, что и другие сущности таблиц данных.
Один из таких сервисов - QueryDataTableEntries. Этот сервис позволяет использовать теги данных, источники и запросы JSON для фильтрации полученных результатов.
* 
Теги данных для записей аудита всегда пусты.
Чтобы выполнить этот сервис, укажите те же параметры запроса JSON, что и при выполнении QueryAuditHistory или QueryAuditHistoryWithQueryCriteria. В следующем примере запроса JSON используются фильтры пользователя и метки времени и сортируются записи от новых к старым.
* 
Постраничная разбивка не поддерживается сервисами запросов таблиц данных.
Пример 2. Запрос JSON

{
"filters": {
"type": "AND",
"filters": [
{
"type": "EQ",
"fieldName": "user",
"value": "Administrator",
"isCaseSensitive": true
}, {
"type": "BETWEEN",
"fieldName": "timestamp",
"from": 1577836800000,
"to": 1609459199000
}
]
},
"sorts": [
{
"fieldName": "timestamp",
"isAscending": false
}
]
}
* 
Этот сервис возвращает исходные (непреобразованные) записи аудита вместе с информацией о записях аудита. Дополнительные сведения о преобразовании см. в следующем разделе.
Запись пользовательского сервиса QueryAuditHistory
Из-за природы данных, возвращаемых сервисом QueryDataTableEntries, они могут не всегда соответствовать потребностям среднего пользователя. Чтобы получить ту же информацию, что и в сервисах QueryAuditHistory и QueryAuditHistoryWithQueryCriteria подсистемы аудита, разработчики могут написать сервис оболочки. Этот сервис должен выполнять следующие основные задачи:
Запрос данных из AuditDataTable
Применять преобразование лексем локализации (поля message и category)
Применять подстановку переменных для замен аргументов сообщений (поле message)
Удалять информацию записей таблицы данных
Ниже приведен пример такого сервиса.
Пример 3. Пользовательский сервис QueryAuditHistory
Этот сервис написана на простом языке JavaScript и может использоваться для любой подходящей сущности ThingWorx.

// Query auditing data with provided parameters
var result = Things["AuditDataTable"].QueryDataTableEntries({
maxItems: maxItems /* NUMBER */,
values: undefined /* INFOTABLE */,
query: query /* QUERY */,
source: source /* STRING */,
tags: undefined /* TAGS */
});
// Applying translation
var categoryCache = {};
var messageCache = {};
var size = result.getRowCount();
for (var i = 0; i < size; i++) {
var row = result.getRow(i);
row.message = applyReplacements(getTranslatedToken(row.message, locale, messageCache), row.messageArgs);
row.auditCategory = getTranslatedToken(row.auditCategory, locale, categoryCache);
}
// Removing non AuditHistory columns
result.RemoveField("id");
result.RemoveField("key");
result.RemoveField("tags");
result.RemoveField("location");
result.RemoveField("messageArgs");
// Helper translation and caching function
function getTranslatedToken(token, language, cache) {
if (cache[token] == null || cache[token] == undefined) {
var params = {
language: language /* STRING */,
token: token /* STRING */
};
var translation = Resources["RuntimeLocalizationFunctions"].GetEffectiveTokenForLanguage(params);
cache[token] = translation;
return translation;
} else {
return cache[token];
}
}
// Helper variable replacement function
function applyReplacements(translation, replacementsInfoTable) {
var filledInTranslation = translation;
var replacements = replacementsInfoTable.getRow(0);
for (var key in replacements) {
if (replacements[key] != null && replacements[key] != undefined) {
filledInTranslation = filledInTranslation.replace(new RegExp("__" + key + "__", "g"), replacements[key]);
}
}
return filledInTranslation;
}
Поддерживаемые языковые настройки
На следующем рисунке показаны языковые настройки, поддерживаемые ThingWorx.
Было ли это полезно?