로거 : Node.js로 로거를 생성할 때 고려해야 할 사항

최근 직장에서 우리는 서로 상호 작용하는 시스템이 더 복잡한 시스템으로 성장하여 시스템 간의 흐름을 추적하기가 점점 더 어려워지는 문제에 직면했습니다.

우리는 다음과 같은 영역에서 우리를 돕기 위해 계획된 이러한 시스템에 대한 더 많은 가시성이 필요했습니다.

1- 무언가 실패할 때 디버깅하기 쉬운 문제
2- 런타임에 발생하는 문제를 쉽게 식별할 수 있습니다.
3- 디버깅 시간 단축

그래서 우리는 로거를 결정했습니다. 우리는 더 많은 가시성을 추가할 수 있는 일반 및 중앙 집중식 로거가 필요했습니다.

무엇을 기록할 수 있습니까?

솔직히 말해서 당신은 당신이 가질 수 있다고 생각하는 많은 정보를 기록할 수 있습니다.
자신만의 로거를 만들기로 결정하는 방법은 필요한 것을 저장하는 것입니다. 이 경우:

1 - 여러 시스템 간에 변경된 레코드, 이 레코드의 상태 변경을 추적하고 저장하고 있습니다.

2- 코드 실행과 시스템 간에 변경되는 매개변수를 저장하고 있습니다.

3- 우리는 이 로거에서 더 복잡한 보고서를 더 쉽게 얻을 수 있도록 무거운 계산을 수행하고 저장하고 있습니다.

귀하의 경우 :
시스템 전체에서 사용자를 추적하고, 요청을 추적하고, 시스템 동작을 추적하고, 시스템 활동을 추적하는 등의 작업을 수행할 수 있습니다.

로거는 비즈니스 결정에 도움이 될 수 있으며 BI 도구 또는 모든 데이터 과학 절차에서 사용할 수 있습니다.

그러나 Node.js에서 로거를 생성할 때 고려해야 할 몇 가지 사항이 있습니다.
너무 많은 정보와 너무 많은 I/O 상호 작용을 장치 또는 데이터베이스와 함께 저장할 수 있습니다.

1 - 요청-응답 주기 및 메인 스레드( Node.js )를 차단하지 마십시오.

A ) 각 로거 삽입을 "기다리지"마십시오. 성공을 위해 각 라인에서 멈추고 다음 라인에 도달한다는 것을 알고 있습니까?
Promise.all()을 사용하여 병렬화하고 Single await를 사용하면 작업이 병렬로 실행됩니다.

Await Promise.all([promise1, promise2, promise3])


B) 이것을 더 좋게 만들어 봅시다. 모두 병렬로 실행되고 모두 성공할 때까지 이것이 라인에 도달하지 않는다는 것을 알고 있습니까?

Node.js는 단일 스레드이지만 코드를 차단하지 않고 실행되도록 백그라운드에서 다른 스레드를 시작합니다. 흠흠, 우리의 사용 사례에 도움이 되도록 이것을 만들어 봅시다. 하지만 어떻게 될까요?
Node.js에서는 Promise를 해결하기 위해 Await와 .then을 모두 사용해야 합니다. 따라서 Await를 사용하여 작업이 완료되기를 기다리는 대신 .then()을 추가하면 해결됩니다. The Cool 일부는 코드 실행이 계속되고 다른 작업을 실행하며 이 특정 작업이 백그라운드에서 실행된다는 것입니다.

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});


C ) 정말 멋지군요. 이제 백그라운드에서 실행되는 비차단 로거가 있지만 백그라운드에서 실행 중인 작업이 있고 너무 많은 시간이 걸리기 때문에 여전히 요청이 종료되지 않습니다.

이에 대한 해결책이 있습니다. 응답이 클라이언트로 다시 전송된 후 로거를 실행해야 합니다. Node.js에서 코드는 사용자를 기다리게 하지 않기 위해 기본적으로 우리가 원하는 요청을 종료한 후에도 계속 실행됩니다.

res.send('Hello World!')

//DO SOMETHING HERE 


2- 데이터베이스에 저장하는 경우 너무 많은 삽입으로 DB를 압도하지 말고 배치 삽입 또는 배치 업데이트를 사용하는 것이 가장 좋습니다.

또는 대기열을 사용하여 로드를 줄이고 데이터베이스 CPU 사용량을 줄일 수 있습니다(쉽게 최대값에 도달하는 경우).

예: AWS SQS 서비스

3- 너무 많은 HTTP 요청으로 서버를 압도하지 마십시오.

사용자 위치를 저장하는 경우 매 초마다 사용자를 추적하고 로거를 저장하도록 서버에 알리는 것은 좋지 않습니다.
예를 들어 20초마다 서버에 접속하거나 소켓 채널과 같은 다른 HTTP 연결을 열어 로그를 보내고 부하를 줄일 수 있습니다.

4- 의미 있는 데이터를 저장하고 이러한 로그를 보다 효과적인 방법으로 사용할 수 있는 위치에 대해 장기적으로 생각하십시오.

결론적으로, 이것이 내가 원하는 것을 Logging하는 이 문제에 효과적인 방식으로 접근한 방법입니다.

좋은 웹페이지 즐겨찾기