NerdLog - 타임라인 히스토그램을 갖춘 빠른 다중 호스트 TUI 로그 뷰어
(github.com/dimonomid)- 중앙 서버 없이 SSH 연결만으로 원격 로그 수집 및 분석이 가능한, 빠르고 리소스 효율적인 TUI 멀티 호스트 로그 뷰어
- 타임라인 히스토그램 시각화와 시간 필터링으로 로그 흐름 파악이 용이함
- 기본적인
awk
,tail
,head
조합을 사용하여 고속 처리 및 간편한 구축 지원 - 로그 쿼리는 로컬 다운로드 없이 원격에서 처리, 네트워크 사용 최소화 및 대용량 로그 처리 최적화
- 기본은 단순하지만 다양한 설정 파일, SSH config, UI 조작을 통한 확장성 보유
Nerdlog 소개
- Nerdlog는 중앙 서버 없이 작동하는 텍스트 기반 UI 로그 뷰어임
- Graylog/Kibana처럼 로그를 분석할 수 있지만, 설치와 유지보수 부담이 없는 경량화 대안 도구임
- 초기 개발 동기는 느리고 비효율적인 Splunk에 대한 실망에서 시작
- 여러 원격 서버의 로그를 동시에 필터링 및 시각화하는 데 최적화되어 있음
- 주로 시스템 로그(
/var/log/messages
,/var/log/syslog
)를 처리하도록 설계되었지만, 다른 포맷도 지원함 - 1GB 이상의 대용량 로그도 빠르게 처리 가능
- 핵심 목표는 멀티 노드 로그 조회의 속도와 효율성 극대화
설계 특징
- 중앙 서버 없이 동작하며, 각 노드에 대해 ssh 연결을 생성하고 대기 상태 유지
- 전체 로그를 다운로드하지 않고, 질문당 최대 250개의 로그 메시지와 히스토그램 데이터만 전송
- 모든 응답을 병합하여 통합된 뷰를 제공
- 전송 시 Gzip 압축을 사용하여 네트워크 비용 절감
프로젝트 상태 및 역사
- 2022년 개인 해커톤으로 느린 Splunk 대체용으로 제작되었으며, 2025년 오픈소스로 공개됨
- 빠르게 구현되어 스파게티 코드가 존재하며 테스트 커버리지 부족
- Linux 환경에서만 실제 사용 테스트 되었음
- Proof-of-concept 단계지만, 실제 사용에 충분할 정도로 빠르고 안정적
사용법 요약
- 앱을 실행하면 쿼리 입력창이 나타남
- 로그스트림은 ssh로 접근 가능한 서버의 연속된 로그 파일들 의미
- ssh 포트나 로그 파일 경로 등을 명시하거나, ssh config 및 별도 설정 파일 사용 가능
- Select field expression은 UI에 표시할 필드를 SQL 스타일로 지정
예시:
myuser@myserver.com
myuser@myserver.com:1234:/some/other/logfile
예시 설정 파일 (~/.config/nerdlog/logstreams.yaml
):
log_streams:
myhost-01:
hostname: actualhost1.com
port: 1234
user: myuser
log_files:
- /some/custom/logfile
UI 구성
-
Awk 패턴 입력 필터:
/foo/
,( /bar/ || /baz/ ) && !/qux/
등 지원 - Edit 버튼: 전체 쿼리 입력 창 열기
- Menu 버튼: 뒤로가기, 앞으로가기, 쿼리 복사 등 기능 제공
- 히스토그램: 시간대별 로그 밀도 시각화 및 시간 범위 선택 가능
- 로그 테이블: 최신 로그는 하단에 위치, 우측 스크롤로 상세 필드 확인 가능
-
상태줄:
- 초록: 연결 및 대기 중인 로그스트림 수
- 주황: 현재 쿼리 중인 로그스트림 수
- 빨강: 연결 중인 로그스트림 수
- 우측 숫자: 전체 매칭 로그 수 / 현재 로딩된 로그 수 / 커서 위치
-
명령줄:
:
키로 접근하며 Vim 스타일 명령어 입력 가능
탐색 방법
- 일반 키:
Tab
,Shift+Tab
,Enter
,Esc
,PgUp
,PgDn
등 - Vim 스타일 키:
h
,j
,k
,l
,g
,G
,Ctrl+U
,Ctrl+D
,i
,a
등 - 입력 필드 내에서는
Up
,Down
,Ctrl+P
,Ctrl+N
으로 히스토리 탐색 -
Ctrl+K
,Ctrl+J
: 전체 쿼리 히스토리 순회
주요 명령어
-
:xc
또는:xclip
: 현재 쿼리 상태를 명령어 문자열로 클립보드에 복사nerdlog --lstreams 'localhost' --time -3h --pattern '/something/'
-
:back
,:fwd
: 브라우저처럼 이전/다음 쿼리로 이동 -
:edit
: 쿼리 편집 창 열기 -
:write [filename]
: 현재 로딩된 로그를 파일로 저장 -
:reconnect
,:disconnect
: 로그스트림 재연결 / 연결 해제 -
:set 옵션=값
: 설정 변경 (numlines
,timezone
등 지원) -
:q
: 프로그램 종료
요구 사항
- 원격 호스트에 대한 SSH 접근 권한 필요
- 로컬에서 SSH agent가 실행 중이어야 함
- 호스트에는 gawk가 설치되어야 하며, mawk는 지원되지 않음
-
rsyslog
등의 시스템 로그 기록 서비스가 실행 중이어야/var/log/syslog
가 사용 가능함 - 자세한 내용은 요구 사항 및 제약 항목 참고
마무리
- Nerdlog는 설치 없이도 원격 로그를 빠르고 시각적으로 확인할 수 있는 효율적인 도구임
- 복잡한 설정이 필요 없고, 네트워크 리소스를 절약하면서도 실시간 분석이 가능함
- 특히 Vim 사용자나 CLI 도구 선호자에게 이상적인 로그 분석 도구임
Hacker News 의견
- 멋진 작업임. TUI가 정말 깔끔하고 상단의 히스토그램이 마음에 듦. 오늘 이걸로 놀아볼 예정임
- 오늘 배운 것: awk 패턴은 단순한 정규 표현식 이상이며, 불리언 연산자와 결합할 수 있음. awk를 조금 써봤지만 이 점을 몰랐음
- 정말 멋진 프로젝트임. 특히 타임라인 히스토그램과 원격 우선 설계의 단순함과 TUI 접근 방식을 좋아함
- 여러 호스트의 로그를 처리할 때 비슷한 어려움을 겪었고, 그 결과 Logdy라는 도구를 만들게 되었음
- Logdy는 웹 기반으로 실시간 테일링, 구조화된 로그 검색, 여러 소스에 대한 빠른 필터링에 중점을 둠. 중앙 서버가 필요하지 않음
- 직접 비교하려는 것은 아니지만, 이 분야를 탐구 중이라면 보완적인 접근 방식이나 다른 시나리오에 유용할 수 있음
- 여러 호스트에 대한 쿼리 기능 추가 작업이 필요함
- 어쨌든 nerdlog에 찬사를 보냄. 여러 서비스를 실행할 필요 없는 간결한 도구를 보는 것은 항상 좋음
- 랜딩 페이지에서 journalctl이 한 번 언급되며, 로그가 구식 syslog에 평문으로 저장되어야 한다는 암시가 있음
- 평문 로그를 저장하고 logrotate 같은 오래된 해결책을 사용하고 싶지 않음
- journald 자체는 원격 호스트에서 로그를 수신하고 (--merge를 사용하여) 검색할 수 있는 내장 기능이 있음
- 나중에 꼭 이걸 가지고 놀아볼 예정임. gzipped 로그 아카이브가 지원되지 않음, 개인적으로 사용 사례를 최소화함
- 사람들이 주목할 것이라고 생각하는 제한 사항으로 언급한 점은 충분히 고려한 것 같음. 결국 지원할 계획이 있는지 궁금함
- 보기 좋음. 더 많은 사용자를 원한다면 주요 리눅스 배포판에 패키징하기 위해 커뮤니티의 도움을 받을 수 있음
- 매우 좋음. 내 작은 로그 뷰어 목록에 추가했음 https://github.com/dloss/klp#alternative-tools
- 좋음. 몇 년 전에 필요했음. 라이선스 파일이 없음?
- 좋아 보임. 소스 코드를 변경하지 않고 RFC 3339 형식의 날짜/시간을 사용할 수 있는 방법이 있는지 궁금함
- runit (Void Linux)와 함께 작동하는지 궁금함
- 훌륭함. 이런 것을 찾고 있었음
- AWS CloudWatch에서 로그를 볼 수 있는지 궁금함