iptables를 사용하여 파일을 수정하여 연결에 대한 정보를 저장 /etc/syslog.conf
했습니다 /var/log/iptables.log
.
따라서 X시간마다 로그 파일에서 정보를 추출해야 합니다. 하지만 문제는 파일이 커지고 검색 속도가 느려진다는 것입니다. 그래서 나는 다음을 사용했습니다.
sed -i '/string/d' iptables.log
더 이상 필요하지 않은 것들을 제거하기 위해. 하지만 이 명령을 사용하면 iptables는 iptables.log
파일에 데이터 저장을 중지합니다.
그렇다면 무엇이 잘못되었나요? 이 문제를 어떻게 해결할 수 있나요?
답변1
어쩌면 시도해봐
cat iptables.log | sed -n "/PatternYouLookat/ p"
이렇게 하면 sed 중에 파일을 잠그지 않습니다.
대용량 파일의 경우 sed 성능이 낮으므로 파일을 먼저 greping하거나 마커/인덱스를 유지하여 이 파일에서 꼬리 부분을 제거하고 파일의 꼬리 부분만 처리할 수 있도록 하십시오(임시 복사본이 있는 경우에도 처리량이 많은 경우).
sed -u를 사용하여 스트림으로 작업하고 대용량 파일의 일부 버퍼 문제를 피할 수 있습니다
답변2
syslog를 사용하고 계신 것 같습니다. sed 내부 편집이 실제로 새 파일을 생성하고 이전 파일을 삭제한다고 가정합니다.
알림 없이 로그 파일을 회전/재생성하는 경우 Syslog는 매우 취약합니다. 여러분이 보고 있는 것은 정확히 무슨 일이 일어나고 있는지입니다. 파일이 존재하더라도 syslog는 파일에 아무 것도 기록하지 않습니다. 이는 syslog가 여전히 이전 파일 핸들을 갖고 있고 이전 파일에 기록하기 때문입니다(ls와 같은 명령을 사용하면 더 이상 볼 수 없지만). syslog가 파일 핸들을 닫으면 데이터가 사라집니다.
대신 devnull과 같은 logrotate를 사용하는 것이 좋습니다. 원하지 않는 경우 syslog 다시 로드를 실행하거나 sed 호출 후 재부팅하십시오. 이것은 트릭을 수행해야합니다.
답변3
로그 회전을 사용하십시오. 일반적으로 밤이나 매주 회전하지만 필요한 값으로 변경할 수 있습니다. 유일한 문제는 이것이 logrotate에 의해 처리되는 회전 후에 iptables를 다시 시작해야 함을 의미할 수 있다는 것입니다. 이것이 필요한지 또는 이것이(또는 빈도)가 귀하 또는 귀하의 응용 프로그램에 문제인지는 모르겠습니다.
Logrotate는 새 로그 파일을 생성하고 이전 로그 파일의 이름을 바꿉니다. 모두 보관하거나 일정 기간이 지나면 자동으로 삭제할 수 있습니다. 회전된 파일은 더 이상 로깅에 사용되지 않으므로 문제 없이 변경할 수 있습니다.
- 로그 파일이 있다고 가정해 보겠습니다
access.log
. - Logrotate는 일반적으로 이름을
access.log-20140729
. - 날짜 대신 숫자를 사용할 수 있습니다
access.log.1
. - sed 변경을 사용하여 다른 cronscript를 실행할 수 있습니다
access.log.1
. - 다음 회전에서는 파일 이름이 바뀌고
access.log.2
모든 변경 사항이 포함됩니다. - 최신 이름
access.log
은 이름이 바뀌고access.log.1
sed를 통해 변경할 수 있습니다. - 새로 만들었다
access.log
등등..