폐쇄망 환경에서도 설치 없이 실행 가능한 실시간 로그 모니터링 도구 (단일 실행 파일)
- 🚀 설치 불필요: 단일 실행 파일로 즉시 실행
- 🌐 로컬/원격 동시 수집: SSH를 통한 원격 서버 로그 및 로컬 파일 동시 모니터링
- 📊 분할 뷰 (Split View): 통합 로그 뷰와 에러 전용 뷰를 동시에 표시
- 🔄 자동 인코딩 감지: EUC-KR/UTF-8 자동 변환으로 한글 로그 완벽 지원
- 💪 자동 연결 복구: SSH 연결 끊김 시 자동 재연결
- 🎨 실시간 WebSocket 스트리밍: 밀리초 단위 실시간 로그 업데이트
- 📦 임베디드 UI: 별도 프론트엔드 빌드 불필요, 단일 바이너리에 UI 포함
- 🔔 Slack 알림: 에러 발생 시 자동 알림 전송
- 💾 스냅샷 다운로드: 현재 보고 있는 로그를 .txt 파일로 저장
┌────────────────────────────────────────────────────────────┐
│ 🎯 로그 스나이퍼 (Log Sniper) 🟢 정상 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 전체 로그: 1,234 | 에러: 12 | 수집 대상: 3 │
│ [💾 전체 저장] [⚠️ 에러 저장] │
├────────────────────────────────────────────────────────────┤
│ 📋 통합 로그 (1234) 🚨 에러/경고 (12) │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ [App] 23:15:45.123 │ │ [DB] 23:16:01.456 │ │
│ │ INFO: Server start │ │ ERROR: Connection │ │
│ │ │ │ failed │ │
│ │ [Web] 23:15:46.789 │ └─────────────────────┘ │
│ │ INFO: Request /api │ │
│ └─────────────────────┘ │
└────────────────────────────────────────────────────────────┘
# 릴리스 페이지에서 다운로드 또는 직접 빌드
go run builder/release.go빌드 완료 후 dist/ 폴더에 생성된 실행 파일:
logsniper-windows-amd64.exe(Windows용)logsniper-linux-amd64(Linux용)
실행 파일과 같은 디렉토리에 config.yaml 파일을 생성하세요:
# 서버 설정
server:
port: 8080 # 웹 UI 포트
# 로그 수집 대상
targets:
# 로컬 파일 수집
- name: "애플리케이션 로그"
type: local
path: "/var/log/app/application.log"
encoding: utf-8
color: "#3B82F6" # 파란색
# SSH 원격 서버 로그 수집
- name: "운영 서버"
type: ssh
path: "/var/log/syslog"
encoding: euc-kr # 또는 utf-8
color: "#10B981" # 초록색
ssh:
host: "192.168.1.100:22"
user: "admin"
privateKeyPath: "/home/user/.ssh/id_rsa"
# password: "암호" # private key 대신 사용 가능
- name: "데이터베이스 로그"
type: ssh
path: "/var/log/mysql/error.log"
encoding: utf-8
color: "#EF4444" # 빨간색
ssh:
host: "db.example.com:22"
user: "dbadmin"
privateKeyPath: "/path/to/key"
# 에러 감지 키워드
error_keywords:
- error
- fatal
- exception
- 오류
- 에러
- 실패
# Slack 알림 (선택사항)
alert:
enabled: false
webhookURL: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"Windows:
logsniper-windows-amd64.exeLinux:
chmod +x logsniper-linux-amd64
./logsniper-linux-amd64웹 브라우저에서 다음 주소로 접속:
http://localhost:8080
-
통합 로그 뷰 (왼쪽 패널)
- 모든 수집 대상의 로그를 시간순으로 통합 표시
- 각 로그는 출처별 색상으로 구분
- 🗑️ 화면 지우기: 현재 표시된 로그 제거
- ⏸️ 일시정지: 자동 스크롤 중지
-
에러/경고 뷰 (오른쪽 패널)
error_keywords에 정의된 키워드가 포함된 로그만 필터링- 에러만 집중 모니터링 가능
- 독립적인 화면 지우기 및 일시정지 기능
-
스냅샷 저장
- 💾 전체 저장: 현재 수집된 모든 로그를 .txt 파일로 다운로드
⚠️ 에러 저장: 에러 로그만 별도 저장
-
자동 스크롤
- 기본적으로 최신 로그로 자동 스크롤
- 화면을 위로 스크롤하면 자동 정지
- "⬇️ 최신 로그 보기" 버튼으로 재개
- 🟢 정상: WebSocket 연결 정상
- 🔴 끊김: WebSocket 연결 끊김 (3초 후 자동 재연결)
- 각 로그 항목의 점: 해당 수집 대상의 연결 상태
- 🟢 초록색: 수집 정상
- 🔴 빨간색: 연결 끊김
- 🟡 노란색: 재연결 중
1. Private Key 인증 (권장):
ssh:
host: "server.example.com:22"
user: "admin"
privateKeyPath: "/home/user/.ssh/id_rsa"2. 비밀번호 인증:
ssh:
host: "server.example.com:22"
user: "admin"
password: "your_password"utf-8: 대부분의 최신 시스템 (권장)euc-kr: 한국어 레거시 시스템
자동 감지 기능이 내장되어 있어, 잘못된 인코딩을 지정해도 자동으로 보정됩니다.
- Slack Workspace에서 Incoming Webhook 생성
config.yaml에 설정:
alert:
enabled: true
webhookURL: "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX"알림은 30초마다 최대 1회로 제한되어 스팸을 방지합니다.
log-sniper/
├── cmd/
│ └── logsniper/
│ └── main.go # 애플리케이션 진입점
├── internal/
│ ├── config/
│ │ ├── config.go # 설정 파일 파싱
│ │ └── config_test.go
│ ├── hub/
│ │ └── hub.go # WebSocket 허브 (브로드캐스팅)
│ ├── parser/
│ │ ├── parser.go # 에러 키워드 감지
│ │ └── parser_test.go
│ ├── slack/
│ │ ├── slack.go # Slack 알림
│ │ └── slack_test.go
│ ├── tailer/
│ │ ├── tailer.go # Tailer 인터페이스
│ │ ├── local_tailer.go # 로컬 파일 수집기
│ │ ├── ssh_tailer.go # SSH 원격 수집기
│ │ └── *_test.go
│ └── ui/
│ └── index.html # 임베디드 웹 UI
├── builder/
│ └── release.go # 멀티 플랫폼 빌드 스크립트
├── config.yaml.example # 설정 예시 파일
├── build.sh # Unix 빌드 스크립트
├── build.bat # Windows 빌드 스크립트
├── go.mod
└── README.md
로컬 개발 빌드:
# Windows
build.bat
# Linux/Mac
chmod +x build.sh
./build.sh릴리스 빌드 (멀티 플랫폼):
go run builder/release.godist/ 폴더에 최적화된 바이너리 생성:
- 디버그 심볼 제거 (
-ldflags="-s -w") - CGO 비활성화 (완전한 정적 바이너리)
- Windows/Linux x64 지원
go test ./...A: config.yaml에서 server.port를 다른 값으로 변경하세요:
server:
port: 9090A: 확인 사항:
- 호스트 주소가
host:port형식인지 확인 (예:192.168.1.100:22) - SSH 키 파일 경로와 권한 확인
- 방화벽에서 SSH 포트(22) 허용 여부 확인
- 서버에서 해당 사용자의 SSH 접근 권한 확인
A: 확인 사항:
- 파일 경로가 올바른지 확인
- 파일 읽기 권한이 있는지 확인 (로컬 파일의 경우)
- 브라우저 개발자 도구에서 WebSocket 연결 상태 확인
- 로그 파일이 실제로 업데이트되고 있는지 확인
A: config.yaml에서 올바른 인코딩 설정:
targets:
- name: "한글 로그"
encoding: euc-kr # 또는 utf-8A: 로그 스나이퍼는 최대 2,000개의 로그를 메모리에 유지합니다. 수집 대상을 줄이거나 장기 보관이 필요한 경우 스냅샷 기능을 사용하세요.
이 프로젝트는 MIT 라이선스에 따라 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
버그 리포트, 기능 요청, Pull Request는 언제나 환영합니다!
프로젝트 관련 문의사항은 GitHub Issues를 이용해주세요.
Built with ❤️ using Go
Copyright © 2026 Log Sniper Contributors