[node.js] 노드 : 콘솔 대신 파일에 로그인

console.log콘솔에서 인쇄하는 대신 파일에 로그를 쓰도록 구성 할 수 있습니까 ?



답변

업데이트 2013- 이것은 노드 v0.2 및 v0.4를 중심으로 작성되었습니다. 로깅과 관련하여 훨씬 더 유용한 유틸리티가 있습니다. 나는 윈스턴을 강력히 추천한다

Late 2013 업데이트- 우리는 여전히 winston을 사용하지만 이제는 로거 라이브러리와 함께 사용자 지정 개체 로깅 및 서식 지정 기능을 래핑합니다. 다음은 logger.js의 샘플입니다 https://gist.github.com/rtgibbons/7354879


이만큼 간단해야합니다.

var access = fs.createWriteStream(dir + '/node.access.log', { flags: 'a' })
      , error = fs.createWriteStream(dir + '/node.error.log', { flags: 'a' });

// redirect stdout / stderr
proc.stdout.pipe(access);
proc.stderr.pipe(error);


답변

기본 console.log 함수를 오버로드 할 수도 있습니다.

var fs = require('fs');
var util = require('util');
var log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'w'});
var log_stdout = process.stdout;

console.log = function(d) { //
  log_file.write(util.format(d) + '\n');
  log_stdout.write(util.format(d) + '\n');
};

위의 예제는 debug.log 및 stdout에 기록됩니다.

편집 : 이 페이지에서도 Clément의 멀티 파라미터 버전을 참조하십시오.


답변

프로덕션 환경에서 무언가를 찾고 있다면 윈스턴 이 최선의 선택 일 것입니다.

개발 작업을 빨리하고 싶다면 파일로 직접 출력하십시오 (* nix 시스템에서만 작동한다고 생각합니다).

nohup node simple-server.js > output.log &


답변

나는 종종 console.log ()console.error ()에 많은 인수를 사용 하므로 솔루션은 다음과 같습니다.

var fs = require('fs');
var util = require('util');
var logFile = fs.createWriteStream('log.txt', { flags: 'a' });
  // Or 'w' to truncate the file every time the process starts.
var logStdout = process.stdout;

console.log = function () {
  logFile.write(util.format.apply(null, arguments) + '\n');
  logStdout.write(util.format.apply(null, arguments) + '\n');
}
console.error = console.log;


답변

Winston 은 로깅에 사용되는 매우 인기있는 npm 모듈입니다.

방법은 다음과 같습니다.
다음과 같이 프로젝트에 winston을 설치하십시오.

npm install winston --save

다음은 utils에서 logger.js로 프로젝트에서 자주 사용하는 기본 구성을 사용할 준비가 된 것입니다.

 /**
 * Configurations of logger.
 */
const winston = require('winston');
const winstonRotator = require('winston-daily-rotate-file');

const consoleConfig = [
  new winston.transports.Console({
    'colorize': true
  })
];

const createLogger = new winston.Logger({
  'transports': consoleConfig
});

const successLogger = createLogger;
successLogger.add(winstonRotator, {
  'name': 'access-file',
  'level': 'info',
  'filename': './logs/access.log',
  'json': false,
  'datePattern': 'yyyy-MM-dd-',
  'prepend': true
});

const errorLogger = createLogger;
errorLogger.add(winstonRotator, {
  'name': 'error-file',
  'level': 'error',
  'filename': './logs/error.log',
  'json': false,
  'datePattern': 'yyyy-MM-dd-',
  'prepend': true
});

module.exports = {
  'successlog': successLogger,
  'errorlog': errorLogger
};

그런 다음 필요한 위치를 다음과 같이 간단히 가져 오십시오.

const errorLog = require('../util/logger').errorlog;
const successlog = require('../util/logger').successlog;

그런 다음 성공을 다음과 같이 기록 할 수 있습니다.

successlog.info(`Success Message and variables: ${variable}`);

및 오류 :

errorlog.error(`Error Message : ${error}`);

또한 여기에서 볼 수 있듯이 모든 성공 로그 및 오류 로그를 로그 디렉토리 아래의 파일에 날짜별로 기록합니다.
로그 이분법


답변

const fs = require("fs");
const {keys} = Object;
const {Console} = console;

/**
 * Redirect console to a file.  Call without path or with false-y
 * value to restore original behavior.
 * @param {string} [path]
 */
function file(path) {
    const con = path ? new Console(fs.createWriteStream(path)) : null;

    keys(Console.prototype).forEach(key => {
        if (path) {
            this[key] = (...args) => con[key](...args);
        } else {
            delete this[key];
        }
    });
};

// patch global console object and export
module.exports = console.file = file;

그것을 사용하려면 다음과 같이하십시오.

require("./console-file");
console.file("/path/to.log");
console.log("write to file!");
console.error("also write to file!");
console.file();    // go back to writing to stdout


답변

이것이 응용 프로그램을위한 것이라면 로깅 모듈을 사용하는 것이 좋습니다. 더 많은 유연성을 제공합니다. 몇 가지 제안.