10P by GN⁺ 22일전 | ★ favorite | 댓글 1개
  • 중앙 서버 없이 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에서 로그를 볼 수 있는지 궁금함