서버는 매시간 syslog_all.yyyy-mm-dd-hh 형식으로 새 로그 파일을 생성하고 이전 시간의 파일을 보관합니다.
나에게 필요한 것은 파일 이름이 변경되었기 때문에 매시간 명령을 다시 시작할 필요 없이 특정 문자열에 대해 현재 및 아직 생성되지 않은 로그 파일을 grep하는 방법입니다.
현재 나는 이렇게 합니다:
tail -f syslog_all.2017-04-25-09 | egrep -i --line-buffered "string1" | egrep -i "(.*first.*|.*second.*|.*third.*)"
답변1
이것은 고급 레시피입니다.
- 원하는 기능/우선순위 메시지를 명명된 파이프와 현재 위치에 출력하도록 syslogd 또는 rsyslogd(시스템에서 사용하는 것)를 구성하십시오. 에서 발췌
man rsyslog.conf
Named pipes This version of rsyslogd(8) has support for logging output to named pipes (fifos). A fifo or named pipe can be used as a des‐ tination for log messages by prepending a pipe symbol ('|') to the name of the file. This is handy for debugging. Note that the fifo must be created with the mkfifo(1) command before rsys‐ logd(8) is started.
내 예가 있습니다/etc/rsyslog.d/50-default.conf
daemon.*;mail.*;\
news.err;\
*.=debug;*.=info;\
*.=notice;*.=warn |/tmp/rt_monitor
명명된 파이프를 만들고 tail 및 grep을 사용하여 파이프에서 읽고 검색합니다.
mkfifo /tmp/rt_monitor; tail -f /tmp/rt_monitor | grep "alert string"
소비자가 실행되고 있지 않다면 명명된 파이프가 가득 찼을 때 시스템이 계속 실행되는지 확인하고 이런 일이 발생하지 않도록 해야 합니다. 제가 아주 잔인한 팁을 드렸습니다.