Функция cot_log в Cotonti
Функция cot_log предназначена для записи события в журнал, обеспечивая возможность отслеживания различных операций в системе, таких как действия администраторов, изменения в модулях и плагинах.
Функция cot_log предназначена для записи события в журнал, обеспечивая возможность отслеживания различных операций в системе, таких как действия администраторов, изменения в модулях и плагинах.
/**
* Logs an event
*
* @param string $text Event description
* @param string $group Event group (Variants: adm/sec/ext/{ext_code} where {ext_code} is extension code ex. 'forums' or 'comments')
* @param string $type Event type
* @param string $status Event status
* @param array $extra_data Event additional data for extrafields
*/
function cot_log($text, $group = 'adm', $type = '', $status = '', $extra_data = [])
{
global $cot_plugins_enabled, $cot_modules;
// If the application has not been initialized yet
if (
empty(Cot::$cfg)
|| empty(Cot::$db)
|| !isset(Cot::$cfg['loggerlevel'])
|| Cot::$cfg['loggerlevel'] === 'none'
) {
return false;
}
$log_work = false;
if (Cot::$cfg['loggerlevel'] == 'all') {
$log_work = true;
} else {
$loggerlevel = [Cot::$cfg['loggerlevel']];
if (stripos(Cot::$cfg['loggerlevel'], '+') !== false) {
$loggerlevel = explode('+', Cot::$cfg['loggerlevel']);
}
if (
in_array('ext', $loggerlevel)
&& isset($cot_plugins_enabled)
&& is_array($cot_plugins_enabled)
&& isset($cot_modules)
&& is_array($cot_modules)
) {
foreach (array_merge(array_keys($cot_plugins_enabled), array_keys($cot_modules)) as $ext) {
if ($ext == $group) {
if (isset($cfg[$ext]['loggerlevel'])) {
if (Cot::$cfg[$ext]['loggerlevel'] != 'none') {
if (Cot::$cfg[$ext]['loggerlevel'] == 'all') {
$log_work = true;
} else {
if ($type) {
if (stripos(Cot::$cfg[$ext]['loggerlevel'], '+') !== false) {
$loggerlevel_ext = explode('+', Cot::$cfg[$ext]['loggerlevel']);
if (in_array($type, $loggerlevel_ext)) {
$log_work = true;
}
} elseif (Cot::$cfg[$ext]['loggerlevel'] == $type) {
$log_work = true;
}
}
}
}
} else {
$log_work = true;
}
break;
}
}
}
if (!$log_work && in_array($group, $loggerlevel)) {
$log_work = true;
}
}
if (!$log_work) {
return false;
}
$loger_data = [
'log_date' => (int) Cot::$sys['now'],
'log_ip' => (!empty(Cot::$usr['ip'])) ? Cot::$usr['ip'] : '',
'log_uid' => isset(Cot::$usr['id']) ? Cot::$usr['id'] : 0,
'log_name' => isset(Cot::$usr['name']) ? Cot::$usr['name'] : '',
'log_uri' => cot_cutstring(Cot::$sys['uri_curr'], 255),
'log_group' => (!empty($group) || $group == '0') ? $group : '',
'log_type' => $type,
'log_status'=> $status,
'log_text' => cot_cutstring($text, 255)
];
if (!empty($extra_data)) {
if (!empty(Cot::$extrafields[Cot::$db->logger])) {
foreach (Cot::$extrafields[Cot::$db->logger] as $exfld) {
if (isset($extra_data[$exfld['field_name']])) {
$loger_data['log_' . $exfld['field_name']] = $extra_data[$exfld['field_name']];
}
}
}
}
/* === Hook === */
foreach (cot_getextplugins('loger.event') as $pl) {
include $pl;
}
/* ===== */
Cot::$db->insert(Cot::$db->logger, $loger_data);
return true;
}
Разберем функцию cot_log построчно:
Параметры функции:
1. $text (string) — описание события, которое будет записано в журнал.
2. $group (string) — группа события (например, adm для администрирования, sec для безопасности, ext/{ext_code} для расширений, где {ext_code} — это код расширения).
3. $type (string) — тип события (например, create, update, delete).
4. $status (string) — статус события (например, success, failure).
5. $extra_data (array) — дополнительные данные, которые могут быть добавлены к записи события (например, дополнительные поля для расширений).
Алгоритм работы функции:
Проверка и инициализация:
Функция начинает с проверки нескольких условий для того, чтобы убедиться, что конфигурация системы (Cot::$cfg), база данных (Cot::$db) и уровень логирования установлены. Если они не инициализированы или уровень логирования выключен (none), функция не будет выполнять запись в журнал.
Определение необходимости логирования:
Если уровень логирования установлен как all, то логирование выполняется для всех событий.
В противном случае анализируется список разрешённых уровней логирования, и если событие соответствует этим уровням, то оно будет зафиксировано.
Проверка уровня логирования для расширений:
Если событие относится к определенному расширению (плагин или модуль), проверяется, разрешено ли логирование для этого расширения и его типа. Для этого анализируются настройки логирования для конкретного расширения.
Заполнение данных для записи в журнал:
Если логирование разрешено, собираются данные для записи в журнал, включая информацию о времени события, IP-адресе пользователя, идентификаторе пользователя, его имени, текущем URI и других данных.
Если переданы дополнительные данные через параметр $extra_data, они добавляются к данным события (например, дополнительные поля, определённые для базы данных журналов).
Расширения и плагины:
До записи события в журнал, функция вызывает хуки для внешних плагинов, которые могут дополнительно модифицировать процесс записи (например, добавление новых данных в журнал).
Запись события в базу данных:
В завершение все собранные данные записываются в таблицу журнала базы данных с помощью метода insert объекта базы данных (Cot::$db).
Возврат значения:
Если событие успешно записано в журнал, функция возвращает true. Если по каким-либо причинам запись не была произведена, возвращается false.
Применение:
Функция cot_log используется для отслеживания действий в системе, таких как создание, редактирование или удаление данных, а также для записи информации о действиях пользователей или администраторов. Это полезно для ведения учёта событий в системе, аудита и диагностики.
Пример записи события:
cot_log('New user registered', 'adm', 'create', 'success');
В этом примере фиксируется событие о регистрации нового пользователя, которое относится к группе "adm" (администрирование), имеет тип "create" (создание) и статус "success" (успешно).
Эта функция позволяет гибко настроить логирование в зависимости от конфигурации и уровня логирования, предоставляя подробную информацию о действиях в системе.
В данном примере используется функция cot_log для записи события в журнал в случае ошибки при попытке входа пользователя в систему.
if (empty($userSelectCondition)) {
Cot::$env['status'] = '401 Unauthorized';
cot_log("Log in failed, user : " . $rusername, 'users', 'login', 'error');
cot_redirect(cot_url('message', 'msg=151', '', true));
}
Разберем по шагам, что происходит:
Условие:
if (empty($userSelectCondition))
Здесь проверяется переменная $userSelectCondition, которая, вероятно, используется для проверки успешности поиска пользователя в базе данных (например, проверка пароля или существования учетной записи). Если переменная пустая, значит, пользователь не найден или не прошел проверку (например, неверный логин/пароль).
Установка статуса HTTP:
Cot::$env['status'] = '401 Unauthorized';
Устанавливается статус HTTP 401, который указывает на то, что запрос был отклонён из-за несанкционированного доступа. Это означает, что пользователь не прошел аутентификацию.
Запись события в журнал с помощью функции cot_log:
cot_log("Log in failed, user : " . $rusername, 'users', 'login', 'error');
Эта строка вызывает функцию cot_log, чтобы записать информацию о неудачной попытке входа в систему:
$text: "Log in failed, user : " . $rusername — описание события, в данном случае сообщение о том, что вход в систему не удался, и добавляется имя пользователя $rusername, что позволяет позже понять, какая учетная запись попыталась войти.
$group: 'users' — событие относится к группе пользователей, то есть это связано с системой аутентификации пользователей.
$type: 'login' — тип события, указывающий, что ошибка произошла при попытке входа.
$status: 'error' — статус события, который в данном случае указывает на ошибку, т.е. вход не удался.
Перенаправление:
cot_redirect(cot_url('message', 'msg=151', '', true));
Если вход не удался, выполняется редирект на страницу с сообщением о неудачной попытке входа. Сообщение с кодом 151 вероятно соответствует ошибке входа и будет отображаться пользователю.
Зачем используется cot_log в этом контексте?
Функция cot_log используется для записи в журнал информации о неудачной попытке входа в систему. Это важно для:
Отслеживания активности: можно узнать, кто именно (какой пользователь) пытался войти в систему, что полезно для безопасности.
Аудита: если попытки входа часто неудачны, это может быть признаком атак или попыток несанкционированного доступа.
Диагностики: помогает администраторам системы диагностировать проблемы с аутентификацией пользователей.
Пример лога:
Запись в журнал будет выглядеть примерно так:
[Дата и время] [IP-адрес] [Пользователь] [URL] users login error Log in failed, user: johndoe
Эта информация будет доступна в журнале для дальнейшего анализа.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 22.01.2025 11:48
- Последнее обновление: 22.01.2025 11:50