로그4js를 사용하여 Nuxt 응용 프로그램의 로그를 처리하는 방법

이 문서에서는 다음을 확인할 수 있습니다.

  • 내부 로그 게이트웨이 방법
  • UDP 예시
  • 에 logstash가 있는 log4js
  • nuxtjs의 플러그인 및nuxt 서버에서 단점을 쉽게 만드는 방법
  • 일부 코드
  • tl;dr-nuxt 응용 프로그램 코드는 here
  • 0. 소개


    거의 모든 항목에서 로그를 더욱 조리 있게 하는 시간이 있을 것이다.이것은 몇 가지 원인이 있을 수 있다.예를 들어 모든 환경에서 온 로그를 집중적으로 포함하거나, 특히 용기화 시대에 로그에 대한 접근을 가속화하는 곳이 있다.어쨌든, 로그는 항상 중요하며, 개발 모델뿐만 아니라 관련 부분에 정보를 제공한다.브라우저 컨트롤러에서 인쇄된 수천 개의 로그를 없애는 것이 가장 좋다!
    나를 믿어라, 일지를 보관하면 좋은 점이 많다

    0.1. 내 방법


    응용 프로그램을nuxt에 구축하면 유용한 가능성을 가져올 수 있습니다.우선, 그것은 자신의 서버가 있고, 그 다음으로, 아주 좋은 플러그인 시스템을 개발했다. (nuxt는 더 멋진 것을 사용할 수 있다.)이 때문에 우리는 이러한 기능을 이용하여 로그 기능을 쉽게 실현할 수 있다.

    nuxt。js app-플러그인 시스템


    official documentation의 공식 문서에 따라 플러그인은 응용 프로그램의 행동을 변경하거나 도구를 추가하거나 기존 도구를 강화할 수 있습니다.만약 정말 그렇게 멋있다면, 나는 그것을 쓰기로 결정했다
    둘 다 주요 목표를 실현하기 위해 간단한 로그 기록 시스템을 제공한다.

    UDP를 선택해야 하는 이유



    대부분의 응용 프로그램에서 UDP는 훨씬 빠를 수 있습니다. 속도가 정말 중요합니다.또 다른 장점은 로그 서버가 닫혔을 때 - 오류가 발생하지 않는다는 것입니다. UDP 때문에 사용자는 그것을 느끼지 못합니다...뭐 공부 해요?😄. 일단 중요한/민감한 데이터를 처리할 필요가 없다면, 속도를 높이기 위해 패키지에 대한 제어를 잃는 것이 좋은 이유일 수도 있다.네, 이것은 논란이 있는 문제입니다. 하지만 한번 해 봅시다.

    흐르다



    왜 그래요?

  • 브라우저에서 UDP 프로토콜이 지원되지 않음
  • 클라이언트와 서버
  • 에서 플러그인(+API 노드) 하나만 완료
  • 프로토콜이나 심지어 단점(외부로 가는 것?)터치 로그 플러그인 없이 한 곳에서 쉽게 교체 가능
  • 로그 서버의 증빙서류는nuxt 단점
  • 뒤에 숨겨져 있다

    0.2. 왜 log4js를 선택했는지


    이것은 많은 선택적 프로토콜이나 플랫폼을 가진 NodeJ를 위한 로그 유틸리티입니다.
    문서에 따라 많은 "appender"가 포함되어 있습니다. ("drivers"라고 할 수 있습니다.)
  • SMTP
  • GELF
  • 대수
  • 로그 스토리지(UDP 및 HTTP)
  • UDP 및 HTTP
  • RabbitMQ
  • Redis
  • Hipchat
  • 이완
  • 우편창
  • InfluxDB
  • 알 수 있듯이 많은 플랫폼, 서버와 프로토콜을 사용할 수 있습니다. 인기가 없고 잊혀진 낡은 UDP가 아니라.)
    이것이 바로 왜log4js가 이렇게 강한가 하는 것이다.만약 당신이 신뢰하는 가장 좋아하는 로그 서버나 프로토콜이 있다면, 위의 목록에서 로그 서버나 시스템을 직접 사용하거나, 응용 프로그램의 라이브러리를 변경할 필요가 없습니다.
    대부분의 사용 가능한 기준 테스트나 로그 라이브러리 비교에서 log4js는 TCP와 UDP를 처리하는 가장 빠른 도구 중 하나임을 알 수 있습니다.

    우리 본론을 이야기하기 시작합시다


    1.0. 설치


    테스트 환경 설정



    1.1. 큰뿔 사슴 더미
    로컬에서 작업: 만약 모든 것이 정상이라면, 우리는 Elasticsearch, Logstash, Kibana를 테스트해야 합니다.
    만약 당신이 시간이 많지 않거나 발명 발명을 좋아하지 않는다면, 예를 들어 this one
    당신의 시스템에 도커와 도커의 조합이 있다는 것을 잊지 마세요. 당신은 이미 준비가 되었습니다!
    어느 곳에서 ELK 스택을 호스팅한 경우 - 건너뛰고 포트 5000에 UDP 입력만 추가하면 됩니다(아래 참조).
  • logstash UDP 입력 플러그인 설치details
  • 현재, logstash 탐지 포트 5000 (또는 원하는 것) 을 사용해야 합니다. 이 때문에 간단한 명령을 추가해야 합니다. 예를 들어 다음과 같습니다.
  • // logstash.conf 
    input {
            udp {
                    port => 5000
            }
    }
    
    위에서 언급한 큰 뿔 사슴 더미를 사용한다면logstash/pipeline/logstash를 편집하십시오.conf 파일
  • kibana 설정에서 색인 모드를 만드는 것을 잊지 마세요
  • 그 순간, 너는 이미 큰 뿔 사슴 창고를 운행하고 남은 일을 완성할 준비가 되어 있다

    1.2. shopware pwa 설치
    시작하기 전에log4js로 증강하려는nuxt 응용 프로그램에 대해 알아보겠습니다. shopware-pwa repository
    나는 이것이 식은 죽 먹기라고 말하고 싶다.전체 과정을 가속화하기 위해서, 우리는 npm에서 직접 얻은 shopware pwacli를 사용할 수 있다
    mkdir my-shopware-pwa
    cd ./my-shopware-pwa
    npx @shopware-pwa/cli init
    
    설치 과정에서 기본값을 유지하면 충분합니다. Shopware 6 실례가 있고 이 실례를 사용하고 싶지 않으면
    나중에 명령yarn dev을 사용하여 프로젝트를 실행할 수 있습니다.

    1.3. 필요한 라이브러리
    이제 필요한 라이브러리를 추가합시다
    yarn add log4js @log4js-node/logstashudp
    
    log4js는 로그 라이브러리입니다. @log4js node/logstashudp는 UDP 전송을 담당합니다.

    2.0. 코드 한 토막


    마지막으로 우리는 코드를 작성할 수 있다.나는 이것이 매우 지루하다는 것을 알고 있지만, 나는 너의 입문 수준이 얼마나 되는지 추측할 수 없다.

    2.1. nuxt 플러그인


    이 플러그인은 로그 게이트웨이(다음 단계의 노드)에 적절한 수준으로 메시지를 전달하는 작업만 있습니다.
    import axios from 'axios'
    
    export default (context, inject) => {
      const logGatewayCall = (level, message) => {
        try {
          // for demo only - use base URLs from env instead;
          axios.post(
            process.client
              ? `http://localhost:3000/log`
              : 'http://127.0.0.1:3000/log',
            { message, level }
          )
        } catch (error) {
          // do nothing since your logger had to be the only one :)
        }
      }
    
      // entrypoint for logging - for both SSR and CSR
      const logger = {
        warn: message => logGatewayCall('warn', message),
        info: message => logGatewayCall('info', message),
        error: message => logGatewayCall('error', message)
      }
    
      // what about capturing the console.error calls and use the custom logger globally?
      const error = (...message) => logger.error(JSON.stringify(message))
      // in prod mode - capture the errors as well
      if (!context.isDev) console.error = error
    
      // Inject $hello(msg) in Vue, context and store.
      inject('log', logger)
      // For Nuxt <= 2.12, also add 👇
      context.$log = logger
    }
    
    위의 코드는 세 가지 방법으로 하나의 대상을 공개했습니다: Warn, info, error, 모든 방법은 사용할 수 있는 로그 단계에 적용됩니다.Logstash에는 우리가 알아야 할 단계와 일치하는 미리 정의된 단계가 있습니다. 정보, 오류, 경고, 추적입니다.이러한 방법의 이름과 수량은 사용자가 결정하고, 브라우저에서 찾을 수 있는 일반적인 이름을 따르기로 결정합니다.
    공식 문서에 따라 플러그인을 ./plugins/logger.js 파일에 넣습니다.
    작업을 수행하려면 다음 항목을 사용하여 파일을 채웁니다nuxt.config.js.
    plugins: ['~/plugins/logger.js']
    

    2.2. /로그 끝점


    이것은 로그 메시지를 전송하는 처리 프로그램으로nuxt가 외부 시스템과 만나고 통신하는 곳입니다.이것은 논리를 배치하는 가장 좋은 위치가 아니지만, 예시 응용 프로그램을 간소화하기 위해서 나는 해냈다.기록기를 단독 서비스에 두는 것은 매우 큰 장점이 있다. vue/nuxt 상하문에서 감지하는 곳이 아니라 어디에서나 사용할 수 있다.
    import { configure, getLogger } from 'log4js'
    
    export default function(req, res) {
      // configure the logger, set the driver to previously installed "@log4js-node/logstashudp"
      configure({
        appenders: {
          logstash: {
            type: '@log4js-node/logstashudp', // UDP "driver"
            host: 'localhost', // for demo only; use value from env instead
            port: 5000 // for demo only; use value from env instead
          }
        },
        categories: {
          default: { appenders: ['logstash'], level: 'info' }
        }
      })
      const logger = getLogger() // get the logger instance
      req.on('data', data => {
        // parse the request payload from the nuxt plugin and push it forward to the log4js configured appender
        const { level, message } = JSON.parse(data)
        switch (level) {
          case 'warn':
            return logger.warn(message)
          case 'info':
            return logger.info(message)
          case 'error':
            return logger.error(message)
        }
      })
    
      res.end()
    }
    
    
    컨텐트 넣기/api/로그.회사 명
    서버 중간부품nuxt의 특성을 사용하여 우리는 API/log 단점으로 응용 프로그램을 확장하여 플러그인에서 전송된 로그를 처리할 준비를 하고 있습니다.솔루션에 대한 추가 정보here
    기능을 발휘하려면 다음을 사용하여 파일nuxt.config.js을 풍부하게 만듭니다.
    serverMiddleware: [
        /*
         ** Custom route is a gateway for upcoming logs!
         */
        { path: '/log', handler: '~/api/log.js' }
      ],
    
    현재,nuxt는/로그 루트의 데이터를 어떻게 처리하는지 알고 있습니다.밝았어

    3.0. 실행 중


    3.1. 플러그인 사용


    이 플러그인은 로그를 위한 새로운 기능을 등록했기 때문에 전 세계에서 사용할 수 있으며, shopware pwa나nuxt 응용 프로그램의 많은 곳에서 접근할 수 있습니다.다음은 vue 구성 요소의 일부입니다.
      asyncData({ $log }) {
        $log.info('component generated')
      },
      mounted() {
        this.$log.warn('component has been mounted')
      },
      // or even inside the setup()
      setup({}, { root }) {
        console.warn(root.$log.error('warning from the setup()'));
      },
    

    3.2. 로그 왜?



    백그라운드에서 적절한 요청을 보냈습니다.log4js 라이브러리는 포트 5000의 UDP를 통해 로그 메시지를 Logstash 서버에 채웁니다.

    3.3. 키바나에서 결과 보기


    이것은 logstash ES 인덱스의 기본 대시보드입니다.

    4.0. 뭐 공부 해요?

  • 클라이언트와 서버 플러그인 논리 분리: 클라이언트의 로그는 로그 게이트웨이(/로그 노드)를 통해 전송될 수 있지만 서버 상하문에서 이렇게 할 이유가 없습니다. 로그4js와 UDP 전송
  • 에 직접 접근할 수 있기 때문입니다.
  • 다른 로그 서버를 사용합니다. 예를 들어graylog는 GELF log4js appender를 통해 재미있게 할 수 있습니다.
  • 키바나 대시보드에 특이한 도표를 추가하면 달라질 것 같다
  • 나는 네가 내가 발표한 첫 번째 dev.to 게시물을 좋아하길 바란다. 게다가 첫 번째이다.
    조심하다💪
    리소스:
  • sample nuxt app on GH
  • shopware-pwa official repository
  • nuxt server middleware docs
  • nuxt plugins docs
  • log4js at npm
  • logstash UDP plugin
  • 좋은 웹페이지 즐겨찾기