리디렉션을 사용하여 println
작업 출력을 xxx.log
파일에 기록합니다. 하지만 로그 정보를 crontab을 통해 현재 날짜 이름을 가진 별도의 파일로 옮기고 싶습니다 2017-08-18.log
.
> xxx.log
쉘 명령을 사용하여 파일 지우기를 시도했지만 xxx.log
새 로그가 생성되면 모든 것이 복원됩니다.
리디렉션 로그 파일을 지우는 방법은 무엇입니까?
고쳐 쓰다
- 실행한 후
> xxx.log
파일xxx.log
크기는 0입니다. 그러나 내 응용 프로그램이 일부 새 로그를 인쇄하면xxx.log
새 로그 정보뿐만 아니라 이전에 지워진 로그 정보도 포함됩니다. - 사용 후에는
mv xxx.log xxx2.log
새로운 로그 정보가 기록됩니다xxx2.log
. 하지만 이름 바꾸기 대신 사용하면rm xxx.log
로그 작업이 중지됩니다. 또한nohup java -jar xxx.jar > xxx.log 2>&1 &
익숙하다면 다음과 같은 절차를 따르세요.게임 프레임워크, 파일 빌드를 실행하면dist
명령을 통해 jar 파일이 생성됩니다. ps wx|grep "xxx.*.log
출력:
1)3912 pts/10 S+ 0:00 grep --color=auto xxx.log
2)26234 pts/10 Sl 0:16 /usr/lib/jvm/jdk1.8.0_111/bin/java -Duser.dir=...something ignored... play.core.server.ProdServerStart
(프로세스 실행 명령입니다)
도움이 되었기를 바랍니다. 다시 한 번 감사드립니다!
답변1
문제는 로그 파일을 작성하는 응용 프로그램에 의해 로그 파일이 열려 있다는 것입니다. 파일( )을 자르면 > file.log
응용 프로그램은 마지막으로 작성된 위치부터 계속해서 쓰기 시작합니다(잘림으로 인해 그 이전에는 파일이 0바이트로 채워질 것으로 가정합니다). 파일을 이동하면 파일이 열리면 이름이 더 이상 중요하지 않으므로 응용 프로그램은 계속해서 파일에 씁니다. 파일을 삭제하면 해당 블록은 디스크에서 해제되지 않으며 파일이 디렉터리에 더 이상 표시되지 않더라도 애플리케이션은 계속해서 블록에 기록합니다.
이것은 고전적인 장면입니다. 귀하의 신청서는 다음을 충족해야 합니다.
- 주기적으로 로그 파일 다시 열기
- 또는 잘린 것을 감지하고 다시 엽니다.
- 또는 "현재 로그 파일을 닫고 다시 열라"는 특수 신호를 기다립니다.
그렇지 않으면 애플리케이션을 다시 시작하는 것 외에는 외부적으로 아무것도 할 수 없습니다. 그런 다음 아래와 같은 방식으로 진행합니다 logrotate
.
- 먼저 로그 파일을 새 이름으로 이동합니다.
- 선택적으로
touch
로그 파일의 이전 이름을 사용하여 파일이 존재하도록 합니다. - 이전 로그 파일 쓰기를 강제로 중지하고 새 로그 파일 쓰기를 시작하려면 애플리케이션을 다시 시작하세요.
답변2
Perl에 익숙하다면 다음 작은 스크립트를 실행할 수 있습니다.
use POSIX qw(strftime);
$fbase = "tmp-%Y-%m-%d-%H-%M.log";
while(<>)
{
$fnamenew = strftime $fbase, localtime;
if ($fnamenew ne $fname)
{
print "logging to: $fnamenew\n";
$fname = $fnamenew;
close OUT;
open OUT, ">$fname";
}
print OUT $_;
}
다음과 같이 사용하십시오: $mycomputation | perl script.pl
. 주어진 시간 패턴에 따라 작성된 파일 이름에 모든 입력을 추가합니다(여기서는 ) tmp-YYYY-MM-DD-HH-MI.log
. 새로운 입력 줄마다 스키마가 다시 작성되고 이전 스키마와 비교하여 확인됩니다. 다른 경우 입력이 새 파일로 파이프되고 이전 파일은 닫힙니다.