TL;DR

  • LWP::ConsoleLogger::Everywhere는 코드 변경 없이 HTTP::Tiny 기반 사용자 에이전트(UserAgent)의 네트워크 요청과 응답을 추적하는 Perl 디버깅 도구임.
  • 명령줄에서 Perl의 -M 옵션에 모듈을 추가하면 호출이 발생하는 패키지를 몰라도 사용자 에이전트 동작을 확인할 수 있음.
  • MetaCPAN::Client의 기본 사용자 에이전트인 HTTP::Tiny로 MetaCPAN API를 호출하고, 요청·응답 헤더와 본문을 출력하는 사례임.
  • Data::Printer 설정에 caller_info = 1을 추가하면 출력 위치가 함께 표시되어 내부 동작을 파악하는 데 맥락을 더함.
  • 기존 LWP::UserAgent, WWW::Mechanize, Mojo::UserAgent 지원에 HTTP::Tiny 지원이 더해진 라이브러리임.

HTTP::Tiny 호출을 어디서든 디버깅하기

  • LWP::ConsoleLogger는 libwww-perl 기반 사용자 에이전트인 LWP::UserAgent와 WWW::Mechanize를 오랫동안 다루며 유용하게 사용해 온 라이브러리임.
  • 이후 사용자 에이전트 호출이 어디서 발생하는지 알 필요 없이 디버깅하는 LWP::ConsoleLogger::Everywhere가 소개됐으며, 지원 대상에 Mojo::UserAgent가 추가된 데 이어 HTTP::Tiny도 포함됨.
  • 이 도구는 코드에 직접 디버깅 기능을 넣거나, Perl의 -M 옵션을 이용해 코드를 한 줄도 수정하지 않고 명령줄에서 실행하는 방식임.

명령줄에서 요청 내용 확인

  • 예시에서는 MetaCPAN::Client로 MetaCPAN API를 호출하며, 이 클라이언트의 기본 사용자 에이전트는 HTTP::Tiny임.
  • MetaCPAN::Client를 사용해 LWP-ConsoleLogger 배포판 정보를 요청하면 https://metacpan.org/release/LWP-ConsoleLogger가 출력됨.
  • 명령줄에 -MLWP::ConsoleLogger::Everywhere를 추가하면 실제 사용자 에이전트 호출이 어느 패키지에서 이뤄지는지 몰라도 디버깅 정보가 표시됨.
  • 출력에는 GET https://fastapi.metacpan.org/distribution/LWP-ConsoleLogger 요청과 전송 전·후 요청 헤더, 응답 상태 200 OK, 응답 헤더와 본문이 포함됨.
  • 응답 본문에는 배포판 이름과 저장소 정보, 이슈 수, 버그 추적 주소 https://github.com/oalders/lwp-consolelogger 등이 JSON 형식으로 나타나며, Data::Printer가 이를 출력한 텍스트 형태도 확인 가능함.

호출 위치 정보 추가

  • 출력에 나타나는 Printing in line 482 of …LWP/ConsoleLogger.pm: 문구는 Data::Printer 설정의 부수 효과임.
  • ~/.dataprinter 파일에 caller_info = 1을 설정하면 출력 위치 정보가 표시되며, 이는 내부에서 무슨 일이 일어나는지 파악하는 데 추가 맥락을 제공함.
  • 사용자 에이전트를 디버깅할 때 이런 도구가 다른 언어에도 얼마나 있는지는 알 수 없지만, Golang에서 사용자 에이전트를 디버깅할 때는 이런 기능이 그리워짐.
  • Playwright에서도 더 복잡한 도구를 만들어 본 적이 있으며, 터미널에서 보기 편한 형식의 이미지까지 출력하는 기능을 포함함. 사용 사례는 좁고 다른 사람에게 설명하기 어려운 편이지만, 제작 과정은 즐거운 경험임.

관련 글

  • Introducing LWP::ConsoleLogger::Everywhere
  • Observing Network Traffic with LWP::ConsoleLogger::Everywhere
  • UserAgent Debugging Made Easy