Node.js console.log-새 줄을 만드는 대신 줄을 업데이트 할 수 있습니까?


83

node.js응용 프로그램에는 많은 콘솔 로그가 있습니다. 이것은 제가보기에 중요한 것입니다 (아주 큰 앱이므로 오랫동안 실행되고 작업이 계속 진행되고 있음을 알아야 함). 콘솔 로그.

console.update새 줄을 만드는 대신 콘솔 줄을 지우거나 대체하는 것이 어떻게 든 가능 합니까?


1
모니터링하거나 검색 할 수있는 로그 파일에 쓰지 않는 이유는 무엇입니까?
넬슨

1
PowerShell에서 쉽게 할 수 있지만, 10 줄을 쉽게 차지할 수있는 약 5,000 줄의 콘솔이 작성되어있는 것 이상입니다 (대부분은 일이 진행되고 있음을 알려주는 호출 일뿐입니다. 앱이 약 20 분 동안 실행되며 문제가 발생하는지 / 아직 실행 중인지에 대한 피드백이 필요합니다.)
JVG

이것이 귀하의 질문에 대답합니까? 콘솔에 인쇄 된 문자를 지우는 방법
Wex

답변:


127

콘솔에서 대신 process.stdout 메서드를 사용해보십시오.

process.stdout.write("Hello, World");
process.stdout.clearLine();
process.stdout.cursorTo(0);
process.stdout.write("\n"); // end the line

10
TypeError : process.stdout.clearLine은 함수가 아닙니다. 다른 사람이 이것을 만나면 웹 스톰에서 실행할 수 없습니다.
Trevor

@TrevorD이 나의 접근 방식은을 추가했다 webstorm=truewebstorm 노드 구성에서 응용 프로그램의 매개 변수 및 확인 process.argv.find(x => x.startsWith('webstorm=true')이 답변을 사용하여
루이스 에두아르도을

1
@Luiz Eduardo 그냥 포장하는 것이 더 간단하지 if (process.stdout.clearLine) { process.stdout.clearLine() }않습니까?
Trevor

잘 잡아! 왠지 생각도 못했어요. 콘솔에서 실행할 수있는 간단한 도구를 만들었 기 때문에 철저히 설명하지는 않았지만 확실히 변경하겠습니다. 감사합니다!
Luiz Eduardo

나는 이것을 할 것이다 : node -e "for(let i=1;i<=1000;i++){process.stdout.write('Hello, World'); if(i<10)process.stdout.clearLine(); process.stdout.cursorTo(0);}"또는node -e "for(let i=1;i<=1000;i++){process.stdout.clearLine(); process.stdout.cursorTo(0); process.stdout.write('hello, world')}"
Cerberus

55

@michelek의 대답에 따라 다음과 같은 함수를 사용할 수 있습니다.

function printProgress(progress){
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    process.stdout.write(progress + '%');
}

1
for 루프와 함께 사용할 때 깜박입니다.이 문제를 해결할 방법이 있습니까?
Ank i zle

1
수정 깜박임에, 제거process.stdout.clearLine()
decoder7283

나는 이것을 큰 루프에 추가하면 계산 시간이 급격히 증가한다는 것을 깨달았습니다. 예를 들어 100mil 무작위 시도를 실행하고 변수에 할당합니다. 3 초 정도 걸립니다. 이 기능으로. 이 분처럼 소요
엠제이 Jameel에게

위의 의견은 신경 쓰지 마십시오. 모든 콘솔 로그는 비용이 많이 듭니다. 내가 백분율로 진행을 인쇄하려고 이후 나는 함수를 작성했다가 1 % 2 % 등 같은 특정 구간에서만 인쇄
엠제이 Jameel

21

물론 내가 만든 모듈을 사용하여이 작업을 수행 할 수 있습니다. fknsrs / jetty

다음을 통해 설치

npm install jetty

다음은 사용 예입니다.

// Yeah, Jetty!
var Jetty = require("jetty");

// Create a new Jetty object. This is a through stream with some additional
// methods on it. Additionally, connect it to process.stdout
var jetty = new Jetty(process.stdout);

// Clear the screen
jetty.clear();

// write something
jetty.text("hello world");
jetty.moveTo([0,0]);
jetty.text("hello panda");

Jetty는 단독으로 사용할 때 유용하지 않습니다. 부두 호출을 덜 장황하게 만들기 위해 그 위에 추상화를 구축하면 훨씬 더 효과적입니다.


3
나는이 패키지에 대한 제한적인 라이선스 때문에 이것을 거절했습니다.
mmmeff 2018

17
표준 BSD 3 절 라이센스 입니다. 반대표에 대한 꽤 나쁜 이유, imo.
감사합니다.

6
@mmmeff, BSD 3 절 라이선스가 제한적이라고 생각한다면 GPL 및 AGPL 라이선스에 대해 들었을 때 죽을 까 봐 걱정됩니다.
Michael Pfaff

15

부분 라인을 작성합니다.

process.stdout.write("text");
process.stdout.write("more");
process.stdout.write("\n"); // end the line

출력의 양이 진짜 문제라면 로깅을 다시 생각할 것입니다. 선택적 런타임 로깅을 허용하는 로깅 시스템을 사용하여 출력을 필요한 것으로 좁힐 수 있습니다.

// The sections we want to log and the minimum level
var LOG_LEVEL = 4;
var LOG_SECTIONS = ["section1","section2","section3"];

function logit(msg, section, level) {
  if (LOG_SECTIONS.indexOf(section) > -1 && LOG_LEVEL >= level) {
    console.log(section + ":" + msg);
  }
}

logit("message 1", "section1", 4); // will log
logit("message 2", "section2", 4); // will log
logit("message 3", "section3", 2); // wont log, below log level
logit("message 4", "section4", 4); // wont log, not in a log section

6

\ r을 사용하여 회선을 종료하십시오.

process.stdout.write('text\r');

다음은 간단한 예입니다 (벽시계).

setInterval(() => process.stdout.write(`clock: ${new Date()}\r`), 1000);

이것은 작동하지만 '변경된'줄이 이전 줄보다 짧으면 터미널에 오래된 문자 중 일부를 유지합니다.
Matthijn

5

TypeError: process.stdout.clearLine is not a functionVisual Studio Code (또는 Webstorm)의 디버그 콘솔 창에서 와 같은 stdout 예외가 표시되면 앱을 내부 콘솔 대신 외부 터미널 애플리케이션으로 실행합니다. 그 이유는 Debug Console 창이 TTY가 아니기 때문입니다 ( process.stdout.isTTYis false). 따라서 귀하의 실행 구성을 업데이트 launch.json"console": "externalTerminal"옵션을 선택합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.