Выделение журнала потокового приложения

#vim #syntax-highlighting #folding #logfiles

#vim #подсветка синтаксиса #сворачивание #файлы журналов

Вопрос:

У меня есть файл журнала многопоточного приложения. Каждая строка имеет хорошо известный формат (например, 3-е поле — идентификатор потока). при этом одно из полей является идентификатором потока. Я надеюсь, что я не пытаюсь изобретать велосипед 🙂

В любом случае, для облегчения чтения файла я подумал о двух вариантах, которые могли бы помочь:

  1. Выделите все строки с тем же идентификатором потока, что и текущая строка.

  2. При нажатии некоторой клавиши все строки с другим идентификатором потока сворачиваются, повторное нажатие клавиши разворачивает строки.

Каркас для обоих предметов приветствуется.

Комментарии:

1. Классная идея, но я вижу здесь только декларативные предложения. В чем ваш вопрос?

2. На самом деле я ищу способ реализовать оба описанных элемента, поскольку vim хорошо работает через удаленное соединение.

3. Является ли формат журнала удобным для grep?

4. Да, это так. Я могу написать регулярное выражение для идентификации всех строк, принадлежащих одному и тому же идентификатору потока

Ответ №1:

Выделение шаблоном

Вот функция для выделения (и другая для очистки) всех строк, содержащих данный шаблон, с выделением акцента на самом шаблоне. Регистр «последнего поиска» @/ также настроен на запрошенный шаблон, поэтому n / N в обычном режиме выполняется переход вперед / назад по соответствующим строкам. <Leader>l (эквивалент l для большинства установок) — это ярлык для выделения строк, которые содержат WORD под вашим курсором.

 highlight def link xHiLine Special
highlight def link xHiPatt String

function! ClearHighlight()
    syn clear xHiLine
    syn clear xHiPatt
    let @/ = ''
endfunction

function! HighlightPattern(patt)
    call ClearHighlight()
    if a:patt != ''
        echo "Highlighting pattern: ".a:patt
        exec "syn match xHiPatt "".a:patt."" contained"
        exec "syn match xHiLine ".*".a:patt.".*" contains=xHiPatt"
        let @/ = a:patt
    endif
endfunction

map <Leader>l :call HighlightPattern(expand("<cWORD>"))<CR>
map <Leader>c :call ClearHighlight()<CR>
  

Сворачивание по шаблону

Для примера сворачивания на основе шаблонов ознакомьтесь с подключаемым модулем Vim для показа-скрытия. Он предоставляет две команды, SHOW и HIDE , и несколько карт быстрого доступа. Например, :SHOW thread=1234 все строки будут сворачиваться, кроме тех, которые содержат thread=1234 , в то время как zs в обычном режиме под вашим курсором будут отображаться строки, содержащие word . [Возможно, вы захотите создать альтернативную карту, например zS , для использования <a rel="noreferrer noopener nofollow" href="https:///vimdoc.sourceforge.net/htmldoc/cmdline.html#:» rel=»nofollow»> <cWORD> вместо <a rel="noreferrer noopener nofollow" href="https:///vimdoc.sourceforge.net/htmldoc/cmdline.html#:» rel=»nofollow»> <cword> .]

Построение шаблонов

Если ни <cword> ни <cWORD> не удается извлечь достаточно уникальный шаблон фильтрации (или чтобы избежать перемещения курсора в нужное поле), создайте другую функцию, подобную приведенной ниже, и вызовите ее с карты.

 function! GetField(num)
    let toks = split(getline('.'))
    if len(toks) >= a:num
        return toks[a:num-1]
    endif
    return ''
endfunction

map <Leader>hl :call HighlightPattern(GetField(3))<CR>
map <Leader>fl :exec "SHOW ".GetField(3)<CR>
  

Ответ №2:

То, что вы в основном ищете, — это внешний механизм, который будет встроен поверх вашего файла журнала. Chainsaw делает именно это для журналов на основе log4j: http://logging.apache.org/chainsaw/index.html

Не уверен, какое у вас приложение для ведения журнала, но вам, вероятно, следует посмотреть в этом направлении.

Комментарии:

1. Выглядит интересно, однако он основан на графическом интерфейсе. Наша служба поддержки работает много раз при медленных удаленных подключениях, поэтому мне также интересно решение на основе консоли.