GoAccess
터미널에서 돌아가고 단일 파일로 완결되는 HTML 대시보드까지 만들어 주는 실시간 웹 로그 분석 도구
GoAccess는 C로 작성된 MIT 라이선스 오픈소스 로그 분석 도구로, 웹 서버의 액세스 로그를 읽어 서버가 실제로 무엇을 내보냈는지 보여 줍니다. 출력은 터미널의 대화형 대시보드이거나, 그대로 메일에 첨부할 수 있는 단일 파일 HTML 리포트입니다. Apache, Nginx, Caddy, CloudFront, S3, Elastic Load Balancing, Traefik, IIS 로그를 기본으로 해석하고, 직접 기술한 사용자 정의 형식도 읽습니다. 실행에 필요한 의존성은 ncurses 하나뿐입니다. 2026년 9월 2일 기준 GitHub 스타는 20,890개입니다. 만드는 사람 입장에서는 좁은 질문 하나에 아주 잘 답합니다. 무엇이 요청되었고, 서버가 무엇을 응답했고, 얼마나 걸렸는가. JavaScript를 한 번도 실행하지 않은 요청까지 포함해서 말입니다.
GoAccess는 실제로 무엇인가
GoAccess github.com/allinurl/goaccess는 2013년부터 유지보수되어 왔고 C로 작성되었습니다. 그 사실이 가장 먼저 체감되는 형태로 드러납니다. 필수 의존성은 ncurses 하나뿐이고, 실행은 즉시 시작됩니다. 로그를 가리켜 `goaccess access.log`라고 치면 터미널에 대화형 대시보드가 뜹니다. 여기에 `-o report.html --real-time-html`을 더하면 외부 파일 의존성이 없는 단일 HTML 파일을 쓰고, 자체 내장한 WebSocket 서버를 통해 그 파일로 실시간 업데이트를 보냅니다. 기본 포트는 7890입니다.
- 이미 가지고 있는 로그 형식을 그대로 읽는다 Apache의 common과 combined, Nginx, Caddy의 JSON 구조화 형식, Traefik, Squid, IIS의 W3C, Amazon CloudFront, S3, Elastic Load Balancing, Google Cloud Storage가 미리 정의되어 있습니다. 그 밖의 형식은 사용자 정의 형식 문자열로 기술하면 됩니다.
- 로그가 있는 곳에서도, 내가 있는 곳에서도 돌아간다 파일, `zcat --force`로 흘려 넣은 로테이트·압축된 파일 묶음, 또는 표준 입력을 해석합니다. 그래서 서버에는 아무것도 설치하지 않고 노트북에서 `ssh -n you@server 'tail -f /var/log/nginx/access.log' | goaccess -`를 실행할 수 있습니다.
- 데이터베이스 없이 이력을 남긴다 `--persist`가 데이터셋을 디스크에 기록하고 `--restore`가 다시 읽어들여 새 내용을 덧붙입니다. 파일별 inode와 마지막으로 파싱한 줄의 타임스탬프를 기록하므로 다시 실행해도 중복 집계되지 않고, `--keep-last=5`는 닷새보다 오래된 것을 버려 저장 공간을 재활용합니다.
- 운영자가 생각하는 방식대로 트래픽을 묶는다 요청, 404, 정적 파일, 대역폭, 응답 시간, 리퍼러, 가상 호스트 패널이 있고, 선택 사항인 MaxMind 데이터베이스를 넣으면 지역과 ASN 패널도 나옵니다. ASN 패널은 시끄러운 단일 네트워크의 존재를 한눈에 드러내 줍니다.
- 지금도 활발히 개발되고 있다 최신 태그는 2026년 7월 15일의 v1.11이고, 2026년 8월 말의 커밋은 평범한 제품 작업입니다. AI 크롤러 전용 분류 추가, Fediverse 트래픽을 크롤러에서 분리, ASN 단위 트래픽 제외, 예전 키프레이즈 패널을 대체하는 UTM 캠페인 집계, 그리고 초당 요청 수 실시간 지표.
라이선스는 단순한 MIT이고, 배지에 맡기지 않고 저장소의 COPYING 파일에 명시되어 있습니다. 열린 이슈는 449개인데, 사람들이 만들어 낸 모든 로그 형식을 해석하려는 13년 된 C 프로젝트에서 이 숫자는 방치보다 사용의 증거에 가깝습니다. 상당수는 로그·날짜·시간 형식에 관한 질문이고, README는 이미 닫힌 수백 건으로 바로 연결해 둡니다.
운영에 드는 비용
진짜 비용은 CPU가 아니라 접근 권한입니다. 우선 액세스 로그를 읽을 수 있어야 하고, 이 조건만으로 로그를 한 번도 볼 수 없는 대부분의 관리형 플랫폼은 제외됩니다. 다음으로 자기 로그 형식을 알아야 하는데, 시간이 실제로 녹는 지점이 여기입니다. 로그의 날짜 형식과 GoAccess가 돌아가는 로케일이 어긋나는 것이 첫 실행에서 아무것도 표시되지 않는 가장 흔한 이유입니다. 그리고 영속화를 처음에 결정해야 합니다. `--persist` 없이는 리포트가 건네준 파일만큼만 오래되고, 로그 로테이션은 남이 정한 일정에 따라 당신의 이력을 지워 갑니다.
그 대가로 얻는 것은 계정도 태그도 샘플링도 월 요금도 없는 도구이고, 요청이 일어난 지 몇 초 만에 답합니다. 이것은 제품 분석이 전혀 아닙니다. 사용자가 누구인지, 무엇을 클릭했는지, 다음 주에 다시 왔는지 전혀 알지 못합니다. 그 아래 계층이며, 둘이 답하는 질문이 충분히 다르기 때문에 한쪽을 쓰는 팀은 대개 둘 다 쓰게 됩니다.
로그가 진실을 말하지 않게 되는 지점
로그 분석 도구는 딱 로그만큼만 정확합니다. 그리고 로그가 내 트래픽을 설명하지 못하게 만드는 가장 빠른 방법은 앞단에 CDN을 두는 것입니다. 우리는 2026년 8월 agentceres.com에서 정확히 그렇게 했고, 오리진에 미친 영향은 미묘하지 않았습니다. 오리진 프로세스가 들고 있던 페이지 캐시가 1.33GB에서 0.31GB로 떨어졌습니다. 대부분의 요청이 아예 도달하지 않게 되었기 때문입니다. 엣지에서 처리된 그 히트 하나하나가 실제 방문이며, 오리진 로그에는 영원히 담기지 않습니다.
- 앞단의 CDN. 캐시된 응답은 엣지에서 나가므로 오리진 로그에는 캐시 미스만 남습니다. 전체 그림이 필요하면 CDN 자체 로그를 읽거나, 자신이 재고 있는 것이 캐시 미스임을 알고 그렇게 말하십시오.
- 로그 로테이션. 대부분의 시스템 기본값은 1~2주 보관입니다. 영속화하지 않은 것은 사라지고, 오류 한 줄 없이 사라집니다.
- 프록시나 로드 밸런서. forwarded-for 헤더를 설정하지 않으면 모든 요청이 하나의 내부 주소에서 온 것처럼 보이고, 지역과 ASN 패널은 장식이 됩니다.
- 정적 파일과 헬스 체크. 히트는 페이지뷰가 아닙니다. 누군가에게 숫자를 말하기 전에, 정말로 의도한 요청까지 걸러 내십시오.
원본을 직접 읽는 일의 가치는 반대 방향에서도 배웠습니다. 우리 오리진 로그 세 시간 분량에는 서로 다른 558개 URL에 걸쳐 1,438건의 요청이 있었고, URL당 2.58히트였으며, 그중 약 4분의 3이 위조되었거나 비어 있는 user agent를 단 데이터센터 트래픽이었습니다. 이 비율은 우리 JavaScript 분석에는 전혀 보이지 않았습니다. 그 트래픽 대부분이 JavaScript를 실행하지 않기 때문입니다. 그리고 이것이 롱테일 콘텐츠 사이트에서 두 시간짜리 캐시가 왜 그토록 효과가 적었는지를 두고 몇 주간 이어진 논쟁을 끝냈습니다. 그 논쟁의 자세한 판은 내 웹사이트 트래픽 중 봇은 얼마나 되는가에 있습니다.
성장을 노릴 때의 자리
성장 용도는 이 도구의 전체 기능보다 좁고, 정확히 짚어 둘 가치가 있습니다. 첫째, 크롤링의 실제. Googlebot과 AI 크롤러가 실제로 어떤 페이지를 얼마나 자주 가져갔고 어떤 상태 코드를 받았는가. 로그 속의 404는 대개 당신이 옮긴 페이지를 향해 누군가 공개한 링크입니다. 둘째, 리퍼러 패널. 어떤 백링크 도구보다 먼저 유입 링크를 잡아냅니다. 셋째, 요청별 응답 시간. 실제 방문자에게만 느린 페이지는 합성 테스트에는 보이지 않습니다. 이 프로젝트가 2026년 8월 말에 AI 크롤러 전용 분류를 추가하고 Fediverse 트래픽을 분리했다는 사실 자체가, 첫 번째 용도가 이미 많은 사람의 질문이 되었다는 괜찮은 신호입니다.
다만 그 어느 것도 성장 작업 자체는 아닙니다. 여기가 모든 측정 도구의 정직한 한계입니다. 로그는 무슨 일이 있었는지 말하고, 그에 대해 무엇을 해야 하는지는 결코 말하지 않습니다. 크롤러가 찾아온 그 페이지를 발행하는 일, 그 리퍼러를 만들어 낼 아웃리치를 쓰는 일, 조용히 링크를 잃게 하던 404를 고치는 일은 여전히 누군가 해야 합니다. 그것을 위해 있는 것이 agentceres.com의 AI Growth Officer인 AgentCeres입니다. 전문 역할로 이루어진 팀이 작업을 초안으로 만들고, 밖으로 나가는 것은 사람이 승인합니다. 아직 그 앞 단계이고 질문이 단지 왜 아무도 오지 않는가라면, 내 웹사이트에 트래픽이 오지 않는 이유부터 시작하십시오.
FAQ
- GoAccess가 Google 애널리틱스나 Plausible을 대체하나요
- 아닙니다. 대체재로 여기면 실망하게 됩니다. 태그 기반 도구는 세션 동안 한 사람을 따라가며 무엇을 클릭했고 다시 왔는지 알려 줍니다. GoAccess는 서버가 무엇을 요청받았고 무엇을 응답했는지를 읽을 뿐, 사용자라는 개념 자체가 없습니다. 겹치는 부분은 대략 페이지뷰 수 정도이고, 그마저도 어긋납니다. 로그는 JavaScript를 실행하지 않은 요청을 세고, 태그는 오리진이 보지 못했을 수도 있는 세션을 세기 때문입니다.
- 로그 접근이 안 되는 플랫폼에서 앱을 돌려도 쓸 수 있나요
- 대개 직접은 어렵고, 시간을 들이기 전에 가장 먼저 확인할 일이 바로 이것입니다. 액세스 로그를 읽을 수 없다면 대안은 CDN의 로그 내보내기 기능이거나, 플랫폼 자체의 요청 로그입니다. 일부 서비스는 로그를 파일로 흘려보낼 수 있고, 그러면 파이프로 넘겨서 잘 동작합니다. GoAccess는 표준 입력을 읽는 데 아무 문제가 없고, 형식만 알려 주면 줄이 어디서 왔는지는 신경 쓰지 않습니다.
- 바쁜 서버에서 돌리면 느려지나요
- 요청 경로에 끼어드는 대신 로그 파일을 읽기 때문에, 프로세스 내부 에이전트처럼 응답을 늦출 수는 없습니다. 이력이 많을 때 실질적인 비용은 파싱 자체이고, README의 제안이 그대로 통합니다. `nice`로 우선순위를 낮춰 실행하고, `--jobs`로 멀티스레드 파싱을 쓰고, `--chunk-size`를 기본값보다 올리십시오. 다른 선택지는 아예 서버에서 돌리지 않고 SSH로 로그를 내 기기로 흘려보내는 것입니다.
- 일주일이 넘는 이력은 어떻게 보관하나요
- 영속화하면 됩니다. 먼저 `--persist`로 한 번 실행해 데이터셋을 디스크에 쓰고, 이후 실행마다 `--restore --persist`로 기존 것을 불러오면서 새 줄을 덧붙입니다. 파일별 inode와 마지막으로 파싱한 줄의 타임스탬프를 저장하므로 로테이트된 로그에 다시 실행해도 중복 집계되지 않습니다. 전부 영원히 두는 대신 이동하는 창이 필요하면 `--keep-last`를 더하십시오.
You built it. Now grow it.
AgentCeres is a managed AI marketing team — specialists draft the SEO, social, and outreach that fill your links, you approve what ships. 14-day free trial, from $39/month.