관리하는 서비스에서 오류를 확인하기 위해서 스크립트를 만들었다.
1 2 3 |
#!/bin/sh today=date "+%Y%m%d" log_file='apache.log' tail -f $log_file.$today | awk '($9 != 200 && $9 != 302 && $9 != 304) {print $0}' |
1 2 3 |
#!/bin/sh log_file='catalina.out' tail -f $log_file | awk '/ERROR/ || /WARN/ || /Exception/ {print $0}' |
아파치의 경우에는 로테이트 로그 되므로 날짜를 지정하게 했다.
200, 302, 304 status code는 정상이므로 걸러내고, 나머지에 대해서만 필터링해서 출력하는 코드이다.
톰캣의 경우에는 그냥 파일이름만 있으면 된다.
대충 ERROR나 WARN 혹은 Exception이라는 문자열을 기준으로 필터링해서 출력하는 코드이다.
위 코드에는 한 가지 문제가 있다.
서버가 5대라면, 각기 5(서버수) x 2(톰캣, 아파치) = 10개의 터미널 창이 필요하다.
실제로 예전에는 저렇게 진행했다.
그런데, 서버가 더 늘어나자… 이건 터미널 창이 기하급수적으로 늘어난다.
그래서 ssh를 통해 한 곳에서 여러 원격 서버의 로그를 확인할 수 있는 스크립트를 작성했다.
1 2 3 4 5 6 7 8 |
#!/bin/sh today=date "+%Y%m%d" log_file='apache.log' for server in "free01" "free02" "free03" "free04" "free05" do ssh freeism@$server "tail -f $log_file.$today" | awk -v server=$server '($9 != 200 && $9 != 302 && $9 != 304) print "["server"]", $0}'& done |
1 2 3 4 5 6 |
#!/bin/sh log_file='catalina.out' for server in "free01" "free02" "free03" "free04" "free05" do ssh freeism@$server "tail -f $log_path/$log_file" | awk -v server=$server '(/ERROR/ || /WARN/ || /Exception/) {print "["server"]", $0}'& done |
1 2 |
#!/bin/sh kill ps aux | grep "ssh <A href="mailto:freeism@free0" target="">freeism@free0</A>" | grep -v grep | awk '{print $2}' |
첫번째는 아파치, 두번째는 톰캣 로그를 확인하는 거다.
백그라운드 작업(&)가 들어가기 때문에, 나중에 kill 할 때 번거로움이 있어서
세번째 스크립트로 kill 할 수 있도록 했다. (아파치, 톰캣 로그 찍는 것 모두 kill 된다)
참고로 awk 에서 -v 옵션은 파라미터 인자를 주는 건데,
sh에서 사용하는 변수 값을 awk 내부에서 사용할 수가 없다.
그래서 해당 변수값을 다시 지정해서 awk에서 사용할 수 있게 한거다.
위처럼 하면, 서버가 아무리 많아도 터미널 3개로 충분하다. (아파치 로그, 톰캣 로그, kill 할 터미널)
쉘 프로그래밍이 더 어려움… awk는 awk ‘{ print $0 }’ 이거 말고 써본게 없네ㅋㅋ
너야뭐 워낙 잘하니까는…^^ 가끔 옆에 놓고 배우고 싶은데, 아쉽군