# All files / middlewares activityLogger.js

0% Statements 0/22
0% Branches 0/10
0% Functions 0/4
0% Lines 0/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72

     /**
     * 활동 로깅 미들웨어
     *
     * HTTP 요청/응답 활동을 기록하는 미들웨어
     *
     * @author TK-FB-Project
     * @since 2025-12-11
     */

    const logger = require('../utils/logger');

    /**
     * 활동 로거 미들웨어
     * 모든 HTTP 요청의 시작과 완료를 기록
     */
    const activityLogger = (req, res, next) => {
      const start = Date.now();

      // 응답 완료 시 로깅
      res.on('finish', () => {
        const duration = Date.now() - start;
        const username = req.user?.username || 'anonymous';

        const logData = {
          method: req.method,
          url: req.originalUrl,
          statusCode: res.statusCode,
          duration: `${duration}ms`,
          ip: req.ip,
          user: username,
          userAgent: req.get('User-Agent')
        };

        // 상태 코드에 따른 로그 레벨 분기
        if (res.statusCode >= 500) {
          logger.error('HTTP Request - Server Error', logData);
        } else if (res.statusCode >= 400) {
          logger.warn('HTTP Request - Client Error', logData);
        } else if (res.statusCode >= 300) {
          logger.info('HTTP Request - Redirect', logData);
        } else {
          logger.info('HTTP Request - Success', logData);
        }
      });

      next();
    };

    /**
     * 민감한 경로 필터 미들웨어
     * 로그에서 민감한 정보를 제외
     */
    const sensitivePathFilter = (req, res, next) => {
      const sensitivePaths = [
        '/api/auth/login',
        '/api/auth/refresh-token',
        '/api/users/password'
      ];

      // 민감한 경로의 경우 바디 로깅 스킵
      if (sensitivePaths.some(path => req.originalUrl.includes(path))) {
        req.skipBodyLog = true;
      }

      next();
    };

    module.exports = {
      activityLogger,
      sensitivePathFilter
    };