Apache 액세스 로그 파일을 정리하시겠습니까?

Apache 액세스 로그 파일을 정리하시겠습니까?

Apache 로깅을 위한 출력을 파이프하는 쉘 스크립트에 이 코드를 포함합니다.

declare -a values=( $taintRequestVals )

for item in ${!values[@]}
do
    cat $apacheLog | sed "s/${values[$item]}=[^&\t\n]*/${values[$item]}=***/g" | /bin/grep ${values[$item]}=
done

그러나 이는 매우 비효율적입니다. 몇 초 내에 access.log서버의 루트 슬라이스가 채워질 때까지 숫자는 기하급수적으로 4배로 늘어납니다. Apache로 작성하는 더 나은 방법을 찾고 있습니다 access.log.

답변1

여기서 문제는 Apache 로그를 읽고 동시에 쓰는 것입니다. 로그에 추가하는 것은 무엇이든 호출을 통해 파이프로 반환됩니다 cat(말장난 의도는 없습니다 :)). 이는 파일 시스템이 가득 찰 때까지 계속 작동하는 불쾌한 긍정적 피드백 루프를 생성합니다. 정답은이 문제왜 이런 일이 발생하는지에 관심이 있을 수 있습니다.

그럼 어떻게 해야 할까요? 간단한 해결책은 다음과 같이 파일을 수정하는 것입니다.

for item in ${!values[@]};do
    sed -i "..." "$apacheLog"  #cat isn't needed here
done

그리고 출력을 어디로든 파이프하지 마십시오. 스크립트 자체가 파일을 수정합니다.현장에서. 또한 sed효율성을 위해 (루핑 없이) 한 번만 호출하는 방법에 대한 terdon의 답변을 참조하세요 .

그러나 이 접근 방식의 문제점은 파일을 처리할 때 실제 Apache 서버가 파일에 내용을 기록할 수 있으며 이상한 일이 발생할 수 있다는 것입니다. 더 나은 해결책은 로그에서 민감한 정보를 제외하는 방법을 Apache 설명서에서 찾아보는 것입니다.

그건 그렇고, 당신이 하고 있는 일은 로그를 정리하지도 않습니다. 그것은 정리된 줄을 (여전히 오염된) 로그 파일에 다시 추가합니다.

답변2

현재로서는 다양한 개선이 가능합니다. 첫째, 가장 중요하지 않은 점은 다음과 같습니다.고양이의 쓸모없는 사용. 게다가 sed여러 번 실행하면 매번 전체 파일이 인쇄됩니다. 당신이 무엇을 하고 있는지 잘 모르겠습니다 grep. 특정 변수가 포함된 줄만 인쇄하려고 합니까?

어쨌든 더 좋은 방법은 한 번 실행 sed하고 모든 대체 작업을 수행하도록 하는 것입니다. 그것은 다음과 같습니다:

replace=""
for item in ${!values[@]}
do
    ## build the sed line
    replace="s/${values[$item]}=[^&\t\n]*/${values[$item]}=***/g;$replace"
done

### run the replacement using sed's -i option so it 
### changes the original file
eval sed -i \""$replace"\" $apacheLog

관련 정보