아무거나

log4js-node 로그 라이브러리 적용 본문

Javascript & HTML & CSS/NodeJS

log4js-node 로그 라이브러리 적용

전봉근 2024. 1. 17. 18:57
반응형

기본구성 또는 커스텀 라이브러리 구성중 선택하여 사용하면 된다.

 

  • log4js-node 로그 라이브러리 적용
    • 기본구성
      • 설치
        // https://github.com/log4js-node/log4js-node
        $ npm install log4js
        
      • 샘플
        const log4js = require("log4js");
        const logger = log4js.getLogger();
        log4js.configure({
          appenders: { test: { type: "file", filename: "test.log" } },
          categories: { default: { appenders: ["test"], level: "info" } },
        });
        
        app.get(`/test`, async (req, res) => {
          try {
            throw new Error();
          } catch(error) {
            logger.error("Error:", error);
          }
        
          res.json({
            success: true
          });
        });    
        
    • Custom Layout 구성
      // ================================= lo4js Start
      const log4js = require("log4js");
      const util = require("util");
      
      // init
      // 색상
      const getColor = (level) => {
        switch (level) {
          case "TRACE":
            return "\x1b[35m"; // Magenta
          case "DEBUG":
            return "\x1b[36m"; // Cyan
          case " INFO":
            return "\x1b[32m"; // Green
          case "ERROR":
            return "\x1b[31m"; // Red
          default:
            return "\x1b[0m"; // Reset
        }
      };
      
      // 콘솔용 레이아웃
      log4js.addLayout("customLayout", function (config) {
        return function (logEvent) {
          const logTime = logEvent.startTime.toISOString();
          const level = logEvent.level.levelStr
          const levelColor = getColor(level);
          const threadId = logEvent.pid
          const functionName = logEvent.functionName;
          const logMessages = logEvent.data.map((data) => {
            if (typeof data === "object") {
              return util.inspect(data);
            }
            return data;
          });
      
          return `${levelColor}${logTime} ${level} [Thread-${threadId}] [Request: uri= payload=] [${threadId}] [SERVICE_NAME=, TRACE_ID=, CLIENT_IP=, CLIENT_ID=, TOKEN=] ${functionName} - ${logMessages}`;
        };
      });
      
      // 파일용 레이아웃 (파일에 levelColor 사용시 깨진 문자가 출력되는 경우가 있어서 따로 레이아웃 구성)
      log4js.addLayout("customLayoutNoANSI", function (config) {
        return function (logEvent) {
          const logTime = logEvent.startTime.toISOString();
          const level = logEvent.level.levelStr
          const threadId = logEvent.pid
          const functionName = logEvent.functionName;
          const logMessages = logEvent.data.map((data) => {
            if (typeof data === "object") {
              return util.inspect(data);
            }
            return data;
          });
      
          return `${logTime} ${level} [Thread-${threadId}] [Request: uri= payload=] [${threadId}] [SERVICE_NAME=, TRACE_ID=, CLIENT_IP=, CLIENT_ID=, TOKEN=] ${functionName} - ${logMessages}`;
        };
      });
      
      log4js.configure({
        appenders: {
          out: {
            type: "stdout",
            layout: { type: "customLayout" },
          },
          app: {
            type: "file",
            filename: "app_log/big-bro-daemon.log",
            maxLogSize: 512 /* byte */,
            backups: 3,          
            layout: { type: "customLayoutNoANSI" },
          },
          /* Exception 처리가 필요한 경우
          exceptions: {
            type: "file",
            filename: "app_log/big-bro-daemon.log",
          },        
          */
        },
        categories: {
          default: { appenders: ["out", "app"], level: "trace", enableCallStack: true, }, // trace 레벨 이상 기록(모두)
          // exceptions: { appenders: ["exceptions"], level: "error" }, // 예외 로그는 따로 처리
        }
      });
      // ================================= lo4js End
      
      const logger = log4js.getLogger();
      module.exports = logger;  
      
      app.get(`/test`, async (req, res) => {
        // 로그 출력: 2024-01-17T09:49:32.985Z INFO [Thread-44358] [Request: uri= payload=] [44358] [SERVICE_NAME=, TRACE_ID=, CLIENT_IP=, CLIENT_ID=, TOKEN=]  - ============================== [TEST]111
        logger.info("============================== [TEST]");
        res.json({
          success: true
        });
      });      
      
반응형
Comments