#!/bin/bash # Проверка backend3/logs модуля «Системные журналы» (alterator-logs) на снимке журнала B=/usr/lib/alterator/backend3/logs F=/tmp/att-frozen.json journalctl --system -n9998 --no-pager --output json --output-fields MESSAGE,_PID,_HOSTNAME,SYSLOG_IDENTIFIER,PRIORITY > $F source <(sed -n '/^log_colors=/p;/^journald_log_format()/,/^)/p' $B) fmt() { jq -r '.__REALTIME_TIMESTAMP, ._HOSTNAME, ._PID, .MESSAGE, .SYSLOG_IDENTIFIER, .PRIORITY' | journald_log_format; } strip() { sed -e 's/<[^>]*>//g' -e 's/^ *//'; } echo "# rpm -q alterator-logs: $(rpm -q alterator-logs)" echo "# Снимок: journalctl --system -n9998 ... (как в backend3/logs:194-195), строк: $(wc -l < $F)" echo echo "== 1. Нет SYSLOG_IDENTIFIER или _PID -> «null» в выводе модуля ==" for sel in '.SYSLOG_IDENTIFIER==null and ._PID=="893"' '.SYSLOG_IDENTIFIER=="kernel"' '.SYSLOG_IDENTIFIER=="systemd-sysv-generator"'; do n=$(jq -r "select($sel) | input_line_number" $F | tail -1) echo "-- строка $n снимка, вывод модуля (journald_log_format):" sed -n "${n}p" $F | fmt | strip | cut -c1-200 ts=$(sed -n "${n}p" $F | jq -r .__REALTIME_TIMESTAMP) echo "-- то же сообщение в journalctl -o short:" journalctl --system -o short --no-pager --since "@$((ts/1000000))" --until "@$((ts/1000000+1))" | grep -F "$(sed -n "${n}p" $F | jq -r '.MESSAGE|tostring|.[0:40]')" | head -1 | cut -c1-200 echo done echo "== 2. Страница содержит size+1 строк, граничная строка повторяется ==" echo "Код: stop=\$((start+size)) (logs:231), sed -n -e \"\$start,\$stop p\" (logs:166)" for start in 1 101; do stop=$((start+100)) cnt=$(sed -n -e "$start,$stop p" -e "$stop q" $F | wc -l) echo "start=$start size=100 -> stop=$stop, строк на странице: $cnt (подпись «Строки $start-$stop»)" done a=$(sed -n -e "1,101 p" -e "101 q" $F | tail -1 | md5sum | cut -c1-12) b=$(sed -n -e "101,201 p" -e "201 q" $F | head -1 | md5sum | cut -c1-12) echo "md5 последней строки стр. 1: $a; md5 первой строки стр. 2: $b -> $( [ "$a" = "$b" ] && echo 'одна и та же запись' || echo 'разные')" echo "Реальный бэкенд (alterator-cmdline), «Первая страница», 100 строк:" alterator-cmdline -l /logs action read name journald size 100 first 1 2>/dev/null | grep -E '^(start|size):' echo "записей в text: $(alterator-cmdline -l /logs action read name journald size 100 first 1 2>/dev/null | grep -o '
' | wc -l)" echo echo "== 3. Смена «Показывать» 20 -> 100 на последней странице: start не пересчитывается ==" echo "Код: logs:207-209 меняет только size; stop обрезается до total." out=$(alterator-cmdline -l /logs action read name journald start 9980 size 20 new_size 100 2>/dev/null) echo "$out" | grep -E '^(start|size):' echo "записей в text: $(echo "$out" | grep -o '
' | wc -l) (ожидалось 100: строки 9899-9998)" echo echo "== 4. Многострочный MESSAGE обрывает страницу ==" n=$(jq -r 'select(._PID=="178131" and (.MESSAGE|tostring|test("\n"))) | input_line_number' $F | tail -1) echo "Запись $n: alterator-manager, MESSAGE из нескольких строк:" sed -n "${n}p" $F | jq -r '.MESSAGE' | sed 's/^/ /' start=$((n-10)); stop=$((start+20)) echo "Страница start=$start stop=$stop (21 запись в снимке) через journald_log_format:" sed -n "${start},${stop}p" $F | fmt > /tmp/att-page.html 2>/tmp/att-page.err echo "выведено записей: $(grep -c '
' /tmp/att-page.html) из $((stop-start+1))" echo "stderr: $(cat /tmp/att-page.err)" echo "Причина: jq печатает MESSAGE в несколько строк, read -r (logs:140-145) сдвигается," echo "priority получает строку текста, \${log_colors[\$priority]} даёт ошибку арифметики," echo "подоболочка journald_log_format завершается, остаток страницы теряется." rm -f /tmp/att-frozen.json /tmp/att-page.html /tmp/att-page.err