Ubuntu 20
, Bash 5
.
제가 뭔가 멍청한 걸 간과했을 수도 있어요! 로깅을 위해 및 를 foo
사용하는 C++ 바이너리가 있습니다 .std::cout
printf()
puts()
./foo
터미널에서 실행하면 일부 출력(및 분할 오류)이 발생합니다.
모든 것을 리디렉션하면 ./foo > log
출력의 일부만 표시됩니다. 예상 ./foo 1>one 2>two
대로 then 을 전파하면 one
단축된 출력이 포함되고 two
아무것도 포함되지 않습니다.
(분명히) 중앙 로깅 기능이 없으므로 강제로 새로 고치는 방법을 상상할 수 없습니다.
무엇이 잘못될 수 있나요?
$./foo
text1
text2
$./foo > log ; cat log
text1
답변1
로깅은 이와 아무 관련이 없으며 배워야 할 C 및 C++ 프로그래밍의 기본 측면입니다.
표준 I/O 라이브러리 루틴은 런타임 라이브러리가 표준 출력이 터미널 장치가 아니라고 결정했기 때문에 출력을 완전히 버퍼링합니다. stdout 라인 버퍼링을 원하는 경우 setvbuf()
stdout이 Bernstein과 같은 도구를 사용하는 터미널임을 C 런타임 라이브러리에 확신시키 ptybandage
거나 C 라이브러리의 특수 후크를 사용하여 코드를 사용하여 라인 버퍼링을 켜는 방식으로 코드에서 라인 버퍼링을 켤 수 있습니다. 주입 도구, 예를 들어 여기서는 아마도 가장 좋은 옵션 stdbuff
일 것입니다 . ptybandage
비침습적이며 아마도 할 수 있습니다아니요표준 I/O 버퍼링의 특성을 제대로 이해하고 나면 프로그램에서 명시적인 버퍼 재정의를 구현하고 싶을 것입니다.
그런데 표준 출력에는 기록하지 마세요. 에 로그인하세요 std::clog
.