Node.JS에서 상당히 하나의 고민으로 남았던 것 중에 연속적인 표준 출력을 읽는 방법이었습니다. Linux 시스템에서는 tail -f 명령어로 가능했던 것입니다. 하지만 EOF 글자를 보는 순간 Node.JS의 ReadStream으로는 end 이벤트가 발화되기 때문에 직접적인 사용에 어려움이 있습니다. 그렇기 때문에 조금 더 낮은 레벨에서 파일을 다루어야 합니다. 물론 직접 tail 바이너리를 사용해도 되겠지만 조금 더 부드럽게 처리하기 위해서는 Node.JS 단의 구현이 더 괜찮겠습니다.

대표적인 2개의 라이브러리와 그 비교

tail명령어와 같은 역할을 하는 라이브러리를 찾아보니 대표적으로 2가지를 찾아볼 수 있었습니다. 각각 node-tail과 always-tail 프로젝트입니다. 2개의 라이브러리 모두 따로 특이한 종속성없이 유지보수되고 있는 프로젝트입니다.

tail
tail a file in node
always-tail
continuous file tail. robust enough to survive rollovers.

단순히 눈으로 보아서는 always-tail 라이브러리는 타 라이브러리와는 다르게 I/O에 오류가 발생해도 계속 그 내용을 읽어준다고 합니다. 하지만 이렇게 파일 작업을 할 때는 상당히 성능에 민감하여야 합니다. Node.JS에는 다른 성능을 가지고 비슷한 일을 하는 메서드가 상당히 많기 때문에 더더욱 주의해야 합니다. 기초적으로 웹이 상당히 하위 호환성에 큰 의미를 두기 때문입니다.

fs.watchfs.watchFile

fs 모듈의 watchFile 메서드는 watch보다 오래되었고 상당히 많은 리소스를 사용합니다. Stackoverflow 답변에서도 공통적으로 watchFile이 많은 리소스를 사용한다고 하며 Parker님의 답변에서 watchFile이 지속적으로 stat() 함수를 불러내어 파일에 실제 변경 사항이 없어도 자원 사용이 존재하는 것을 볼 수 있습니다.

Difference in fs watch methods
What is the defference between methods of node.js file system watching: watch(filename,[, options],(filename) => {} ) (node-watch package)fs.watch(filename[, options][, listener])fs.watchFile(

실제로 node-tail 라이브러리는 watchFile 메서드를 사용할지 선택을 할 수 있는 것을 볼 수 있고 기본적으로 watch 메서드를 사용하고 있는 것을 볼 수 있었습니다.

lucagrulla/node-tail
The zero dependency Node.js module for tailing a file - lucagrulla/node-tail

하지만 반대로 always-tail 라이브러리는 watchFile 메서드를 사용하여 비교적 높은 리소스 사용을 암시한다고 볼 수 있습니다.

jandre/always-tail
node module for always tailing a file -- recovers gracefully if it gets moved, deleted, or rolled-over. - jandre/always-tail

그 외에도 node-tail 라이브러리가 상당히 최근의 문법과 더 많은 옵션으로 구성되었다는 점에서 더 괜찮아보입니다.

애플리케이션에서 언제 tail -f가 필요할까?

저에게 있어서 이러한 솔루션이 필요한 이유의 상당 부분에는 캐싱이 있습니다. 파일을 온라인에서 스트림으로 저장되는 중의 상황이라고 할 때 여러 개의 프로세스가 동일한 자원에 접근하려고 할 때, 여러 프로세스가 모두 다운로드받지 않고도 하나의 프로세스에서만 다운로드하면서도 모두가 사용할 수 있게 해줍니다. 물론 여전히 중간에 다운로드가 실패하는 경우 어떻게 해야 모든 프로세스가 쓰고 있던 파일을 계속 읽어오는 중에도 지속적으로 데이터를 가져올 수 있는지는 따로 생각해야 보아야할 과제인 것 같습니다.


사실 이런 솔루션을 Node.JS를 하면서 찾게 될 줄은 몰랐는데 점점 더 깊은 수준의 효율을 요구하게 되면 될수록 듣도보도 못한 새로운 분야를 찾게 되는 것 같습니다.