다음 명령을 사용하여 Debian에서 Java 서버를 실행하고 있습니다.
java -jar myapp.jar [args] >> log.txt
로그 파일을 압축해서 보내려고 했는데 원본 파일은 사라지고 .gzip만 남았다는 걸 깨달았습니다.
파일을 수동으로 생성하고 원본 파일의 압축을 풀려고 시도했지만 응용 프로그램이 더 이상 파일에 기록하지 않습니다. 그래서 내 질문은 다음과 같습니다: 그 이후에 해당 로그는 어디로 가나요? 응용 프로그램을 다시 시작하지 않고 출력 로그 파일을 다시 라우팅하는 방법이 있습니까(서버이기 때문에 프로세스를 종료하고 싶지 않습니다).
答え1
gzip
log.txt
파일이 Java 프로세스에 의해 아직 열려 있는 동안 삭제하십시오. 파일을 삭제한다는 것은 실제로 파일 이름을 삭제하는 것을 의미합니다. (파일 이름이 여러 개인 경우 다중 이름이 있다고 합니다.하드 링크.) 파일 데이터는 모든 파일 이름이 삭제되고 어떤 프로세스에서도 파일이 열려 있지 않은 경우에만 삭제됩니다. 따라서 파일이 사라진 후에도 여전히 디스크에 남아 있습니다. Java 프로세스가 종료되거나 파일을 닫을 때만 파일이 실제로 삭제됩니다.
Java 프로세스는 현재 삭제된 파일에 계속 쓰고 있습니다. 동일한 이름으로 새 파일을 생성해도 상관없습니다. 이는 다른 파일입니다.
파일에 이름이 남아 있지 않으면 대부분의 unice에서는 파일이 아직 열려 있어도 파일에 대한 하드 링크를 다시 만들 수 없습니다. 하나 있다제안된 패치flink
Linux에서 이 작업을 수행하기 위해 시스템 호출을 도입했지만격추하다.
여전히 파일의 내용을 읽을 수 있습니다(Linux에서는 편리하지만 대부분의 unice에서는 그리 편리하지 않을 수 있습니다). /proc/1234/fd
1234가 Java 프로세스의 PID인 디렉토리에는 프로세스가 연 파일에 대한 심볼릭 링크가 포함되어 있습니다. 이러한 파일 중 하나가 삭제되면 기호 링크는 매달려 있지만 읽기 위해 계속 열 수 있습니다.
이렇게 하면 프로세스에서 모든 로그 줄을 추출할 수 있습니다. 달리기
tail -c +$(($(zcat log.txt.gz | wc -c) + 1)) -f </proc/1234/fd >more-log.txt
Java 프로세스가 종료될 때까지.
答え2
에서 man gzip
:
-k, --keep Keep (don't delete) input files during compression or
decompression.
그래서 gzip -k log.txt
그것은 이루어져야합니다.
(그러나 일반적으로 말하자면,진짜로깅 솔루션(예: 일부 syslog
데몬)은 다음을 사용할 수 있습니다.log4j
, 바람직할 수 있습니다. )