각 줄이 ISO8601 타임스탬프(Nginx)와 에포크 타임스탬프(Nginx)로 시작하여 $time_iso8601
가장 가까운 밀리초까지 표시되는 사용자 지정 Nginx 액세스 로그가 있습니다. $msec
이와 같이:
2023-01-16T20:19:57+00:00 1673900397.009 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.140 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.163 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.205 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.210 ips="…" rm="…" […]
파일의 각 줄을 처음부터 시작하여 대상 대상이 ISO8601 타임스탬프 형식으로 연도, 월, 날짜를 기준으로 빌드된 (새 또는 기존) 파일로 줄을 이동하고 싶습니다 /yyyy/mm/dd/access.log
. 예를 들어 위 코드 조각에서 각 행을 source 에서 access.log
target 으로 이동하려고 합니다 /2023/01/16/access.log
.
대상 디렉터리가 존재하지 않으면 새로 만들어야 합니다. 대상 파일이 없으면 생성해야 합니다.
yyyy
, mm
및 값을 추출하려면 어떤 도구를 사용하시겠습니까 dd
?
답변1
더 나은 사용법 logrotate
이나 nginx
구성αГsнιn이 댓글에서 말했습니다.
awk
단지 재미로 이것을 구현하고 싶다면 :
awk -F'[-T]' '{
dir=$1"/"$2"/"$3
rc=system("mkdir -p " dir)
if (rc != 0) exit
print $0 >> dir"/access.log"
close(dir"/access.log")
}' access.log
# rm -f access.log
필드 구분 기호는 FS
F
대시 및 문자 클래스로 설정됩니다.S
-F
-
T
출력 디렉터리/파일
$ find
./2023
./2023/01
./2023/01/16
./2023/01/16/access.log