Winston: 생성 쀑인 둜그 파일이 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2016λ…„ 05μ›” 26일  Β·  27μ½”λ©˜νŠΈ  Β·  좜처: winstonjs/winston

운영 체제: μš°λΆ„νˆ¬ 14.04
λ…Έλ“œJS: 6.2.0
μœˆμŠ€ν„΄: 2.2.0

λ‹€μŒ μ½”λ“œλŠ” 둜그 νŒŒμΌμ„ μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

const logger = new Winston.Logger({
    level: 'verbose',
    transports: [
      new Winston.transports.Console({
        timestamp: true
      }),
      new Winston.transports.File({
        filename: 'app.log',
        timestamp: true
      })
    ]
  });

logger.info('Holla');

터미널에 잘 κΈ°λ‘λ©λ‹ˆλ‹€.

2016-05-26T13:11:49.927Z - info: Holla

κ·ΈλŸ¬λ‚˜ μƒμ„±λœ 둜그 파일이 μ—†μŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

방금이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 디렉토리가 λ¨Όμ € μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. winston은 μƒˆ νŒŒμΌμ„ μƒμ„±ν•˜μ§€λ§Œ μƒˆ 디렉토리λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€(예: logs/app.js에 μžˆλŠ” νŒŒμΌμ— λ‘œκ·ΈμΈν•˜λ €λŠ” 경우 "logs" 디렉토리λ₯Ό 생성해야 함)

λͺ¨λ“  27 λŒ“κΈ€

+1

+1

+1

+1

fs.stat()의 λ…Έλ“œ 6에 λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
μ–΄λ–€ 이유둜 콜백 fs.stat()λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

    fs.stat(fullname, function (err, stats) {
      if (err) {
        if (err.code !== 'ENOENT') {
          return self.emit('error', err);
        }
        return createAndFlush(0);
      }

      if (!stats || (self.maxsize && stats.size >= self.maxsize)) {
        //
        // If `stats.size` is greater than the `maxsize` for
        // this instance then try again
        //
        return self._incFile(function() {
          checkFile(self._getFile());
        });
      }

      createAndFlush(stats.size);
    });
  })(this._getFile()); 

ν•΄κ²°λ˜μ—ˆλ‚˜μš”?

λ‚˜λŠ”μ΄ 문제λ₯Ό λ‹€μŒκ³Ό 같이 μ ˆλŒ€ 경둜λ₯Ό μ œκ³΅ν•˜μ—¬ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.
winston.add(winston.transports.File, { filename: ${__dirname}/logs/appError.log })

이것은 λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” .gitignore 파일 λ•Œλ¬Έμ— 트리보기 νŒ¨ν‚€μ§€μ— μ—…λ°μ΄νŠΈ 된 μ„€μ •μ˜ μ•„ν†°μ—μ„œ ν”„λ‘œμ νŠΈμ˜ 파일 디렉토리에 ν‘œμ‹œλ˜μ§€ μ•Šμ€ 아톰을 μ‚¬μš© μœˆμŠ€ν„΄κ³Ό ν•¨κ»˜ ν”„λ‘œμ νŠΈλ₯Ό μ΅œκ·Όμ— λ¬Έμ œκ°€ μžˆμ—ˆλ‚˜μš” ... (μ˜΅μ…˜ : 숨기기 VCSλŠ” λ¬΄μ‹œ 파일)

_Node 6.2.2 및 Winston 2.2.0 μ‚¬μš©._

μ•”ν˜Έ:

'use strict';

let Winston = require('winston');


const logger = new Winston.Logger({
    level: 'verbose',
    transports: [
      new Winston.transports.Console({
        timestamp: true
      }),
      new Winston.transports.File({
        filename: 'app.log',
        timestamp: true
      })
    ]
  });

logger.info('Holla');

{"level":"info","message":"Holla","timestamp":"2016-07-01T19:29:14.035Z"} 좜λ ₯이 μžˆλŠ” app.log νŒŒμΌμ„ λ§Œλ“€κ³  2016-07-01T19:29:14.034Z - info: Holla 둜 μ½˜μ†”μ— κΈ°λ‘ν•©λ‹ˆλ‹€.

방금이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 디렉토리가 λ¨Όμ € μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. winston은 μƒˆ νŒŒμΌμ„ μƒμ„±ν•˜μ§€λ§Œ μƒˆ 디렉토리λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€(예: logs/app.js에 μžˆλŠ” νŒŒμΌμ— λ‘œκ·ΈμΈν•˜λ €λŠ” 경우 "logs" 디렉토리λ₯Ό 생성해야 함)

Wish winston은 둜그 폴더/디렉토리가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œ λ‹€μŒ μ‹œμž‘ν•˜λŠ” λ™μ•ˆ 둜그 폴더/디렉토리가 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 μƒμ„±ν•©λ‹ˆλ‹€. λ‚˜λŠ” fsκ°€ 이것을 ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆκΉŒ?

+1

+1

+1

if (!fs.existsSync('path') {
    fs.mkdirSync('path');
}

http://thisdavej.com/using-winston-a-versatile-logging-library-for-node-js/

λ‚˜λŠ”μ΄ λ¬Έμ œκ°€ μžˆμ—ˆκ³  이쀑 μŠ¬λž˜μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

        Logger.loggerInfo = new Winston.Logger({
            level: 'info',
            transports: [
                new Winston.transports.File({
                    filename: process.cwd() + '\\logs\\info.log',
                    timestamp: true
                })
            ]
        });

λͺ‡ 가지 κ³ κΈ‰ λ‘œκΉ… β€‹β€‹λ©”μ»€λ‹ˆμ¦˜(winston 포함)을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν–ˆμœΌλ©° κΉ¨λ—ν•œ μ’…λ£Œ(process.exit(0))λ₯Ό μˆ˜ν–‰ν•˜λ©΄ λ‘œκ±°κ°€ νŒŒμΌμ— μ“Έ 수 μ—†λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.
κΉ¨λ—ν•œ 좜ꡬλ₯Ό μ œκ±°ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ©λ‹ˆλ‹€.

@fvuilleumier λ§žμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 예λ₯Ό λ“€μ–΄ CLI λ„κ΅¬μ—μ„œ μ œκ±°ν•˜λŠ” 것은 νŽΈλ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ process.exitCode = 0 (λ˜λŠ” λͺ¨λ“  μ½”λ“œ)λ₯Ό μ‚¬μš©ν•˜λ©΄ 루프가 μ •μƒμ μœΌλ‘œ μ™„λ£Œλ  수 μžˆμœΌλ―€λ‘œ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

νŒŒμΌμ„ λ§Œλ“œλŠ” μ˜ˆμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€

const filename = path.join(__dirname, 'created-logfile.log');

const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename })
  ]
});

파일 예제 λ§Œλ“€κΈ°

@fvuilleumier @nicosommi ν•˜μ§€λ§Œ 였λ₯˜λ₯Ό κΈ°λ‘ν•œ ν›„ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•©λ‹ˆκΉŒ? 당신은 μ£Όλ³€ 산책을 찾을 수 μžˆμ—ˆλ‚˜μš”?

@danbrownbox ν•˜λ£¨κ°€ λλ‚˜λ©΄ js μŠ€ν¬λ¦½νŠΈλŠ” 끝날 λ•ŒκΉŒμ§€ μ‹€ν–‰λ˜λŠ” 파일일 λΏμž…λ‹ˆλ‹€. λ”°λΌμ„œ νŠΉμ • 라인 이후에 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ’…λ£Œν•˜λ €λ©΄ ν•¨μˆ˜μ—μ„œ μ μ ˆν•œ μ‹€ν–‰ 흐름을 λΉŒλ“œν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ‚΄ Macμ—μ„œλŠ” μƒλŒ€ κ²½λ‘œκ°€ μž‘λ™ν•˜μ§€ μ•Šμ§€λ§Œ μ ˆλŒ€ κ²½λ‘œκ°€ 제곡되면 νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

μ ˆλŒ€λ₯Ό μ‚¬μš©ν•˜λ“  μƒλŒ€λ₯Ό μ‚¬μš©ν•˜λ“  그것은 μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ™μ μœΌλ‘œ 전솑을 μΆ”κ°€ν•  λ•Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

function createLogFile(appName) {
  pathUtils.ensureDirectoryExists('logs');
  pathUtils.ensureDirectoryExists(`logs/${appName}`);
  winston.add(winston.transports.File, {
    level: 'debug',
    //filename: `logs/${appName}/export-${Date.now()}.log`,
    //filename: `${__dirname}/logs/${appName}/export-${Date.now()}.log`,
    filename: `${process.cwd()}/logs/${appName}/export-${Date.now()}.log`,
    json: false,
    formatter: _formatLog()
  });
}

κ·ΈλŸ¬λ‚˜ createLogger() 에 이 전솑을 μΆ”κ°€ν•˜λ©΄ μ ˆλŒ€μ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

이 λ‹΅λ³€ 은 μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€.
λ‚΄ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
````
const μœˆμŠ€ν„΄ = μš”κ΅¬('μœˆμŠ€ν„΄');
const logDir = '둜그';
const fs = μš”κ΅¬('fs');

if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}

const 둜거 = winston.createLogger({
레벨: '정보',
ν˜•μ‹: winston.format.json(),
exitOnError: 거짓,
μˆ˜μ†‘: [
new (require('winston-daily-rotate-file'))({
파일 이름: ${logDir}/logs.log ,
λ‚ μ§œ νŒ¨ν„΄: 'YYYY-MM-DD-HH',
zippedArchive: 사싀,
레벨: '바보'
}),
new (require('winston-daily-rotate-file'))({
파일 이름: ${logDir}/errors.log ,
λ‚ μ§œ νŒ¨ν„΄: 'YYYY-MM-DD-HH',
zippedArchive: 사싀,
μˆ˜μ€€: '였λ₯˜'
})
],
});

내보내기 {둜거};

logger.silli('바보 ν…ŒμŠ€νŠΈ');
logger.info('정보 ν…ŒμŠ€νŠΈ');
logger.warn('κ²½κ³  ν…ŒμŠ€νŠΈ');
logger.error('였λ₯˜ ν…ŒμŠ€νŠΈ');
````

μ €λŠ” 이 문제의 μ›μ €μžμž…λ‹ˆλ‹€(λ‹€λ₯Έ 계정). λ‹€μ‹œ λŒμ•„μ™”μŠ΅λ‹ˆλ‹€... 같은 λ¬Έμ œκ°€ μžˆλŠ”λ° μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€ μžŠμ–΄λ²„λ Έμ–΄μš” 🀣

μ΅œμ‹  [email protected] μžˆμŠ΅λ‹ˆκΉŒ? 당신이 둜그 파일이 μ›ν•˜λŠ” μœ„μΉ˜λ₯Ό 확인 디렉토리가 쑴재 ν–ˆμŠ΅λ‹ˆκΉŒ ( winston μš°λ¦¬λŠ” PR이 μžˆμŒμ„ λ°›μ•„ 듀일 κ±°λΌκ³ ν•˜μ§€λ§Œ, 당신을 μœ„ν•΄ DIRS을 μž‘μ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ μ˜΅μ…˜ λ˜λŠ” κΈ°λ³Έ λ™μž‘). λ‹€μ‹œ 가동할 수 있게 되면 이 였래된 문제λ₯Ό λ‹«μ•„μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€. :)

μ—¬κ°€ μ‹œκ°„μ— PR을 ν•  의ν–₯이 μžˆμœΌλ‹ˆ λ§‘κ²¨μ£Όμ„Έμš” πŸ‘

λ©‹μžˆλŠ”! πŸ‘ 이것을 λ‹«μœΌλ©΄ #1465 μ—μ„œ 디렉토리 ν•­λͺ©μ„ 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€. master 에 λŒ€ν•΄ λ³„λ„μ˜ 문제λ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  λ¬Έμ œκ°€ μ§€μ†λ˜λ©΄ μƒˆ 문제둜 μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. 감사 ν•΄μš”!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰