on
Node.js 로깅에 대한 전체 안내서
Node.js 로깅에 대한 전체 안내서
오류를 찾을 때 가장 유용한 자바스크립트 함수는 무엇인지 질문해보면 console.log 라는 답이 나옵니다.
개발 단계에서 로깅 또는 디버깅 오류를 탐지하는 것은 매우 쉽습니다. 그러나 프로덕션에서는 애플리케이션을 모니터링하고 문제를 해결하는 데 매우 중요하므로 로깅에 대해 훨씬 더 많이 고려해야 합니다.
이 문서에서는 핵심 개념과 모범 사례를 설명하여 완전히 유연한 로깅 프레임워크를 구현하도록 안내합니다. 구현에 들어가기 전에 기본 사항부터 살펴보겠습니다.
로깅은 무엇이고 왜 중요한가?
로깅은 응용 프로그램 활동에서 생성된 정보를 로그 파일에 기록하는 프로세스입니다. 로그 파일에 저장된 레코드를 로그라고 합니다. 로그는 프로그램에 대한 정보를 유지하는 간단한 방법입니다.
로그는 특히 서버의 오류와 이벤트 흐름을 추적하기 위해 프로그래머로 보이는 첫 번째 장소입니다.
개발 중 오류 추적에 있어서는 일반적으로 console.log 를 사용하거나 디버거를 실행합니다.
그러나 애플리케이션이 생산 수준으로 올라가고 사용자가 상호 작용하기 시작하면 더 이상 console.log 를 할 수 없다. 문제가 발생하여 앱이 다운되면 콘솔로 확인할 수 없습니다.
그래서 간결하고 깨끗하고 품질 좋은 벌목 프레임워크가 필요합니다.
이 로그는 로그 이벤트의 라이브 스트림을 제공하여 이상 징후, 악성 프로그램 작업 또는 무단 리소스 액세스를 실시간으로 진단하는 데 사용될 수 있습니다. 그것은 시스템에 대한 추가적인 보안이다.
따라서 궁극적으로 개발자, DevOps, SysAdmins 또는 SecOps가 보다 쉽게 통찰력을 얻고 애플리케이션 및 인프라 문제의 근본 원인을 파악할 수 있습니다.
로깅 수준
이것은 모든 로깅 시스템에서 가장 중요한 부분입니다. 로그 수준은 로그의 메타데이터입니다. 수준은 기록된 인시던트의 심각도를 정의합니다.
처음부터 로그 수준이 있는 이유는 더 많은 주의가 필요한 로그를 신속하게 확인할 수 있기 때문입니다.
다섯 가지 주요 수준의 벌목이 있습니다. 우선 순위에 따라 다음과 같이 정렬할 수 있습니다.
참고: 로거의 일반적인 동작은 현재 레벨과 위의 레벨 로그만 추적하는 것입니다. 따라서 로그레벨을 INFO로 설정하면 INFO, WARN, ERROR 등의 로그 이벤트만 나온다.
로깅 모범 사례
로깅 시스템을 구현하기 전에 다음과 같은 모범 사례를 숙지해야 합니다.
- 벌목의 의미가 있어야 하며 목적이 있어야 한다
불필요한 로그는 빠르게 노이즈가 되므로 추가하지 마십시오. 또한 응용 프로그램의 로그 쓰기 빈도가 높으면 응용 프로그램의 성능에 직접 영향을 미칩니다.
참고: 코드베이스에 문제가 없는 한 프로덕션에서 DEBUG 또는 TRACE 수준을 활성화해서는 안 됩니다. (문제를 해결한 후에는 반드시 INFO 또는 ERROR 단계로 다시 전환한다.)
2. 트래픽이 많은 애플리케이션이 있는 경우 로그를 여러 로그 파일로 나눕니다.
이 경우 로그 파일이 너무 길어져 분석할 때 어려움에 직면하게 됩니다. 별도의 로그 수준에 대해 별도의 로그 파일을 갖거나 대부분의 로그 프레임워크에서 사용할 수 있는 롤링 로그 파일 기능을 사용해 볼 수 있습니다.
시간 또는 크기에 따라 로그 파일이 압축됩니다. 이 일별 롤링 로그 파일 기능은 대부분의 엔터프라이즈 레벨 응용 프로그램에서 사용됩니다.
3. 벌목은 구조화되고 레벨별로 수행되어야 한다.
위에서 살펴본 바와 같이 로그는 우선순위 수준에 따라 처리되어야 합니다. 로그를 분석하고 매우 짧은 시간 내에 문제를 찾는 데 도움이 될 것입니다.
또한 로그 네임스페이스로 깔끔하게 정리하십시오. 로깅 시 타임스탬프를 추가하는 것이 가장 좋습니다.
4. 로깅으로 인해 오류 또는 예외가 발생해서는 안 됩니다.
때때로 로그는 심각한 오류를 일으킬 수 있습니다. 이 예제를 참조하십시오. → getUser(id) 로 정의된 사용자 서비스 방법이 있다고 가정해 보자. 사용자를 찾으려면 ID를 전달해야 한다. 처리할 때 사용자 이름을 기록하려고 합니다.
js logger.info('처리 사용자: ${user)Service.getUser().getName()';
이 경우처럼 ID 전달을 잊은 경우 getUser()는 null을 반환하고 getName()은 예외를 발생시킵니다. 그러니 이런 어리석은 실수를 하지 않도록 하세요. ## - 벌목업자는 중요한 정보를 기록하지 않아야 한다 로깅 시, 우리는 사용자 이름과 비밀번호, 카드 번호, CVV 번호와 같은 금융 정보와 같은 중요한 정보를 기록하지 않도록 해야 합니다. 좋아! 이제 로깅할 때 사용해야 하는 관행을 완벽하게 이해하셨다고 생각합니다. 이제 구현에 대해 자세히 살펴보겠습니다. 로깅을 위한 라이브러리/프레임워크는 무엇입니까? 당신을 위해 그 일을 쉽게 할 수 있는 수많은 도서관들이 있다. NPM에서 사용할 수 있는 Node.js 로깅 라이브러리는 다음과 같습니다. 이 기사에서는 윈스턴 라이브러리를 사용할 것입니다. # 왜 윈스턴 로거인가? Winston은 Node.js용 가장 강력하고 유연한 오픈 소스 로깅 라이브러리 중 하나입니다. 기본적으로 윈스턴은 거의 모든 것에 대해 싸운다! 사용자 지정이 용이한 매우 직관적인 도구입니다. 코드 몇 줄만 변경해도 이면의 논리를 수정할 수 있습니다. 데이터베이스나 파일과 같은 영구 저장 위치에 훨씬 쉽고 간편하게 로깅할 수 있습니다. NPM 트렌드와 함께 이 Winston 라이브러리의 인기를 살펴보겠습니다.  분석에서 보셨듯이 윈스턴의 인기를 실감하실 수 있습니다. 하지만 어떤 이유로 이 영화가 이렇게 많은 관객을 얻었을까요? 그 이유는 → Winston이 다음을 제공하기 때문입니다. 좋아! 최상의 로깅 프레임워크 중 하나를 선택합니다. 이제 이것들을 실행해 봅시다. # Node.js에서의 윈스턴 구현 로깅 시나리오를 시연하기 위해 간단한 REST 서버를 만들었습니다. 현재 단순성을 위한 API는 두 개뿐입니다. 폴더 구조는 다음과 같습니다.  먼저 다음 명령을 사용하여 Winston 로깅 라이브러리를 추가해야 합니다. ```js npm i 윈스턴 ``` yarn을 사용하는 사람은 누구나 yarn add 윈스턴으로 설치할 수 있으므로 로거를 초기화해야 한다. 이를 위해 `utils`에 `logger.js `어떻게 이 코드로 시작되는지 보자`라는 파일을 이미 작성했습니다. 윈스턴 라이브러리에서 `createLogger` 함수를 호출하여 로거를 초기화할 수 있다. 그리고 운송 수단을 정의해야 합니다. 이 운송수단은 무엇입니까? 통나무는 어디론가 가져가야 해. 전송은 로그가 저장되는 곳입니다. 단일 파일, 콘솔 또는 AWS의 S3, Elasticsearch, MongoDB 등과 같은 타사 시스템에 로그아웃하는 30개 이상의 전송 옵션이 있습니다. `transports:` 배열에 원하는 수의 전송을 추가할 수 있습니다. 이러한 전송에 대해 더 알고 싶다면 이 공식 윈스턴 깃허브 페이지를 방문하면 됩니다. 트랜스포터 객체에서 로그를 저장할 파일 이름을 지정할 수 있습니다. 그리고 흥미로운 부분이 나옵니다. 로그 메시지를 원하는 대로 포맷할 수 있습니다. 기본적으로 로그 레코드는 포맷되지 않으며 로그 메시지와 레벨이라는 두 가지 매개 변수가 있는 JSON 문자열로 인쇄됩니다. 그러나 이 값을 덮어쓰고 미리 정의된 토큰, 타임스탬프, 색상 등과 같은 매개 변수를 추가하는 것은 위와 같이 간단합니다. 좋아! 이제 로거를 기능에 추가할 수 있습니다. 서버가 시작되면 로거를 추가합시다. 먼저, 로거를 가져와야 하고, 그 다음 로거의 기능을 호출할 수 있습니다. ```js 구성 로거 = required(."/utils/requires"); app.fort(포트, () => { logger.info('서버가 포트: ${port}에서 시작되었습니다!`); }); ``` 얼마나 간단한지 보세요. logs/server.log` 파일에서 다음과 같은 출력을 볼 수 있습니다.  로그 레벨도 변경할 수 있습니다. 어떻게 작동하는지 봅시다. 이 로거를 인증 처리기에 추가했습니다. ```js if (!req.get("인증") { log.error("인증되지 않음!"); res.status(401).json({ 메시지: "사용자 인증되지 않음!" })을(를) 반환합니다. ``` 그런 다음 권한 부여 헤더 없이 이 API를 트리거해 보고 로그 파일에 오류 로그를 볼 수 있습니다.  이러한 API 엔드포인트는 리포지토리의 내 readme 파일에 명확하게 정의되어 있습니다. 한번 시도해 보세요. 전체 코드 구현에 대한 링크는 리소스 섹션에서 확인할 수 있습니다. 참고: 이것은 시연용일 뿐입니다. 앞서 언급한 바와 같이 로그는 의미 있는 것이어야 하며 이러한 로그를 추가할 때 성능 오버헤드가 있으므로 모든 곳에서 사용해서는 안 됩니다. # 다중 운송 여러 대의 교통편을 이용할 수 있습니다. `logger.js`에서 다음과 같이 `createLogger` 함수를 변경합니다. 로그 폴더에 서버를 실행한 후 새 파일이 작성되었음을 확인할 수 있습니다.  참고: Winston은 운송을 한 단계만 제한하는 기능이 아직 개발되지 않았습니다. 그래서 우리는 그렇게 하기 위해 맞춤형 논리를 구현해야 합니다. 이 링크를 통해 더 많은 가능한 솔루션을 살펴볼 수 있습니다. # 다중 로그거 윈스턴을 사용하면 사용자 지정 로거를 만들 수 있습니다. 이렇게 하면 응용 프로그램 서비스에 따라 특정 로거를 제어하고 사용자 지정할 수 있습니다. 예를 들어, 사용자 서비스와 인증 서비스의 경우 두 개의 로거를 별도로 둘 수 있습니다. 이제 어디서나 특정 로거 양식에 액세스하여 로깅을 추가할 수 있습니다. 사용자 서비스에서는 다음 코드를 사용할 수 있습니다. 인증 서비스에서 다음 코드가 사용됩니다. 보시다시피 로그는 별도로 표시됩니다.  이렇게 하면 로그가 특정 문제에 대해 분리되어 있고 사용자 및 트랜잭션 특성이 제공되어 로그를 특정 사용자 또는 트랜잭션으로 쉽게 관리할 수 있습니다. # 일별 롤링 로그 파일 모범 사례에서 언급한 바와 같이 이 기능을 사용하면 조건에 따라 로그 파일을 회전할 수 있습니다. 로그는 날짜, 크기 제한에 따라 회전할 수 있으며 오래된 로그는 개수 또는 경과 일수에 따라 제거할 수 있습니다. 그러나 이를 위해서는 추가 윈스턴 라이브러리가 필요합니다. ```js npm 윈스턴-데일리-매일 파일 설치 ``` 이제 다음 코드를 사용하여 `logger.js` 파일에 새 전송을 추가할 수 있습니다. 이 코드에서는 로그가 매일 배포되기를 바란다고 말합니다. 우리는 또한 정의한다, 다음 날 로그가 다른 파일에 기록된다는 것을 알게 될 것입니다. 로그 파일 크기가 정의된 제한을 초과할 경우 로그를 얻을 수 있습니다. 또한 정의한 날짜 기간이 지나면 이전 로그가 자동으로 제거됩니다.  이상으로 튜토리얼을 마치겠습니다. 벌목에서 가장 중요한 부분을 다루었기를 바랍니다. # 결론 응용 프로그램에 적절한 로깅 시스템을 설정하는 것은 훌륭한 생명의 은인이 될 것이므로 현명하게 사용하십시오. 간단히 요약하자면 다음과 같습니다. 이제 다음 응용 프로그램에서 로깅을 구현할 준비가 완벽하게 되었습니다. 읽어주셔서 감사합니다. 즐거운 벌목 되세요! # 자원.
from http://top-poster.tistory.com/17 by ccl(A) rewrite - 2021-09-23 06:02:03