X일보다 오래된 웹 서버 로그 파일의 줄을 삭제하시겠습니까?

X일보다 오래된 웹 서버 로그 파일의 줄을 삭제하시겠습니까?

기본 "기본" 로그 형식을 사용하여 Ubuntu에서 Nginx를 실행하고 있으며 다음과 같은 출력이 생성됩니다.

95.108.181.102 - - [11/Feb/2018:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"

나는 회전되지 않는 기본 로그 파일을 가지고 있으며 이를 GoAccess(로그 구문 분석/보고 소프트웨어)와 함께 사용합니다. 약 30일이 지난 로그 항목이 포함된 파일의 줄을 삭제하고 싶습니다. 이것이 가능합니까? bash 문을 사용하는 것이 더 낫습니까?

이를 기존 일일 cronjob에 추가하여 30일 롤링 보고서를 생성할 계획입니다. 다음과 같은 것을 사용하고 싶지만 로그를 올바르게 구문 분석할 수는 없습니다.sed -i '/<magical-invocation-goes-here> --date="-30 days"/d' example.log

답변1

암소 비슷한 일종의 영양awk해결책:

샘플 test.log:

95.108.181.102 - - [11/Feb/2018:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"
95.108.181.102 - - [11/Aug/2017:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"
95.108.181.102 - - [01/Jan/2018:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"
95.108.181.102 - - [11/Feb/2018:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"

awk -v m1_ago=$(date -d"-1 month" +%s) \
'BEGIN{ 
     split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month);
     for (i in month) m_nums[month[i]] = i
 }
 { split(substr($4,2), a, "[/:]") }
 mktime(sprintf("%d %d %d %d %d %d", a[3], m_nums[a[2]], a[1], a[4], a[5], a[6])) > m1_ago
' test.log > tmp_log && mv tmp_log test.log

최종 test.log콘텐츠:

95.108.181.102 - - [11/Feb/2018:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"
95.108.181.102 - - [11/Feb/2018:11:43:10 +0000] "GET /blog/ HTTP/1.1" 200 4438 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "-"

관련 정보