프로그래밍/General

[CloudFlare] Workers Log 편하게 보는 법

Lou Park 2023. 2. 2. 23:56

wrangler tail

Worker에 찍은 console.log들을 편하게 보고싶은데, CF에서 제공하는 Real-time Logs는 내가 원하는 정보보다 방대하다. 아래는 그 로그의 예시인데, "logs" 부분에 당시 내가 찍은 console.log가 있다면 담기는 식이다. 실패한 요청만 필터링을 거는 등 스마트하게 로그를 보고싶다면 wrangler tail 명령어를 이용하면된다.

{
  "outcome": "ok",
  "scriptName": "entrypoint",
  "exceptions": [],
  "logs": [], // ****** 바로 여기 !! *********
  "eventTimestamp": 1675348988505,
  "event": {
    "request": {
      "url": "https://...",
      "method": "GET",
      "headers": {
        "accept-encoding": "gzip",
        "cf-connecting-ip": "",
        "cf-ipcountry": "KR",
        "cf-ray": "",
        "cf-visitor": "{\"scheme\":\"https\"}",
        "connection": "Keep-Alive",
        "host": "",
        "user-agent": "",
        "x-forwarded-proto": "https",
        "x-real-ip": ""
      },
      "cf": {
        ...
      }
    },
    "response": {
      "status": 200
    }
  },
  "id": 1
}

 

내 Worker는 에러가 날 경우 아래와 같은 응답을 하고, console에 해당 에러를 찍어준다.

{ error: 'system error' }

 

이런 로그들만 모아서 보고싶다면 다음과 같이 입력해주면된다.

wrangler tail YOUR_WORKER_NAME --search error --format json |  jq --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "logs")))'

--search 옵션은 console.log의 내용에서 문자열에 해당하는 로그들만 필터링하여 보여준다.
추가적으로 --format 옵션도 주었는데, 기본값은 pretty이다. pretty로 설정할 경우 자세한 내용이 나오지 않고 METHOD, 응답값, URL 정도만 나오므로 json 값으로 설정해주었다.

다음은 jq를 활용한다.

 

jq는 Commandline JSON Processor로, JSON 입력을 처리해주는 기능을 제공한다. stream 처리를 하려하기에 약간 복잡하지만, "logs"만 뽑아오는 부분이라고 이해하면된다.

 

응용으로, 서버에서 logrotate와 함께 백그라운드로 내내 돌려주면 나중에 문제가 생겼을때 로그를 바로 찾아볼 수 있다.