LeeSeokBln/faultbrief

GitHub: LeeSeokBln/faultbrief

一款轻量级 Linux 日志故障分析工具,通过规则引擎从 journald/syslog/nginx 日志中自动检测异常模式、频率突增和新模式,一键生成结构化故障简报。

Stars: 1 | Forks: 0

# faultbrief **English** · [한국어](#한국어) 将 Linux 日志转化为故障简报。只需一条命令,无需 daemon,无需配置。 ``` faultbrief --since 1h ``` faultbrief 读取 journald、syslog 和 nginx 日志,并通过规则引擎检测故障 信号: - **特征(Signatures)** — 21 种精选的已知异常模式(OOM kill、磁盘已满、 systemd unit 故障、nginx upstream 错误等) - **突增(Spikes)** — 与前一个基线窗口相比的频率异常 (5 分钟时间桶,带有最小计数保护的 z-score) - **新模式** — 基线中从未见过的日志模板 (可变掩码指纹) LLM 是**可选的**:`--llm` 会在规则引擎报告的基础上添加 AI 故障简报 (Anthropic API 或任何兼容 OpenAI 的 endpoint, 包括本地 Ollama)。即使没有它,faultbrief 仍然是一个完整的工具。 ## 安装 ### 从源码安装 ``` go install github.com/LeeSeokBln/faultbrief/cmd/faultbrief@latest ``` 或者为了方便起见设置别名: ``` alias brief=faultbrief ``` ### 从发布 tarball 安装 从 [GitHub Releases](https://github.com/LeeSeokBln/faultbrief/releases) 下载最新的发布版本, 解压并添加到你的 PATH 中: ``` tar xzf faultbrief_*_linux_amd64.tar.gz sudo mv faultbrief /usr/local/bin/ ``` 支持的平台:Linux (amd64, arm64), macOS (amd64, arm64)。 ## 使用方法 ``` faultbrief [flags] Flags: --since DURATION analysis window size (e.g. 30m, 1h, 1d; default "1h") --until DURATION skip the most recent span (e.g. 10m; default "0") --baseline DURATION baseline span before the window (default "24h") --format FORMAT output format: text, md, json (default "text") --lang LANG report language: en, ko (default "en") --min-severity SEV minimum finding severity to report: debug, info, notice, warning, error, critical (default "info") --llm add an LLM incident briefing --source NAMES limit sources: journald, syslog, nginx, nginx-access, nginx-error (default: all detected) --syslog-path PATHS syslog file paths/globs (default: /var/log/syslog*, /var/log/messages*) --nginx-access-path PATHS nginx access log paths/globs (default: /var/log/nginx/access.log*) --nginx-error-path PATHS nginx error log paths/globs (default: /var/log/nginx/error.log*) --rules FILES extra signature rule YAML files --use-cache remember templates across runs, so "new pattern" means new-ever, not just new-vs-yesterday --no-color disable colored output --config PATH config file (default ~/.config/faultbrief/config.yaml) Commands: version print version Exit codes (cron/CI friendly): 0 no findings — logs look healthy 1 findings detected 2 runtime error (bad flags, no readable sources, ...) ``` 读取 `/var/log` 通常需要属于 `adm` 组或使用 sudo。 ## 输出示例 来自测试夹具的简略实际输出(显示了 8 项发现中的 3 项): ``` FAULTBRIEF — incident brief Window: 2026-07-07 09:00 → 2026-07-07 10:00 (baseline: previous 24h0m0s) Sources: journald ✓ (1) · syslog ✓ (69) · nginx-access ✓ (260) · nginx-error ✓ (3) Records: 104 · Findings: 8 [CRITICAL] signature oom-kill — OOM killer terminated a process (×2) first: 09:12:00 · last: 09:14:00 · unit: kernel · syslog matched 2 time(s) > Out of memory: Killed process 1234 (myapp) total-vm:204800kB hint: free -h; dmesg | grep -i oom; check the unit's memory limits [ERROR] spike nginx-5xx-rate — nginx 5xx error rate is high (×12) first: 09:00:00 · last: 10:00:00 · unit: nginx · nginx-access 12 of 60 requests failed (20.0%), baseline 0.0% [ERROR] spike 2fa0ade5fedf824e — error: pg query timeout after ms (×30) first: 09:00:00 · last: 09:58:00 · unit: myapp · syslog 30 occurrences (2.5/bucket) vs baseline 0.02/bucket — z=5.0, ×50.0 > error: pg query timeout after 5000 ms ``` 每项发现都会说明*为什么*被提出:匹配的规则,或是突增背后的准确 计数和 z-score。 ## LLM 简报(可选) 使用 `--llm` 启用 AI 故障摘要。规则引擎报告始终 完整输出 —— 如果 LLM 调用失败,你除了摘要之外什么都不会失去。 ### Anthropic API ``` export ANTHROPIC_API_KEY=sk-ant-... faultbrief --since 1h --llm ``` ### OpenAI API ``` export OPENAI_API_KEY=sk-... export FAULTBRIEF_LLM_PROVIDER=openai export FAULTBRIEF_LLM_MODEL=gpt-4o-mini faultbrief --since 1h --llm ``` ### 本地 Ollama(无需云服务) ``` export FAULTBRIEF_LLM_PROVIDER=openai export FAULTBRIEF_LLM_BASE_URL=http://localhost:11434 export FAULTBRIEF_LLM_MODEL=llama3 faultbrief --since 1h --llm ``` 设置也可以存放在 `~/.config/faultbrief/config.yaml` 中: ``` lang: ko llm: provider: openai base_url: http://localhost:11434 model: llama3 ``` 优先级:flags > 环境变量 > 配置文件 > 默认值。 ## 自定义规则 在 YAML 文件中添加你自己的特征: ``` - id: my-app-crash title: "My app crashed" severity: critical source: syslog # optional: journald, syslog, nginx-access, nginx-error, any contains: "my-app: segmentation fault" hint: "coredumpctl list; check the last deploy" example: "my-app: segmentation fault at 0x0" - id: slow-query title: "Database query over limit" severity: error regex: "query took \\d+ms, exceeded" hint: "EXPLAIN ANALYZE the query; check missing indexes" example: "db: query took 5000ms, exceeded limit" ``` 使用 `--rules ./my-rules.yaml` 加载。每条规则只能包含 `contains`/`regex` 中的 确切一项。内置规则始终会被加载。 ## 注意事项与限制 - nginx **error** 日志时间戳不带时区;faultbrief 会按照计算机的本地时间解析它们。 请在产生错误日志的主机上(或使用匹配的 TZ)分析错误日志 —— 跨时区复制的日志将会错过时间窗口。 - nginx **access** 日志仅在默认的 `combined` 格式下进行解析。 计划在未来支持自定义 `log_format`。 - 对于远程 LLM endpoint 请使用 `https`;`http` 基础 URL 适用于像 Ollama 这样的 环回服务(API key 和日志摘录将被发送到该 URL)。 ## 韩语 리눅스 로그를 장애 브리핑으로. 명령어 하나, 데몬 없음, 사전 설정 없음. ``` faultbrief --since 1h ``` faultbrief는 journald·syslog·nginx 로그를 읽어 **규칙 엔진**으로 장애 신호를 탐지합니다: - **시그니처** — 엄선된 21종의 알려진 장애 패턴 (OOM kill, 디스크 풀, systemd 유닛 실패, nginx 업스트림 에러 등) - **스파이크** — 직전 베이스라인 구간 대비 빈도 이상 (5분 버킷, z-score + 최소 건수 가드로 오탐 방지) - **신규 패턴** — 베이스라인에 없던 로그 템플릿 (숫자/IP/UUID/경로를 마스킹한 핑거프린트 비교) LLM은 **옵션**입니다. `--llm`을 붙이면 규칙 엔진 리포트 위에 AI 장애 브리핑이 추가됩니다 (Anthropic API 또는 OpenAI 호환 엔드포인트 — 로컬 Ollama 포함). LLM 없이도 faultbrief는 그 자체로 완결된 도구입니다. ### 安装 #### 从源码 ``` go install github.com/LeeSeokBln/faultbrief/cmd/faultbrief@latest ``` 짧게 쓰고 싶다면: ``` alias brief=faultbrief ``` #### Release Tarball [GitHub Releases](https://github.com/LeeSeokBln/faultbrief/releases)에서 받아서 PATH에 추가: ``` tar xzf faultbrief_*_linux_amd64.tar.gz sudo mv faultbrief /usr/local/bin/ ``` 지원 플랫폼: Linux (amd64, arm64), macOS (amd64, arm64). ### 使用方法 ``` faultbrief [플래그] 플래그: --since 기간 분석 구간 크기 (예: 30m, 1h, 1d; 기본 "1h") --until 기간 가장 최근 구간 제외 (예: 10m; 기본 "0") --baseline 기간 분석 구간 직전의 베이스라인 길이 (기본 "24h") --format 포맷 출력 포맷: text, md, json (기본 "text") --lang 언어 리포트 언어: en, ko (기본 "en") --min-severity 심각도 이 심각도 이상만 리포트: debug, info, notice, warning, error, critical (기본 "info") --llm LLM 장애 브리핑 추가 --source 이름들 소스 제한: journald, syslog, nginx, nginx-access, nginx-error (기본: 자동 감지 전부) --syslog-path 경로들 syslog 파일 경로/글롭 (기본 /var/log/syslog*, /var/log/messages*) --nginx-access-path 경로들 nginx access 로그 경로/글롭 (기본 /var/log/nginx/access.log*) --nginx-error-path 경로들 nginx error 로그 경로/글롭 (기본 /var/log/nginx/error.log*) --rules 파일들 사용자 시그니처 규칙 YAML 추가 --use-cache 실행 간 템플릿 기억 — "신규 패턴"이 "어제 대비 신규"가 아니라 "역대 최초"를 뜻하게 됨 --no-color 컬러 출력 끄기 --config 경로 설정 파일 (기본 ~/.config/faultbrief/config.yaml) 명령: version 버전 출력 종료 코드 (cron/CI 연동용): 0 발견 없음 — 로그 정상 1 발견 있음 2 실행 에러 (잘못된 플래그, 읽을 수 있는 소스 없음 등) ``` `/var/log`를 읽으려면 보통 `adm` 그룹 소속이거나 sudo가 필요합니다. ### 输出示例 테스트 픽스처 기준 실제 출력 (8건 중 3건 발췌): ``` FAULTBRIEF — 장애 브리핑 분석 구간: 2026-07-07 09:00 → 2026-07-07 10:00 (베이스라인: 직전 24h0m0s) 소스: journald ✓ (1) · syslog ✓ (69) · nginx-access ✓ (260) · nginx-error ✓ (3) 레코드: 104 · 발견: 8 [심각] 시그니처 oom-kill — OOM killer terminated a process (×2) 최초: 09:12:00 · 최종: 09:14:00 · 유닛: kernel · syslog matched 2 time(s) > Out of memory: Killed process 1234 (myapp) total-vm:204800kB 힌트: free -h; dmesg | grep -i oom; check the unit's memory limits [에러] 스파이크 nginx-5xx-rate — nginx 5xx error rate is high (×12) 최초: 09:00:00 · 최종: 10:00:00 · 유닛: nginx · nginx-access 12 of 60 requests failed (20.0%), baseline 0.0% [에러] 스파이크 2fa0ade5fedf824e — error: pg query timeout after ms (×30) 최초: 09:00:00 · 최종: 09:58:00 · 유닛: myapp · syslog 30 occurrences (2.5/bucket) vs baseline 0.02/bucket — z=5.0, ×50.0 > error: pg query timeout after 5000 ms ``` 모든 발견에는 **왜 잡혔는지**가 붙습니다: 매칭된 규칙, 또는 스파이크의 정확한 건수와 z-score. ### LLM 简报(可选) `--llm`으로 AI 장애 요약을 켭니다. 규칙 엔진 리포트는 항상 전체 출력되며, LLM 호출이 실패해도 요약만 빠질 뿐 아무것도 잃지 않습니다. #### Anthropic API — 韩语简报 ``` export ANTHROPIC_API_KEY=sk-ant-... faultbrief --since 1h --lang ko --llm ``` `--lang ko`면 AI 브리핑도 한국어로 나옵니다: 상황 요약, 원인 가설, 영향 범위, 다음 확인 커맨드 순. #### OpenAI API ``` export OPENAI_API_KEY=sk-... export FAULTBRIEF_LLM_PROVIDER=openai export FAULTBRIEF_LLM_MODEL=gpt-4o-mini faultbrief --since 1h --lang ko --llm ``` #### 本地 Ollama — 无需云服务 ``` export FAULTBRIEF_LLM_PROVIDER=openai export FAULTBRIEF_LLM_BASE_URL=http://localhost:11434 export FAULTBRIEF_LLM_MODEL=llama3 faultbrief --since 1h --lang ko --llm ``` 설정 파일(`~/.config/faultbrief/config.yaml`)로도 가능: ``` lang: ko llm: provider: openai base_url: http://localhost:11434 model: llama3 ``` 우선순위: 플래그 > 환경변수 > 설정 파일 > 기본값. ### 用户规则 자기 서비스 전용 시그니처를 YAML로 추가: ``` - id: my-app-crash title: "우리 앱 크래시" severity: critical source: syslog # 생략 가능: journald, syslog, nginx-access, nginx-error, any contains: "my-app: segmentation fault" hint: "coredumpctl list; 마지막 배포 확인" example: "my-app: segmentation fault at 0x0" - id: slow-query title: "DB 쿼리 시간 초과" severity: error regex: "query took \\d+ms, exceeded" hint: "EXPLAIN ANALYZE 실행; 인덱스 누락 확인" example: "db: query took 5000ms, exceeded limit" ``` `--rules ./my-rules.yaml`로 로드. 규칙마다 `contains`/`regex` 중 정확히 하나만. 내장 규칙은 항상 함께 로드됩니다. ### 注意事项与限制 - nginx **error** 로그 타임스탬프에는 타임존이 없어 실행 머신의 로컬 시간으로 해석합니다. 에러 로그는 생성된 서버(또는 같은 TZ)에서 분석하세요. - nginx **access** 로그는 기본 `combined` 포맷만 지원합니다. 커스텀 `log_format`은 추후 지원 예정. - 원격 LLM 엔드포인트는 `https`를 쓰세요. `http`는 Ollama 같은 로컬 서비스용입니다 (API 키와 로그 발췌가 해당 URL로 전송됨). ### cron 集成示例 매시간 검사해서 발견이 있으면 메일로: ``` 0 * * * * faultbrief --since 1h --lang ko --format md > /tmp/brief.md || \ [ $? -eq 1 ] && mail -s "faultbrief: 발견 있음" ops@example.com < /tmp/brief.md ``` ## 许可证 MIT — 见 [LICENSE](LICENSE)。
标签:AI风险缓解, EVTX分析, Petitpotam, 云计算, 异常检测, 故障排查, 日志审计, 规则引擎, 运维工具