콘솔 대신 파일에 로그하도록 Node.js 구성
를 구성할 수 ?console.log
콘솔에 출력하는 대신 파일에 로그를 기록할 수 있습니까?
기본 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에 기록됩니다.
편집: 이 페이지에서도 클레멘트별 다중 매개변수 버전을 참조하십시오.
2013년 업데이트 - 이 문서는 Node v0.2 및 v0.4에 대해 작성되었습니다. 현재 로깅과 관련하여 훨씬 더 나은 유틸리티가 있습니다.윈스턴을 강력히 추천합니다.
2013년 후반기 업데이트 - Winston은 여전히 사용하지만, 이제 Logger 라이브러리를 사용하여 사용자 지정 개체 및 포맷 로깅과 관련된 기능을 제공합니다.여기 당사 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);
생산 과정에서 무언가를 찾고 있다면 윈스턴이 가장 좋은 선택일 것입니다.
개발 작업을 빨리 수행하려면 파일로 직접 출력하십시오(*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 모듈로 로깅에 사용됩니다.
여기 사용법이 있습니다.
프로젝트에 윈스턴을 다음과 같이 설치합니다.
npm install winston --save
다음은 프로젝트에서 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
간단한 경우 '>와 '2>&1'을 사용하여 표준 출력(STDOUT) 및 표준 오류(STDERR) 스트림을 파일(예: test.log)로 직접 리디렉션할 수 있습니다.
예:
// test.js
(function() {
// Below outputs are sent to Standard Out (STDOUT) stream
console.log("Hello Log");
console.info("Hello Info");
// Below outputs are sent to Standard Error (STDERR) stream
console.error("Hello Error");
console.warn("Hello Warning");
})();
node test.js > test.log 2>&1
POSIX 표준에 따라 'input', 'output' 및 'error' 스트림은 양의 정수 파일 설명자(0, 1, 2)로 식별됩니다. 즉, stdin은 0, stdout은 1, stderr은 2입니다.
1단계: '2>&1'이 2(stderr)에서 1(stdout)로 리디렉션됩니다.
2단계: '>'이 1(stdout)에서 파일(test.log)로 리디렉션됩니다.
응용 프로그램용인 경우 로깅 모듈을 사용하는 것이 좋습니다.그것은 당신에게 더 많은 유연성을 줄 것입니다.몇 가지 제안.
- 윈스턴 https://github.com/winstonjs/winston
- log4js https://github.com/nomiddlename/log4js-node
콘솔의 nodejs API 문서에서 직접 생성
const output = fs.createWriteStream('./stdout.log');
const errorOutput = fs.createWriteStream('./stderr.log');
// custom simple logger
const logger = new Console(output, errorOutput);
// use it like console
const count = 5;
logger.log('count: %d', count);
// in stdout.log: count 5
아직 언급되지 않은 또 다른 해결책은 연결하는 것입니다.Writable
江이의 process.stdout
그리고.process.stderr
이렇게 하면 stdout 및 stderr로 출력되는 모든 콘솔 기능을 재정의할 필요가 없습니다.이 구현은 stdout 및 stderr을 모두 로그 파일로 리디렉션합니다.
var log_file = require('fs').createWriteStream(__dirname + '/log.txt', {flags : 'w'})
function hook_stream(stream, callback) {
var old_write = stream.write
stream.write = (function(write) {
return function(string, encoding, fd) {
write.apply(stream, arguments) // comments this line if you don't want output in the console
callback(string, encoding, fd)
}
})(stream.write)
return function() {
stream.write = old_write
}
}
console.log('a')
console.error('b')
var unhook_stdout = hook_stream(process.stdout, function(string, encoding, fd) {
log_file.write(string, encoding)
})
var unhook_stderr = hook_stream(process.stderr, function(string, encoding, fd) {
log_file.write(string, encoding)
})
console.log('c')
console.error('d')
unhook_stdout()
unhook_stderr()
console.log('e')
console.error('f')
콘솔에서 인쇄해야 합니다.
a
b
c
d
e
f
및 로그 파일:
c
d
자세한 내용은 이 요점을 확인하십시오.
Linux를 사용하는 경우 출력 리디렉션을 사용할 수도 있습니다.Windows에 대해 잘 모르겠습니다.
node server.js >> file.log 2>> file.log
>> file.log
stdout
2>> file.log
stderr
은 속기를 사용합니다.&>>
둘 다를 위하여stdout
그리고.stderr
내과 우분투 둘 다으)
예외:예외관: >
어기반, 면덮>>
추가합니다.
NodeJS는, 저는 NodeJS Logger, NodeJS Logger를 합니다.pino
+pino-pretty
console.log를 덮어쓰는 것이 좋습니다.그러나 필요한 모듈에서 작동하려면 내보내기도 해야 합니다.
module.exports = console;
로그 파일 작성, 회전 등의 번거로움을 덜기 위해 winston과 같은 간단한 로거 모듈을 사용하는 것을 고려할 수 있습니다.
// Include the logger module
var winston = require('winston');
// Set up log file. (you can also define size, rotation etc.)
winston.add(winston.transports.File, { filename: 'somefile.log' });
// Overwrite some of the build-in console functions
console.error = winston.error;
console.log = winston.info;
console.info = winston.info;
console.debug = winston.debug;
console.warn = winston.warn;
module.exports = console;
방법 STDOUT 및 STDERR
이 접근 방식은 도움이 될 수 있으며(나는 내 프로젝트에서 비슷한 것을 사용한다) console.log, console을 포함한 모든 방법에 적용됩니다.warn, console.error, console.info
이 메서드는 stdout 및 stderr에 기록된 바이트를 파일에 씁니다.console.log, console을 변경하는 것보다 낫습니다.warn, console.error, console.info 메서드. 출력이 이 메서드 출력과 정확하게 같기 때문입니다.
var fs= require("fs")
var os= require("os")
var HOME= os.homedir()
var stdout_r = fs.createWriteStream(HOME + '/node.stdout.log', { flags: 'a' })
var stderr_r = fs.createWriteStream(HOME + '/node.stderr.log', { flags: 'a' })
var attachToLog= function(std, std_new){
var originalwrite= std.write
std.write= function(data,enc){
try{
var d= data
if(!Buffer.isBuffer(d))
d= Buffer.from(data, (typeof enc === 'string') ? enc : "utf8")
std_new.write.apply(std_new, d)
}catch(e){}
return originalwrite.apply(std, arguments)
}
}
attachToLog(process.stdout, stdout_r)
attachToLog(process.stderr, stderr_r)
// recommended catch error on stdout_r and stderr_r
// stdout_r.on("error", yourfunction)
// stderr_r.on("error", yourfunction)
위의 답변에 추가하여 짧고 효율적인 코드 오버라이드에 대한 약간의 확장console.log
사소한 추가 사항: 파일 이름을 날짜로 설정하고 래퍼 기능을 사용하며 원래 콘솔.logging을 수행하여 정보로 콘솔을 활성화합니다.
용법:에서 용도: 시부분실서행에작코를 합니다.setConsoleLogToFile([FILENAME])
.
const fs = require("fs"),
util = require('util');
const getPrettyDate = ()=> new Date().toString().replace(":","-").replace(/00\s\(.*\)/, "").replace(` ${new Date().getFullYear()}`, ",").replace(/:\d\d\s/, " ");
module.exports.getPrettyDate = getPrettyDate;
module.exports.setConsoleLogToFile = (filename) => {
const log_file = fs.createWriteStream(`${__dirname}/${filename} - ${getPrettyDate()}.log`, { flags: 'w' }),
log_stdout = process.stdout;
const origConsole = console.log;
console.log = (d) => {
origConsole(d);
log_file.write(util.format(d) + '\n');
log_stdout.write(util.format(d) + '\n');
};
}
대부분의 로거는 오버킬이며 console.log의 빌드를 올바르게 지원하지 않습니다.따라서 콘솔-로그-투-파일을 생성합니다.
import { consoleLogToFile } from "console-log-to-file";
// or `const { consoleLogToFile } = require("console-log-to-file/dist/index.cjs.js")`
consoleLogToFile({
logFilePath: "/log/default.log",
});
// all of your console.log/warn/error/info will work as it does and save to file now.
코드를 수정하지 않고 해결책을 찾고 있다면 간단한 해결책이 있습니다.
pm2가 필요합니다. 노드 모듈에 추가하고 앱을 시작하기만 하면 됩니다.
pm2 start server.js
이제 console.logs는 home/.pm2/logs/server-out.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(...args) {
var output = args.join(' ');
log_file.write(util.format(output) + '\r\n');
log_stdout.write(util.format(output) + '\r\n');
};
이제 스트림 기반 로깅 시스템인 캐터필러를 사용하여 캐터필러에 로그한 다음 출력을 다른 변환 및 위치로 파이프로 전송할 수 있습니다.
파일 출력은 다음과 같이 쉽습니다.
var logger = new (require('./').Logger)();
logger.pipe(require('fs').createWriteStream('./debug.log'));
logger.log('your log message');
캐터필러 웹 사이트의 전체 예
다음 npm 모듈도 확인할 수 있습니다. https://www.npmjs.com/package/noogger
간단하고 직설적인...
미래의 사용자를 위해.@keshavDulal 응답이 최신 버전에서는 작동하지 않습니다.그리고 최신 버전에서 보고되는 문제에 대한 적절한 해결책을 찾을 수 없었습니다.3.3.3
.
어쨌든 조금 조사한 끝에 드디어 고쳤습니다.다음은 윈스턴 버전에 대한 솔루션입니다.3.3.3
winston 및 winston-daily-rotate 파일 설치
npm install winston
npm install winston-daily-rotate-file
새 파일 utils/logger.js를 만듭니다.
const winston = require('winston');
const winstonRotator = require('winston-daily-rotate-file');
var logger = new winston.createLogger({
transports: [
new (winston.transports.DailyRotateFile)({
name: 'access-file',
level: 'info',
filename: './logs/access.log',
json: false,
datePattern: 'yyyy-MM-DD',
prepend: true,
maxFiles: 10
}),
new (winston.transports.DailyRotateFile)({
name: 'error-file',
level: 'error',
filename: './logs/error.log',
json: false,
datePattern: 'yyyy-MM-DD',
prepend: true,
maxFiles: 10
})
]
});
module.exports = {
logger
};
그런 다음 로깅을 사용할 파일에서 다음과 같이 모듈을 가져옵니다.
const logger = require('./utils/logger').logger;
다음과 같은 로거를 사용합니다.
logger.info('Info service started');
logger.error('Service crashed');
노드 앱을 계속 실행하기 위해 영구적으로 사용하는 경우 입력합니다.forever list
console.log가 쓰고 있는 로그 파일의 경로도 표시됩니다.
nodejs 생성자를 사용할 수 있습니다.
const mylog = new console.Console(
fs.createWriteStream("log/logger.log"),
fs.createWriteStream("log/error.log")
);
그리고 나서 당신은 그것을 보통처럼 사용할 수 있습니다.console
클래스(예:
mylog.log("Ok!"); // Will be written into 'log/logger.log'
mylog.error("Bad!"); // Will be written into 'log/error.log'
저는 출력 스트림을 마이 스트림으로 교환하는 아이디어를 얻었습니다.
const LogLater = require ('./loglater.js');
var logfile=new LogLater( 'log'+( new Date().toISOString().replace(/[^a-zA-Z0-9]/g,'-') )+'.txt' );
var PassThrough = require('stream').PassThrough;
var myout= new PassThrough();
var wasout=console._stdout;
myout.on('data',(data)=>{logfile.dateline("\r\n"+data);wasout.write(data);});
console._stdout=myout;
var myerr= new PassThrough();
var waserr=console._stderr;
myerr.on('data',(data)=>{logfile.dateline("\r\n"+data);waserr.write(data);});
console._stderr=myerr;
log later.js:
const fs = require('fs');
function LogLater(filename, noduplicates, interval) {
this.filename = filename || "loglater.txt";
this.arr = [];
this.timeout = false;
this.interval = interval || 1000;
this.noduplicates = noduplicates || true;
this.onsavetimeout_bind = this.onsavetimeout.bind(this);
this.lasttext = "";
process.on('exit',()=>{ if(this.timeout)clearTimeout(this.timeout);this.timeout=false; this.save(); })
}
LogLater.prototype = {
_log: function _log(text) {
this.arr.push(text);
if (!this.timeout) this.timeout = setTimeout(this.onsavetimeout_bind, this.interval);
},
text: function log(text, loglastline) {
if (this.noduplicates) {
if (this.lasttext === text) return;
this.lastline = text;
}
this._log(text);
},
line: function log(text, loglastline) {
if (this.noduplicates) {
if (this.lasttext === text) return;
this.lastline = text;
}
this._log(text + '\r\n');
},
dateline: function dateline(text) {
if (this.noduplicates) {
if (this.lasttext === text) return;
this.lastline = text;
}
this._log(((new Date()).toISOString()) + '\t' + text + '\r\n');
},
onsavetimeout: function onsavetimeout() {
this.timeout = false;
this.save();
},
save: function save() { fs.appendFile(this.filename, this.arr.splice(0, this.arr.length).join(''), function(err) { if (err) console.log(err.stack) }); }
}
module.exports = LogLater;
저는 단지 이것을 하기 위해 팩을 만들 뿐입니다, 당신이 그것을 좋아하길 바랍니다 ;) https://www.npmjs.com/package/writelog
저는 윈스턴의 예를 들어 다음과 같이 덧붙였습니다.log(...)
방법(윈스턴이 이름을 붙이기 때문에)info(..)
:
콘솔.js:
"use strict"
// Include the logger module
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
//
// - Write to all logs with level `info` and below to `combined.log`
// - Write all logs error (and below) to `error.log`.
//
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
// Add log command
logger.log=logger.info;
module.exports = logger;
그런 다음 코드에서 다음을 사용합니다.
const console = require('Console')
이제 파일에서 일반 로그 기능을 사용하면 디버깅/개발하는 동안 파일을 만들고 콘솔에 기록할 수 있습니다.때문에.if (process.env.NODE_ENV !== 'production') {
(프로덕션에서도 사용하고 싶은 경우)...
다음을 사용하여 utils/logger.js 파일을 만듭니다.
var fs = require('fs');
var util = require('util');
var log_file = fs.createWriteStream(__dirname + '/../logs/server.log', { flags: 'w' });
var log_stdout = process.stdout;
console.log = function () { //
[...arguments].forEach(element => {
log_file.write(util.format(element) + '\n');
log_stdout.write(util.format(element) + '\n');
});
};
module.exports = {
console
}
다음과 같이 console.log를 사용할 파일의 logger.js 파일을 포함합니다.
const console = require('./utils/logger').console;
로그 폴더를 만들고 그 안에 빈 server.log 파일을 만들고 앱을 실행합니다 :)
Rudy Huynh의 해결책은 저에게 정말 잘 작동했습니다.오늘 날짜와 시간이 적힌 파일을 뱉어내기 위해 조금 추가했습니다.
var dateNow = new Date();
var timeNow = dateNow.getHours() + '-' + dateNow.getMinutes();
var logPath = "log/" + dateNow.toDateString() + ' -' + ' Start Time - ' + timeNow + ".log"
consoleLogToFile({
logFilePath: logPath
});
매우 우아하지는 않지만 이렇게 하면 동일한 "default.log" 파일을 업데이트하는 대신 서로 다른 읽기 쉬운 로그 파일을 저장할 수 있습니다.
텍스트 파일에 대한 색상 코드 없이 클레멘트의 다중 매개 변수 버전을 기반으로 합니다.
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 () {
// Storing without color codes
logFile.write(util.format.apply(null,arguments).replace(/\033\[[0-9;]*m/g,"") + '\n');
// Display normally, with colors to Stdout
logStdout.write(util.format.apply(null, arguments) + '\n');
}
참고: 코멘트를 할 수 없어서 답변함
언급URL : https://stackoverflow.com/questions/8393636/configure-node-js-to-log-to-a-file-instead-of-the-console
'programing' 카테고리의 다른 글
HttpClient와 WebClient 중에서 결정 (0) | 2023.05.12 |
---|---|
sed가 \t를 탭으로 인식하지 못하는 이유는 무엇입니까? (0) | 2023.05.12 |
Azure: Azure에서 배포된 파일을 볼 수 있는 방법이 있습니까? (0) | 2023.05.12 |
어떻게 하면 이중 따옴표 안에서 이중 따옴표를 피할 수 있습니까? (0) | 2023.05.12 |
언제 'npm start'를 사용하고 언제 'ng serve'를 사용합니까? (0) | 2023.05.12 |