Node.js 앱에 대한 로깅

소개



이 기사에서는 Node.js 애플리케이션의 로그를 Winston 라이브러리를 사용하여 구문 분석 가능하게 저장하는 방법을 배웁니다. 로깅이 무엇이고 왜 중요한지 살펴보겠습니다.

목차


  • 로깅이란 무엇입니까?
  • Node.js 응용 프로그램에서 winston 사용
  • 해당 로그를 구문 분석 가능 항목으로 전송

  • 로깅이란 무엇입니까?



    로깅은 시스템 분석을 목적으로 애플리케이션 이벤트 및 데이터를 로그 파일 또는 기타 소스에 기록하는 프로세스입니다.

    로그는 개발자가 오류를 찾고 버그의 원인을 추적하여 수정하는 데 도움이 됩니다. Node.js에서는 애플리케이션 로그를 구조화하는 것이 중요합니다. 개발 단계에 있을 때 console.log를 사용하여 문제를 찾고 필요한 정보를 얻을 수 있습니다.

    그러나 일단 애플리케이션이 생산되면 더 이상 console.log를 사용할 수 없습니다.

    Node.js 애플리케이션에서 winston 사용



    node.js 애플리케이션이 있다고 가정합니다. 이제 프로젝트에 winston & winston-transport를 설치하려면 다음 명령을 실행하세요.

    npm install winston
    npm install winston-transport
    


    이제 우리의 목표는 응용 프로그램의 모든 console 메시지를 winston 로거로 교체하는 것입니다. 따라서 예를 들어 node.js 애플리케이션에 이러한 세 가지 이벤트 로그가 있는 경우 winston 라이브러리를 사용하여 구문 분석 가능하게 저장하려는 경우입니다.

    connsole.warn('Got mutiple elements with same id');
    console.error('Login Failed. Invalid ID');
    console.info('Events posted successfully.');
    


    Node.js 앱에서 Winston 구성

    winston을 구성하고 구문 분석 가능한 로그를 보낼 루트 디렉터리에 'logger' 폴더를 만듭니다.
    이제 logger/index.js에 다음 코드를 추가하십시오.

    const winston = require("winston");
    const { combine, timestamp, label, printf } = winston.format;
    const Transport = require("winston-transport");
    var axios = require("axios");
    
    const myFormat = printf(({ level, message, label, timestamp }) => {
      return JSON.stringify({
        timestamp: timestamp,
        level: level,
        message: message,
      });
    });
    
    class CustomTransport extends Transport {
      constructor(opts) {
        super(opts);
      }
      log(info, callback) {
        console.info(info);
        var data = JSON.stringify([info]);
    
        var config = {
          method: "post",
          url: `https://demo.parseable.io/api/v1/logstream/${streamName}`,
          headers: {
            "X-P-META-Tag": "Owner",
            "X-P-META-Tag": "Host",
            "X-P-META-Tag": "Host.owner",
            Authorization: `Basic ${key}`,
            "Content-Type": "application/json",
          },
          data: data,
        };
    
        axios(config)
          .then(function (response) {
            console.log(response.data);
          })
          .catch(function (error) {
            console.log(error);
          });
    
        callback();
      }
    }
    
    const devLogger = () => {
      const transport = new CustomTransport({});
    
      return winston.createLogger({
        level: "debug",
        format: combine(label(), timestamp(), myFormat),
        transports: [transport],
      });
    };
    
    
    let logger = null;
    
    if (process.env.NODE_ENV !== "production") {
      logger = devLogger()  
    }
    
    module.exports = logger;
    


    여기서 우리는 node.js 애플리케이션에서 winston을 구성하고 로그를 구문 분석 가능하도록 보냅니다.

    더 나은 이해를 위해 이 코드를 부분적으로 논의해 봅시다.

    Initializing winston logger instance

    const devLogger = () => {
      const transport = new CustomTransport({});
      return winston.createLogger({
        level: "debug",
        format: combine(label(), timestamp(), myFormat),
        transports: [transport],
      });
    };
    



    위의 스니펫에는 Winston 로거 인스턴스의 초기화가 포함되어 있습니다. 여기에서 npm 로그 수준 표준을 사용하여 이 특정 로거 인스턴스에 대한 로그 수준, 로그가 저장되는 형식 및

    
     that specifies where the logs data will go. In our case we will send it to the parseable.
    
    
    
    > **Setting custom format of the log data**
    >
    >>
    
     ```js 
    const myFormat = printf(({ level, message, label, timestamp }) => {
      return JSON.stringify({
        timestamp: timestamp,
        level: level,
        message: message,
      });
    });
    


    위의 스니펫은 저장될 로그 데이터의 형식을 지정합니다.

    Sending the log data to parseable

    class CustomTransport extends Transport {
      constructor(opts) {
        super(opts);
      }
      log(info, callback) {
        console.info(info);
        var data = JSON.stringify([info]);
        var config = {
          method: "post",
          url: `https://demo.parseable.io/api/v1/logstream/${streamName}`,
          headers: {
            "X-P-META-Tag": "Owner",
            "X-P-META-Tag": "Host",
            "X-P-META-Tag": "Host.owner",
            Authorization: `Basic ${key}`,
            "Content-Type": "application/json",
          },
          data: data,
        };
        axios(config)
          .then(function (response) {
            console.log(response.data);
          })
          .catch(function (error) {
            console.log(error);
          });
        callback();
      }
    }
    



    위의 스니펫은 로그 데이터를 구문 분석 가능 항목으로 보내는 역할을 합니다. 여기streamName는 구문 분석 가능에서 생성한 로그 스트림입니다. key는 구문 분석 가능 항목에 액세스하기 위한 인증 키입니다.

    calling the logger function

    let logger = null;
    if (process.env.NODE_ENV !== "production") {
      logger = devLogger()  
    }
    



    개발 단계에서 로그를 구문 분석 가능하도록 저장하고 싶지 않을 수 있습니다. 그런 다음 콘솔에서 로그를 확인하여 테스트하고 프로덕션 모드에서 구문 분석 가능하도록 보낼 수 있습니다. 위의 스니펫은 요구 사항에 따라 로거 기능을 호출합니다. 이 조건부 호출을 원하지 않는 경우 함수를 직접 호출할 수도 있습니다.

    그런 다음 응용 프로그램에서 logger 대신 console를 사용할 수 있습니다.

    const logger = require('./logger')
    
    logger.warn('Got mutiple elements with same id')
    logger.error('Login Failed. Invalid ID')
    logger.info('Events posted successfully.')
    


    결론



    만세!!🥳🥳🥳

    node.js 애플리케이션과 parseable을 성공적으로 통합했습니다. 이제 애플리케이션을 실행할 수 있으며 logger로 대체한 모든 이벤트가 구문 분석 가능하도록 게시되고 이전에 생성한 logstream를 체크인할 수 있습니다.

    좋은 웹페이지 즐겨찾기