LabHub
배우기 러닝패스 코스

LFCS — Linux Foundation System Administrator

Shaping and Aggregating Logs

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

직접 만든 로그를 grep·sed·awk·cut·tr·sort·uniq 로 가공하고, jq 와 yq 로 구조화된 데이터에서 값을 뽑아낸다.

왜 중요한가

LFCS 의 텍스트 처리 문제는 "정답 한 줄을 아는가" 가 아니라 필드 단위로 사고하는가를 본다. 줄 전체를 정규식으로 훑으면 바이트 수 컬럼의 500 같은 것까지 걸린다. 그래서 상태 코드는 네 번째 필드라는 구조를 먼저 잡고, 그 위에 도구를 얹어야 한다. 집계도 마찬가지다 — sort | uniq -c | sort -rn 은 관용구지만, 왜 앞에서 한 번 정렬해야 하는지(uniq 는 인접한 중복만 지운다) 를 모르면 상황이 조금만 바뀌어도 무너진다. 마지막 두 단계는 요즘 운영 현실이다. 설정은 대부분 JSON 이나 YAML 이고, 값 하나를 꺼내려고 파이썬을 켜는 대신 jqyq 로 끝내는 손이 필요하다.

단계

  1. /root/lfcs-text/access.log 를 아래 12줄 그대로 만드세요. 필드는 공백 하나로 구분하며 <IP> <메서드> <경로> <상태코드> <바이트> 입니다.
10.0.0.117 GET /api/users 200 512
10.0.0.118 POST /api/users 201 128
10.0.0.117 GET /api/orders 500 64
10.0.0.120 GET /healthz 200 12
10.0.0.117 GET /api/users 200 512
10.0.0.116 DELETE /api/users 403 96
10.0.0.118 GET /api/orders 500 64
10.0.0.117 POST /api/orders 201 256
10.0.0.120 GET /healthz 200 12
10.0.0.117 GET /api/users 404 32
10.0.0.115 GET /api/orders 200 1024
10.0.0.118 GET /healthz 200 12
  1. 상태 코드가 5 로 시작하는 줄만 원본 순서 그대로 /root/lfcs-text/errors.txt 에 담으세요.
  2. IP 별 바이트 합계를 /root/lfcs-text/bytes_by_ip.txt<IP> <합계> 형식으로, 합계 내림차순으로 적으세요.
  3. 가장 많이 등장한 IP 를 /root/lfcs-text/top_ip.txt<횟수> <IP> 한 줄로 적으세요.
  4. 두 번째 필드(HTTP 메서드)를 뽑아 소문자로 바꾸고 중복을 없앤 뒤 사전순으로 정렬해 /root/lfcs-text/methods.txt 에 적으세요.
  5. access.log/root/lfcs-text/access-v2.log 로 복사한 뒤, 그 사본에서 경로의 /api//v2/api/ 로 바꾸세요. 편집 전 내용은 /root/lfcs-text/access-v2.log.bak 으로 남아야 하고 access.log 원본은 그대로여야 합니다.
  6. /root/lfcs-text/services.json 을 아래 내용으로 만들고, tierbackend 인 서비스의 replicas 합계를 /root/lfcs-text/jq_out.txt 에 숫자 하나로 적으세요.
{
  "cluster": "homelab",
  "services": [
    {"name": "api", "replicas": 3, "tier": "backend"},
    {"name": "web", "replicas": 5, "tier": "frontend"},
    {"name": "worker", "replicas": 2, "tier": "backend"}
  ]
}
  1. /root/lfcs-text/deploy.yaml 을 아래 내용으로 만들고, /root/lfcs-text/yq_out.txtreplicas=<값>image=<값> 두 줄을 적으세요.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: lfcs-web
  namespace: lfcs
spec:
  replicas: 4
  template:
    spec:
      containers:
        - name: web
          image: nginx:1.27

참고

분석할 로그 파일 만들기

/root/lfcs-text/access.log 를 아래 12줄 그대로 만드세요. 필드는 공백 하나로 구분하며 <IP> <메서드> <경로> <상태코드> <바이트> 입니다.

지시문의 12줄을 그대로 만들면 됩니다. 필드 구분은 공백 하나이고 줄 순서도 그대로여야 뒤 단계 결과가 맞습니다.

5xx 응답만 추려 내기

상태 코드가 5 로 시작하는 줄만 원본 순서 그대로 /root/lfcs-text/errors.txt 에 담으세요.

상태 코드는 네 번째 필드입니다. 줄 전체에서 500 을 찾으면 바이트 수에 500 이 들어간 줄까지 걸릴 수 있으니 필드를 지정해 판단하세요.

IP 별 바이트 합계

IP 별 바이트 합계를 /root/lfcs-text/bytes_by_ip.txt<IP> <합계> 형식으로, 합계 내림차순으로 적으세요.

awk 의 연관 배열에 IP 를 키로 두고 다섯 번째 필드를 더해 가면 됩니다. 마지막에 배열을 순회해 출력하고 숫자 기준 내림차순으로 정렬하세요.

가장 많이 등장한 IP

가장 많이 등장한 IP 를 /root/lfcs-text/top_ip.txt<횟수> <IP> 한 줄로 적으세요.

중복을 세려면 먼저 정렬해야 합니다. 개수를 붙여 주는 도구의 출력은 '개수 값' 순서라는 점을 그대로 활용하세요.

메서드 목록 정규화

두 번째 필드(HTTP 메서드)를 뽑아 소문자로 바꾸고 중복을 없앤 뒤 사전순으로 정렬해 /root/lfcs-text/methods.txt 에 적으세요.

필드를 잘라 내는 도구와 글자를 바꾸는 도구를 이어 붙입니다. 중복 제거는 정렬 도구의 옵션으로도 됩니다.

원본을 지키며 치환하기

access.log/root/lfcs-text/access-v2.log 로 복사한 뒤, 그 사본에서 경로의 /api//v2/api/ 로 바꾸세요. 편집 전 내용은 /root/lfcs-text/access-v2.log.bak 으로 남아야 하고 access.log 원본은 그대로여야 합니다.

제자리 편집 옵션에 접미사를 붙이면 편집 전 내용이 그 이름으로 남습니다. 치환 구분자는 슬래시 말고 다른 문자로 바꿔도 됩니다.

JSON 집계

/root/lfcs-text/services.json 을 아래 내용으로 만들고, tierbackend 인 서비스의 replicas 합계를 /root/lfcs-text/jq_out.txt 에 숫자 하나로 적으세요.

배열을 조건으로 걸러 낸 뒤 원하는 필드만 모아 배열로 만들고, 그 배열을 더하는 함수를 쓰면 한 줄로 끝납니다.

YAML 값 추출

/root/lfcs-text/deploy.yaml 을 아래 내용으로 만들고, /root/lfcs-text/yq_out.txtreplicas=<값>image=<값> 두 줄을 적으세요.

경로 표현식은 jq 와 거의 같습니다. 배열 원소는 인덱스로 접근하고, 구현체에 따라 따옴표가 붙어 나올 수 있으니 결과를 눈으로 확인하세요.