...
В таком случае коллектор нужно настроить следующим образом:
Code Block |
---|
title | conf/localetc/hydra/hmed/collecting/collectors/defaultcollector.yml |
---|
|
collectors:
# файловые коллекторы
file:
# спецификация коллектора
switch:
# спецификация парсера для разбора прочитанных CDR
parser: plain/switch_2
# спецификации путей к файлам CDR
paths:
- directory: /var/cdr/ # путь к файлам с CDR
filename_pattern: ^cdr_\d+\.log$ # регулярное выражение, соответствующее формату имени файлов с CDR |
...
Для разбора файла такого вида используются следующие параметры конфигурации:
Code Block |
---|
title | conf/lcoaletc/hydra/hmed/collecting/parsers/defaultparser.yml |
---|
|
parsers:
plain:
# спецификация парсера
switch_2:
cdr_delimiter: "\n" # разделитель между CDR в файле (символ новой строки)
preprocessors:
# предобработчики строки перед разбором
- type: trim # обрезание краевых символов
direction: left # край строки, возможные значения: left, right, both
char: ' ' # символ
- type: substring # взятие подстроки ('test' -> 'es')
begin: 1 # начальная позиция (будет обрезан первый символ строки)
end: -1 # конечная позиция (значение -1 означает, что подстрока будет взята до последнегопредпоследнего символа строки)
records:
- matcher:
# регулярное выражение для разбора CDR на поля
# 1 2 3 4 5 6 7
# trk_a station_a trk_b station_b day month year hour minute second dur status
pattern: ^(\w+) (\d+|-)[^\s]* (\w+) (\d+)[^\s]* (\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\d+) (\d+)$
fields:
map:
# соответствие полей CDR и строки, разобранной регулярным выражением
# первое поле $g1, второе $g2 и т.д.
# подстановка $g0 содержит всю строку
trunk_a: $g1
station_a: $g2
trunk_b: $g3
station_b: $g4
call_datetime: $g5
duration_sec: int($g6) # приведение к целому числу
termination_code: $g7
- matcher:
min_length: 50 # для тех CDR, которые не удовлетворяют первому регулярному выражению и имеют длину >= 50 символов
fields:
delimiter: '\s+' # используем разделитель для получения полей (поддерживаются регулярные выражения)
map:
trunk_a: $f1 # первое поле в массиве строк после разбиения исходной строки
station_a: $f2 # второе поле и т. д.
trunk_b: $f3
station_b: $f4
call_datetime: $f5
duration_sec: int($f6)
termination_code: $f7
entire_cdr: $f0 # в переменной $f хранится вся строка с CDR |
Таким образом на выходе коллектора получатся разобранные CDR в формате JSON вида:
Code Block |
---|
title | Разобранная CDR |
---|
collapse | true |
---|
|
[
{trunk_a: 'C2905117',
station_a: '4999224453',
trunk_b: 'C2505821',
station_b: '84997242904',
call_datetime: '31-01-2012 18:58:10',
duration_sec: 4,
termination_code: '16'},
...
] |