Skip to content

Commit

Permalink
Дорабатываем парсер SysLog
Browse files Browse the repository at this point in the history
  • Loading branch information
anyks committed Oct 18, 2024
1 parent 12215a2 commit 42c89dd
Show file tree
Hide file tree
Showing 7 changed files with 1,302 additions and 648 deletions.
2 changes: 1 addition & 1 deletion html/download.html
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
</svg>
<span class="fs-4"><strong>ANYKS</strong> - formatter</span>
</a>
<h5>v1.0.1</h5>
<h5>v1.0.2</h5>
</header>
<!-- Заголовок КОНЕЦ -->
<!-- Контент НАЧАЛО -->
Expand Down
20 changes: 10 additions & 10 deletions include/grok.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@
#include <vector>
#include <iostream>
#include <unordered_map>
#include <pcre2posix.h>
#include <cityhash/city.h>
#include <nlohmann/json.hpp>
#include <pcre2posix.h>

/**
* Модули AWH
Expand Down Expand Up @@ -84,9 +84,9 @@ namespace anyks {
* Mutex структура рабочих мютексов
*/
typedef struct Mutex {
mutex cache; // Мютекс контроля кэша
mutex mapping; // Мютекс контроля собранных соответствий
mutex patterns; // Мютекс контроля собранных шаблонов
std::mutex cache; // Мютекс контроля кэша
std::mutex mapping; // Мютекс контроля собранных соответствий
std::mutex patterns; // Мютекс контроля собранных шаблонов
} mtx_t;
/**
* Var Класс работы с переменными
Expand All @@ -99,7 +99,7 @@ namespace anyks {
friend class Grok;
private:
// Мютекс для блокировки потока
mutex _mtx;
std::mutex _mtx;
private:
// Список имён переменных
vector <string> _names;
Expand Down Expand Up @@ -157,15 +157,15 @@ namespace anyks {
mutable var_t _variables;
private:
// Список ключей добавленных шаблонов
set <string> _keys;
std::set <string> _keys;
private:
// Схема соответствий ключей
unordered_map <string, string> _mapping;
std::unordered_map <string, string> _mapping;
// Список шаблонов для работы
unordered_map <string, string> _patterns;
std::unordered_map <string, string> _patterns;
private:
// Объект кэша работы модуля
map <uint64_t, unique_ptr <cache_t>> _cache;
std::map <uint64_t, std::unique_ptr <cache_t>> _cache;
private:
// Объект фреймворка
const fmk_t * _fmk;
Expand Down Expand Up @@ -250,7 +250,7 @@ namespace anyks {
* mapping Метод извлечения карты полученных значений
* @return карта полученных значений
*/
const unordered_map <string, string> & mapping() const noexcept;
const std::unordered_map <string, string> & mapping() const noexcept;
public:
/**
* get Метод извлечения записи по ключу
Expand Down
2 changes: 1 addition & 1 deletion include/lib.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#define __ACU_CONFIG__

// Версия приложения
#define ACU_VERSION "1.0.1"
#define ACU_VERSION "1.0.2"
// Короткое название библиотеки
#define ACU_SHORT_NAME "ACU"
// Название библиотеки
Expand Down
56 changes: 50 additions & 6 deletions include/syslog.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <ctime>
#include <cmath>
#include <stack>
#include <mutex>
#include <vector>
#include <string>
#include <iomanip>
Expand All @@ -39,6 +40,7 @@
*/
#include <sys/fmk.hpp>
#include <sys/log.hpp>
#include <sys/reg.hpp>

// Объявляем пространство имен
using namespace std;
Expand All @@ -64,6 +66,28 @@ namespace anyks {
RFC3164 = 0x01, // Стандарт RFC 3164
RFC5424 = 0x02 // Стандарт RFC 5424
};
/**
* Поддерживаемые режимы парсинга
*/
enum class mode_t : uint8_t {
NONE = 0x00, // Режим парсинга не установлен
NATIVE = 0x01, // Режим парсинга установлен как нативный
REGEXP = 0x02 // Режим парсинга установлен как регулярные выражения
};
private:
/**
* RegExp Структура регулярных выражений
*/
typedef struct RegExp {
regexp_t::exp_t mess; // Регулярное выражение для извлечения сообщений для RFC5424
regexp_t::exp_t items; // Регулярное выражение для извлечения параметров сообщения RFC5424
regexp_t::exp_t date1; // Регулярное выражение для распознавания формат даты (Sat Jan 8 20:07:41 2011)
regexp_t::exp_t date2; // Регулярное выражение для распознавания формат даты (2024-10-04 13:29:47)
regexp_t::exp_t date3; // Регулярное выражение для распознавания формат даты (2003-10-11T22:14:15.003Z)
regexp_t::exp_t params; // Регулярное выражение для извлечения параметров сообщений RFC5424
regexp_t::exp_t rfc3164; // Регулярное выражение для парсинга всего сообщения RFC3164
regexp_t::exp_t rfc5424; // Регулярное выражение для парсинга части сообщения RFC5424
} exp_t;
private:
// Поддерживаемый стандарт
std_t _std;
Expand All @@ -72,6 +96,9 @@ namespace anyks {
uint8_t _ver;
// Приоритет сообщения
uint16_t _pri;
private:
// Режим парсинга
mode_t _mode;
private:
// Название сообщения
string _app;
Expand All @@ -90,9 +117,17 @@ namespace anyks {
string _format;
// Штамп времени сообщения
time_t _timestamp;
private:
// Объект собранных регулярных выражений
exp_t _exp;
// Объект работы с регулярными выражениями
regexp_t _reg;
private:
// Мютекс для блокировки потока
std::recursive_mutex _mtx;
private:
// Список структурированных данных
unordered_map <string, unordered_map <string, string>> _sd;
std::unordered_map <string, std::unordered_map <string, string>> _sd;
private:
// Объект фреймворка
const fmk_t * _fmk;
Expand Down Expand Up @@ -140,13 +175,13 @@ namespace anyks {
* @param id идентификатор структурированных данных
* @return список структурированных данных
*/
const unordered_map <string, string> & sd(const string & id) const noexcept;
const std::unordered_map <string, string> & sd(const string & id) const noexcept;
/**
* sd Метод установки структурированных данных
* @param id идентификатор структурированных данных
* @param sd список структурированных данных
*/
void sd(const string & id, const unordered_map <string, string> & sd) noexcept;
void sd(const string & id, const std::unordered_map <string, string> & sd) noexcept;
public:
/**
* std Метод получения стандарта сообщения
Expand Down Expand Up @@ -277,6 +312,17 @@ namespace anyks {
* @param dump данные в формате JSON
*/
void dump(const json & dump) noexcept;
public:
/**
* mode Метод получения установленного режима парсинга
* @return установленный режим парсинга
*/
mode_t mode() const noexcept;
/**
* mode Метод установки режима парсинга
* @param mode режим парсинга для установки
*/
void mode(const mode_t mode) noexcept;
public:
/**
* Оператор вывода данные контейнера в качестве строки
Expand Down Expand Up @@ -315,9 +361,7 @@ namespace anyks {
* @param fmk объект фреймворка
* @param log объект для работы с логами
*/
SysLog(const fmk_t * fmk, const log_t * log) noexcept :
_std(std_t::AUTO), _ver(1), _pri(0), _app{"-"}, _host{"-"}, _pid(0),
_mid{"-"}, _message{""}, _format{FORMAT}, _timestamp(0), _fmk(fmk), _log(log) {}
SysLog(const fmk_t * fmk, const log_t * log) noexcept;
} syslog_t;
/**
* Оператор [>>] чтения из потока SysLog контейнера
Expand Down
14 changes: 6 additions & 8 deletions src/csv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -495,11 +495,11 @@ json anyks::CSV::dump() const noexcept {
// Добавляем полученное значение в массив
result[key].push_back(::stod(item));
// Если число является булевым истинным значением
else if(item.compare("true") == 0)
else if(this->_fmk->compare("true", item))
// Добавляем полученное значение в массив
result[key].push_back(true);
// Если число является булевым ложным значением
else if(item.compare("false") == 0)
else if(this->_fmk->compare("false", item))
// Добавляем полученное значение в массив
result[key].push_back(false);
// Добавляем полученное значение в массив
Expand All @@ -520,9 +520,7 @@ json anyks::CSV::dump() const noexcept {
// Выполняем перебор всего списка строк
for(auto j = 0; j < this->_mapping.at(i).size(); j++){
// Получаем строку значения
const string item = this->_mapping.at(i).at(j);
// Выполняем приведение строки к нижнему регистру
this->_fmk->transform(item, fmk_t::transform_t::LOWER);
const string & item = this->_mapping.at(i).at(j);
// Если запись является числом
if(this->_fmk->is(item, fmk_t::check_t::NUMBER)){
// Получаем переданное число
Expand All @@ -538,15 +536,15 @@ json anyks::CSV::dump() const noexcept {
// Добавляем полученное значение в массив
result.back().push_back(::stod(item));
// Если число является булевым истинным значением
else if(item.compare("true") == 0)
else if(this->_fmk->compare("true", item))
// Добавляем полученное значение в массив
result.back().push_back(true);
// Если число является булевым ложным значением
else if(item.compare("false") == 0)
else if(this->_fmk->compare("false", item))
// Добавляем полученное значение в массив
result.back().push_back(false);
// Добавляем полученное значение в массив
else result.back().push_back(this->_mapping.at(i).at(j));
else result.back().push_back(item);
}
}
}
Expand Down
32 changes: 16 additions & 16 deletions src/grok.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
*/
void anyks::Grok::Var::reset() noexcept {
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx);
const lock_guard <std::mutex> lock(this->_mtx);
// Выполняем удаление названий переменных
this->_names.clear();
// Выполняем очистку шаблонов переменных
Expand Down Expand Up @@ -56,7 +56,7 @@ string anyks::Grok::Var::get(const string & text, const uint8_t index) noexcept
// Получаем строку текста для поиска
const char * str = text.c_str();
// Создаём объект матчинга
unique_ptr <regmatch_t []> match(new regmatch_t [i->second.re_nsub + 1]);
std::unique_ptr <regmatch_t []> match(new regmatch_t [i->second.re_nsub + 1]);
// Выполняем разбор регулярного выражения
if(pcre2_regexec(&i->second, str, i->second.re_nsub + 1, match.get(), REG_NOTEMPTY) == 0){
// Название полученной переменной
Expand Down Expand Up @@ -104,7 +104,7 @@ void anyks::Grok::Var::push(const string & name, const string & pattern) noexcep
// Если название переменной и шаблон регулярного выражения переданы
if(!name.empty() && !pattern.empty()){
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx);
const lock_guard <std::mutex> lock(this->_mtx);
// Добавляем название переменной
this->_names.push_back(name);
// Добавляем шаблон регулярного выражения
Expand Down Expand Up @@ -142,7 +142,7 @@ void anyks::Grok::Var::push(const string & name, const string & pattern) noexcep
*/
void anyks::Grok::init() noexcept {
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.patterns);
const lock_guard <std::mutex> lock(this->_mtx.patterns);
// Если список шаблонов не собран
if(this->_patterns.empty()){
// Выполняем добавление базовых шаблонов
Expand Down Expand Up @@ -218,7 +218,7 @@ void anyks::Grok::clear() noexcept {
// Выполняем сброс собранных данных
this->reset();
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.patterns);
const lock_guard <std::mutex> lock(this->_mtx.patterns);
// Выполняем удаление списка ключей
this->_keys.clear();
// Очищаем список шаблонов
Expand All @@ -229,7 +229,7 @@ void anyks::Grok::clear() noexcept {
*/
void anyks::Grok::reset() noexcept {
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.mapping);
const lock_guard <std::mutex> lock(this->_mtx.mapping);
// Очищаем схему соответствий ключей
this->_mapping.clear();
// Выполняем сброс параметров переменной
Expand All @@ -242,7 +242,7 @@ void anyks::Grok::clearPatterns() noexcept {
// Если список ключей существует
if(!this->_keys.empty()){
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.patterns);
const lock_guard <std::mutex> lock(this->_mtx.patterns);
// Выполняем перебор списка ключей
for(auto i = this->_keys.begin(); i != this->_keys.end();){
// Выполняем удаление шаблона
Expand All @@ -261,7 +261,7 @@ void anyks::Grok::pattern(const string & key, const string & val) noexcept {
// Если параметры шаблона переданы
if(!key.empty() && !val.empty()){
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.patterns);
const lock_guard <std::mutex> lock(this->_mtx.patterns);
// Выполняем добавление шаблона
this->_keys.emplace(key);
// Выполняем добавление шаблона
Expand Down Expand Up @@ -357,7 +357,7 @@ uint64_t anyks::Grok::build(string & text, const bool pure, const bool init, con
// Получаем строку текста для поиска
const char * str = text.c_str();
// Создаём объект матчинга
unique_ptr <regmatch_t []> match(new regmatch_t [this->_reg1.re_nsub + 1]);
std::unique_ptr <regmatch_t []> match(new regmatch_t [this->_reg1.re_nsub + 1]);
// Если возникла ошибка
if(pcre2_regexec(&this->_reg1, str, this->_reg1.re_nsub + 1, match.get(), REG_NOTEMPTY) > 0)
// Выходим из цикла корректировки
Expand All @@ -384,7 +384,7 @@ uint64_t anyks::Grok::build(string & text, const bool pure, const bool init, con
// Получаем строку текста для поиска
const char * str = text.c_str();
// Создаём объект матчинга
unique_ptr <regmatch_t []> match(new regmatch_t [this->_reg2.re_nsub + 1]);
std::unique_ptr <regmatch_t []> match(new regmatch_t [this->_reg2.re_nsub + 1]);
// Если возникла ошибка
if(pcre2_regexec(&this->_reg2, str, this->_reg2.re_nsub + 1, match.get(), REG_NOTEMPTY) > 0)
// Выходим из цикла корректировки
Expand Down Expand Up @@ -484,7 +484,7 @@ uint64_t anyks::Grok::build(string & text, const bool pure, const bool init, con
// Выполняем блокировку потока
this->_mtx.cache.lock();
// Выполняем создании записи кэша
auto ret = const_cast <grok_t *> (this)->_cache.emplace(cid, unique_ptr <cache_t> (new cache_t));
auto ret = const_cast <grok_t *> (this)->_cache.emplace(cid, std::unique_ptr <cache_t> (new cache_t));
// Выполняем разблокировку потока
this->_mtx.cache.unlock();
// Выполняем установку регулярного выражения
Expand Down Expand Up @@ -627,7 +627,7 @@ bool anyks::Grok::parse(const string & text, const uint64_t cid) noexcept {
// Получаем строку текста для поиска
const char * str = text.c_str();
// Создаём объект матчинга
unique_ptr <regmatch_t []> match(new regmatch_t [i->second->reg.re_nsub + 1]);
std::unique_ptr <regmatch_t []> match(new regmatch_t [i->second->reg.re_nsub + 1]);
// Выполняем разбор регулярного выражения
const int error = pcre2_regexec(&i->second->reg, str, i->second->reg.re_nsub + 1, match.get(), REG_NOTEMPTY);
// Если ошибок не получено
Expand All @@ -647,7 +647,7 @@ bool anyks::Grok::parse(const string & text, const uint64_t cid) noexcept {
// Если название переменной получено
if(!key.empty()){
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.mapping);
const lock_guard <std::mutex> lock(this->_mtx.mapping);
// Выполняем добавления полученных данных в схему соответствий
this->_mapping.emplace(key, value);
}
Expand Down Expand Up @@ -726,7 +726,7 @@ bool anyks::Grok::parse(const string & text, const string & rule) noexcept {
// Получаем строку текста для поиска
const char * str = text.c_str();
// Создаём объект матчинга
unique_ptr <regmatch_t []> match(new regmatch_t [reg.re_nsub + 1]);
std::unique_ptr <regmatch_t []> match(new regmatch_t [reg.re_nsub + 1]);
// Выполняем разбор регулярного выражения
const int error = pcre2_regexec(&reg, str, reg.re_nsub + 1, match.get(), REG_NOTEMPTY);
// Если ошибок не получено
Expand All @@ -746,7 +746,7 @@ bool anyks::Grok::parse(const string & text, const string & rule) noexcept {
// Если название переменной получено
if(!key.empty()){
// Выполняем блокировку потока
const lock_guard <mutex> lock(this->_mtx.mapping);
const lock_guard <std::mutex> lock(this->_mtx.mapping);
// Выполняем добавления полученных данных в схему соответствий
this->_mapping.emplace(key, value);
}
Expand Down Expand Up @@ -812,7 +812,7 @@ json anyks::Grok::dump() const noexcept {
* mapping Метод извлечения карты полученных значений
* @return карта полученных значений
*/
const unordered_map <string, string> & anyks::Grok::mapping() const noexcept {
const std::unordered_map <string, string> & anyks::Grok::mapping() const noexcept {
// Выводим список полученных значений
return this->_mapping;
}
Expand Down
Loading

0 comments on commit 42c89dd

Please sign in to comment.