"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go에서 비활성화된 명령문에 대한 효율적인 로깅을 달성하는 방법은 무엇입니까?

Go에서 비활성화된 명령문에 대한 효율적인 로깅을 달성하는 방법은 무엇입니까?

2024-11-08에 게시됨
검색:165

How to Achieve Efficient Logging for Disabled Statements in Go?

Go에서 비활성화된 문에 대한 효율적인 로깅

중요한 경로에서는 동적으로 전환할 수 있는 디버그/추적 로깅 문을 포함하는 것이 좋습니다. 실행 시간. 이 방법은 오프라인으로 전환된 프로덕션 시스템을 디버깅하거나 프로덕션 환경을 미러링하는 테스트 시스템에 이상적입니다.

그러나 이러한 유형의 로깅에는 중요한 요구 사항이 있습니다. 비활성화된 문은 성능에 최소한의 영향을 주어야 합니다. C/C에서는 플래그가 확인될 때까지 인수 평가를 억제하는 LOG 매크로를 통해 이를 달성했습니다.

Implementing Disabled Logging in Go

Go에서 이 동작 에뮬레이션 도전을 제시합니다. log.Logger와 함께 io.Discard를 사용하는 것은 비활성화된 경우에도 로그 메시지 형식을 지정하므로 옵션이 아닙니다.

EnabledLogger 구조체를 사용한 초기 시도는 log.Logger 인터페이스를 구현하여 Enabled에 따라 로깅을 활성화/비활성화합니다. 깃발. 그러나 인수 평가는 억제되지 않은 상태로 유지되어 잠재적으로 임의 함수 호출에 대한 성능 문제로 이어질 수 있습니다.

두 가지 해결 방법

이 문제를 해결하려면 다음 두 가지 해결 방법이 있습니다.

  1. 래퍼 유형: 래퍼 유형을 활용하여 함수 호출을 연기하여 표현식이 다음까지 평가되지 않도록 합니다. 활성화된 검사가 통과되었습니다.
  2. 수동 검사: 비활성화된 경우 실행을 방지하기 위해 활성화된 검사로 로깅 문을 수동으로 래핑합니다.

두 접근 방식 모두 장황한 결과를 초래합니다. 오류가 발생하기 쉬운 코드로 인해 잠재적인 성능 저하가 발생할 수 있습니다.

기타 옵션

Go의 정적 평가 규칙에도 불구하고 몇 가지 추가 옵션이 있습니다:

  • 사용자 정의 로그 포맷터: fmt.Stringer 및 fmt.GoStringer 활용 인터페이스는 실행 시간까지 인수 형식화를 지연할 수 있습니다.
  • 런타임 로거 교환: 전체 로깅 메커니즘은 로거 인터페이스 또는 빌드 제약 조건을 통해 교체될 수 있습니다.
  • Go 코드 생성: 고급 코드 생성 기술은 AST를 구문 분석하고 특수 디버그 빌드를 생성하여 잠재적으로 코드를 전처리할 수 있습니다.

이러한 솔루션은 동적 런타임 구성에 적합하지 않지만 특정 시나리오에서 성능을 향상시킬 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3