ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
์ฝ”๋”ฉ ์ง ๐Ÿ’ช
ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
  • ์นดํ…Œ๊ณ ๋ฆฌ (135)
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• (12)
      • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (5)
      • DB (0)
      • Node.js (4)
      • ํ˜•์ƒ ๊ด€๋ฆฌ (2)
      • Spring (1)
    • ์›น (11)
      • React (5)
      • ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ__์›น (6)
    • ๋ชจ๋ฐ”์ผ (2)
      • ์•ˆ๋“œ๋กœ์ด๋“œ (2)
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (55)
      • C (13)
      • Python (15)
      • SQL (5)
      • Java (22)
    • ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท (11)
      • ์•„๋‘์ด๋…ธ (11)
    • ์ผ์ƒ (31)
      • ๋ง›์ง‘ (13)
      • ๋žญํ‚น๋‹ญ์ปด (4)
      • ํ›„๊ธฐ (11)
      • ์š”๋ฆฌ (3)
      • ์žก๋‹ด (0)
    • ๊ต์–‘ (4)
      • ์‹ฌ๋ฆฌํ•™ (3)
      • ํ…Œ๋‹ˆ์Šค (1)
    • ์ž๊ฒฉ์ฆ (9)
      • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (9)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿ’ป github

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ

์ฝ”๋”ฉ ์ง ๐Ÿ’ช

[Node.js] Express ์„œ๋ฒ„ Log ์ž‘์„ฑ ๋ฐ .env ์ž‘์„ฑ
๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•/Node.js

[Node.js] Express ์„œ๋ฒ„ Log ์ž‘์„ฑ ๋ฐ .env ์ž‘์„ฑ

2023. 10. 16. 15:06

[ Log ]

 - ์ปดํ“จํ„ฐ์˜ ์ฒ˜๋ฆฌ ๋‚ด์šฉ์ด๋‚˜ ์ด์šฉ ์ƒํ™ฉ, ์˜ค๋ฅ˜ ์ถœ๋ ฅ ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ๊ธฐ๋กํ•œ ๊ฒƒ

 - ์‹œ์Šคํ…œ ๋ณด์•ˆ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋ชฉ์  ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค.

 - ์œ ์ €์˜ ์ด๋ฒคํŠธ, ๋ฐ์ดํ„ฐ ์š”์ฒญ, ํŠธ๋žœ์žญ์…˜ ์—๋Ÿฌ ๊ทœ๋ช… ๋“ฑ์„ ์ •๋ฐ€ ๋ถ„์„ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

 

 

[ Dotenv ]

 - Node.js์—์„œ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ

 - ๋ณดํ†ต DB ๊ด€๋ จ ์ •๋ณด, API_KEY ๋“ฑ, ๊ณต๊ฐœ๋˜๋ฉด ์•ˆ๋˜๋Š” ์ •๋ณด๋“ค์„ ๊ด€๋ฆฌ

 - ๋ณดํ†ต .env๋ผ๋Š” ํŒŒ์ผ์„ ์™ธ๋ถ€์— ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉ

    1. dotenv ๋ชจ๋“ˆ ์˜์กด์„ฑ ์ถ”๊ฐ€

$ npm install dotenv --save

 

    2. .env ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ ์ƒ์„ฑ

// ๋ณธ์ธ์€ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ๋ฃจํŠธ ๊ธฐ์ค€ ./config/.env ์ƒ์„ฑ
PORT=3000	// ์„œ๋ฒ„ ํฌํŠธ ๋ฒˆํ˜ธ ์ง€์ •
NODE_ENV=dev	// Node ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ง€์ •

 

 

 

[ Winston ]

 - Node.js์—์„œ log๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ

 - ์‹ค์ œ ์„œ๋ฒ„ ์šด์˜ ์‹œ console.log, console.error๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ

    1. winston, winston-daily-rotate-file ๋ชจ๋“ˆ ์˜์กด์„ฑ ์ถ”๊ฐ€

         => winston-daily-rotate-file์€ ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ

               ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜๋ฃจ ๋‹จ์œ„ ์ƒˆ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉฐ, ๋‚ ์งœ๋ณ„ ๋กœ๊ทธํŒŒ์ผ ๊ด€๋ฆฌ,

               ๋กœ๊ทธ ํŒŒ์ผ ์„ค์ •๋“ฑ์˜ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์คŒ

$ npm install winston winston-daily-rotate-file --save

 

    2. logger.js ํŒŒ์ผ ์ƒ์„ฑ

        => dotenv ๋ชจ๋“ˆ์„ ํ˜ธ์ถœํ•˜์—ฌ .env ํŒŒ์ผ์˜ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ

              ๋งŒ์•ฝ .env ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ๋ฃจํŠธ ๊ฒฝ๋กœ์— ์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ dotenv.config() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด

              { path : {์‹ค์ œ๊ฒฝ๋กœ} } ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋จ.

              .env ํŒŒ์ผ์ด ์ตœ์ƒ์œ„ ๋ฃจํŠธ์— ์กด์žฌํ•  ๊ฒฝ์šฐ ๊ทธ๋ƒฅ dotenv.config() ์‚ฌ์šฉ

const winston = require("winston");	// winston ๋ชจ๋“ˆ ํ˜ธ์ถœ
const winstonDaily = require("winston-daily-rotate-file");	// winston-daily-rotate-file ๋ชจ๋“ˆ ํ˜ธ์ถœ
const process = require("process");	// process ๋ชจ๋“ˆ ํ˜ธ์ถœ
const dotenv = require("dotenv");	// dotenv ๋ชจ๋“ˆ ํ˜ธ์ถœ
dotenv.config({ path: `${process.cwd()}/config/.env` });

// Check .env
console.log("NODE ENV : " + process.env.NODE_ENV);
console.log("PORT : " + process.env.PORT);

// Set save logfile root path
const logDir = `${process.cwd() + "/logs"}`;
const { combine, timestamp, label, printf } = winston.format;

// Define log format
const logFormat = printf(({ timestamp, label, level, message }) => {
  return `[${timestamp}] [${label}] [${level}] | ${message}`;
});

/*
 * Log Level
 * Error: 0, Warn: 1, Info: 2, Http: 3, Verbose: 4, Debug: 5, Silly: 6
 * low level => high priority
 */
const logger = winston.createLogger({
  // Define log output format
  format: combine(
    timestamp({
      format: "YYYY-MM-DD HH:mm:ss",
    }),
    label({ label: "UMS Express Server" }), // App name
    logFormat // Log output Format
  ),

  // Define detail log output format settings
  transports: [
    /*
     * Define info level log settings
     * ์ž๋™์œผ๋กœ info:2 ๋ ˆ๋ฒจ ๊ฐ’๋ณด๋‹ค ๋†’์€ warn: 1, error: 0 ๋กœ๊ทธ๋“ค๋„ ํฌํ•จ๋จ
     */
    new winstonDaily({
      level: "info",
      datePattern: "YYYY-MM-DD",
      dirname: logDir,
      filename: `%DATE%.log`,
      maxFiles: 30, // ๊ฐ€์žฅ ์ตœ๊ทผ 30์ผ์น˜ ๋กœ๊ทธ ํŒŒ์ผ ์ €์žฅ
      zippedArchive: true, // ์•„์นด์ด๋ธŒ๋œ ๋กœ๊ทธ ํŒŒ์ผ์„ gzip ์••์ถ• ์—ฌ๋ถ€
    }),

    /*
     * Define error level log settings
     * ๊ธฐ๋ณธ์ ์œผ๋กœ info level์— ํฌํ•จ๋˜๋‚˜, ๊ตฌ๋ถ„์„ ์œ„ํ•ด ํ˜•์‹ ๋ณ€๊ฒฝ ํ›„ ๊ฐœ๋ณ„ ์ง€์ •
     */
    new winstonDaily({
      level: "error",
      datePattern: "YYYY-MM-DD",
      dirname: logDir + "/error", // log ๊ธฐ๋ณธ ์ €์žฅ ๊ฒฝ๋กœ ํ•˜์œ„ /error ๊ฒฝ๋กœ๋กœ ์„ค์ •
      filename: `%DATE%.error.log`,
      maxFiles: 30,
      zippedArchive: true,
    }),

    /*
     * http
     */
    new winstonDaily({
      level: "http",
      datePattern: "YYYY-MM-DD",
      dirname: logDir + "/http",
      filename: `%DATE%.http.log`,
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],

  // UncaughtException file settings
  exceptionHandlers: [
    new winstonDaily({
      level: "error",
      datePattern: "YYYY-MM-DD",
      dirname: logDir + "/exception",
      filename: `%DATE%.exception.log`,
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],
});

/*
 * Production ํ™˜๊ฒฝ์ด ์•„๋‹Œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ์ฝ˜์†”์— ์ถœ๋ ฅ
 */
if (process.env.NODE_ENV !== "production") {
  logger.add(
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize({ level: true, message: true }),
        // winston.format.label(),
        winston.format.simple(), // Output format => JSON.stringify({ ...rest })
        logFormat
      ),
    })
  );
}

module.exports = logger;

 

    3. ๋กœ๊ทธ ์ž‘๋™ ํ…Œ์ŠคํŠธ

// test.js
const logger = require("./config/logger");

logger.info("hello world");
logger.error("hello world");
logger.warn("hello world");

๋ ˆ๋ฒจ๋ณ„ ๋กœ๊ทธ ์ƒ‰์ƒ๋ณ„ ์ถœ๋ ฅ ํ™•์ธ

 

 

[ Morgan ]

 - http ์š”์ฒญ ๋ฐ ์‘๋‹ต์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ

 - winston ๋กœ๊ทธ์˜ http level์„ ํ™œ์šฉํ•  ๋•Œ ์‚ฌ์šฉ

    1. morgan ๋ชจ๋“ˆ ์˜์กด์„ฑ ์ถ”๊ฐ€

$ npm install morgan --save

  

    2. morgan ๋ฏธ๋“ค์›จ์–ด ์ž‘์„ฑ

// ./utils/morgan.js
const morgan = require("morgan");
const logger = require("../config/logger");
const dotenv = require("dotenv");
dotenv.config({ path: `${process.cwd()}/config/.env` });

/*
 * NODE_ENV์— ๋”ฐ๋ผ์„œ morgan ์˜ต์…˜ format ๋ณ€๊ฒฝ
 * combined ์˜ต์…˜์ด dev ์˜ต์…˜๋ณด๋‹ค ์ƒ์„ธํ•จ
 */
const format = () => {
  const result = process.env.NODE_ENV === "production" ? "combined" : "dev";
  return result;
};

// ๋กœ๊ทธ ์ž‘์„ฑ์„ ์œ„ํ•œ Output stream ์˜ต์…˜
const stream = {
  write: (message) => {
    logger.http(
      message.replace(
        /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
        ""
      )
    );
  },
};

/*
 * ๋กœ๊น… ์Šคํ‚ต ์—ฌ๋ถ€ ์ฒดํฌ
 * ๋ฐฐํฌํ™˜๊ฒฝ(production | res.statusCode < 400)์ผ ๊ฒฝ์šฐ ๋กœ๊ทธ ๊ธฐ๋ก x
 */
const skip = (_, res) => {
  if (process.env.NODE_ENV === "production") {
    return res.statusCode < 400;
  }
  return false;
};

const morganMiddleware = morgan(format(), { stream, skip });

module.exports = morganMiddleware;

 

 

[ ๋ฉ”์ธ ์•ฑ ์„œ๋ฒ„ Winston + Morgan ์ ์šฉ ]

 1. ๋ฉ”์ธ ์•ฑ ์„œ๋ฒ„ ํŒŒ์ผ์— ๋กœ๊ทธ, ๋ชจ๊ฑด ๋ชจ๋“ˆ ์ž‘์„ฑ ํŒŒ์ผ ๋ฐ ๋ผ์šฐํ„ฐ ๋“ฑ๋ก

// app.js
const express = require("express");
const morganMiddleware = require("./utils/morganMiddleware");	// ์‚ฌ์šฉ์ž morgan ๋ชจ๋“ˆ ํ˜ธ์ถœ
const logger = require("./config/logger");	// ์‚ฌ์šฉ์ž log ๋ชจ๋“ˆ ํ˜ธ์ถœ
const router = require("./routes/router");	// ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ ํ˜ธ์ถœ
const dotenv = require("dotenv");
dotenv.config();
const app = express();

const PORT = process.env.PORT;

// ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ ip ์ฃผ์†Œ ์ถœ๋ ฅ
app.set("trust proxy", true);
app.use(morganMiddleware);
app.use("/router", router);

app.get("/", (req, res) => {
  res.send("Hello World");
});

app.listen(PORT, "0.0.0.0", () => {
  logger.info(`Server listening on port ${PORT}`);
});
// ./routes/router.js
const express = require("express");
const logger = require("../config/logger");
const router = express.Router();

router.get("/logging", (req, res) => {
  logger.info("Get /router/logging : " + req.ip);
  res.writeHead(404, { "Content-Type": "text/html" });
  res.end("error!!");
});

router.get("/skip", (req, res) => {
  logger.info("Get /router/info : " + req.ip);
  res.writeHead(200, { "Content-Type": "text/html" });
  res.end("success!!");
});

module.exports = router;

 

 2. ๋ฉ”์ธ ์•ฑ ์„œ๋ฒ„ ์‹คํ–‰ ๊ฒฐ๊ณผ ํ™•์ธ

      => logger.js ํŒŒ์ผ ์ฝ”๋“œ ํ•˜๋‹จ๋ถ€์˜ NODE_ENV๊ฐ€ 'production'์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ ๋‚ด์šฉ ์ฝ˜์†” ์ถœ๋ ฅ

 

 3. ๋กœ๊ทธ ๊ด€๋ฆฌ ํด๋” ๋ฐ ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ

์ƒ์œ„ ๋ ˆ๋ฒจ ๋กœ๊ทธ ํ•˜์œ„ ๋กœ๊ทธ๋“ค์€ ์ž๋™์œผ๋กœ ๊ฐ™์ด ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ

 


์ฐธ๊ณ  : https://velog.io/@sung-ik-je/%EA%B0%9C%EB%85%90-Log 
 

Log๋ž€?

์ปดํ“จํ„ฐ์˜ ์ฒ˜๋ฆฌ ๋‚ด์šฉ์ด๋‚˜ ์ด์šฉ ์ƒํ™ฉ์„ ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ฅธ ๊ธฐ๋ก๊ฐœ์ธ์šฉ ์ปดํ“จํ„ฐ ํ†ต์‹ ์—์„œ ๋ฉ”์ผ ๋“ฑ ํ†ต์‹  ๋‚ด์šฉ์˜ ๊ธฐ๋ก์ด๋ฉฐ, ๊ทธ ํŒŒ์ผ์„ ๋กœ๊ทธ ํŒŒ์ผ(log file)์ด๋ผ๊ณ  ํ•œ๋‹คํ†ต๋‚˜๋ฌด ๋ชฉ์„  log on(์Šน์„ ), log out(ํ•˜

velog.io

 

์ฐธ๊ณ  : https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-Winston-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%84%9C%EB%B2%84-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC
 

[NODE] ๐Ÿ“š Winston ๋ชจ๋“ˆ ์‚ฌ์šฉ๋ฒ• - ์„œ๋ฒ„ ๋กœ๊ทธ ๊ด€๋ฆฌ

Winston ๋ชจ๋“ˆ ์–ด๋–ค ์„œ๋ฒ„๋“ ์ง€ ์‹ค์ œ๋กœ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋ ค๋ฉด ๋กœ๊ทธ๋ฅผ ๊ผผ๊ผผํžˆ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ด๋‹ค. Log๋Š” ์—๋Ÿฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ์—ด์‡ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋กœ๊ทธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด์„œ ์‹œ

inpa.tistory.com

 

์ฐธ๊ณ  : https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-morgan-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4#[options]
 

[EXPRESS] ๐Ÿ“š morgan ๋ฏธ๋“ค์›จ์–ด ๐Ÿ’ฏ ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ

morgan ๋ชจ๋“ˆ morgan์— ์—ฐ๊ฒฐ ํ›„ ํฌํŠธ์— ์ ‘์†ํ•˜๋ฉด ๊ธฐ์กด ๋กœ๊ทธ ์™ธ์— ์ถ”๊ฐ€์ ์ธ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ 3000๋ฒˆ ํฌํŠธ์— ๋“ค์–ด๊ฐ„ ํ›„ ์ฝ˜์†”์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ฐํ˜€์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

inpa.tistory.com

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
    '๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•/Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Node.js] Express Router ํด๋ž˜์Šค ์‚ฌ์šฉ
    • [Node.js] Express ์„œ๋ฒ„ ๊ตฌ์ถ•
    • [Node.js] Node.js, NPM, NVM ๊ฐœ๋… ๋ฐ ์„ค์น˜ [Windows ๊ธฐ์ค€]
    ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
    ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
    ๐Ÿ‘Š ๋ธ”๋กœ๊ทธ๋„ ๊ทผ์„ฑ์ด๋‹ค? ๐Ÿ‘Š

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”