【Zabbix】history_log의 로그를 호스트/아이템 마다 로그 출력
【작성한 배경과 기능】
모니터링 시스템을 수정 한 후 오류가 발생했을 때,
인프라/개발/운용으로 분류하여 에러에 대응하지 않으면
되지 않았지만 ZabbixWebGUI를 확인할 수 있는 기기 수는
제한적이기 때문에 외부에 오류 로그를 출력 할 필요가있었습니다.
이상으로서는, 이하의 기능을 갖고 싶다고 희미하게 생각하고 있었습니다.
· 호스트 이름 및 항목별로 로그 파일 출력
· 파일 이름을 보는 것만으로 어떤 서버의 어떤 로그를 알 수 있습니다.
・기간 지정 가능(※ 로그 보존 기간이 허락하는 한)
Zabbix는 다음 유형의 로그를 history_log 테이블에
저장하고 있기 때문에 여기에서 잘 일괄 출력할 수 없는지 생각했습니다.
・/var/log/messages의 아이템으로 설정한 에러 로그
Oracle, MySQL, SQL Server 등의 DB 각종 로그
・Windows의 APP/SYS/SECURITY 로그
기타, 설정하고 있다면 모든 로그 데이터
【검증 환경】
● Zabbix 서버
· CentOS 7.4
・Zabbix 3.4.3(3.0.9에서도 괜찮아)
・MySQL 5.7.20
【이용하는 툴의 소개】
설정 파일과 본 툴의 2개를 사용해 일괄 출력합니다.
◆logexport.txt
취득하는 히스토리 로그의 리스트를 쉘내에서 작성해,
결과를 출력하는 텍스트가 이 파일입니다.
안은 다음과 같은 느낌입니다.
logexport.txt
28603 Zabbixs01 SNMP_Trap_fallback
28604 タスクPC SNMP_Trap_linkDown
왼쪽에서 항목 ID, 호스트 이름, 항목 이름
저장하고 나중에 인수로 사용합니다.
쉘내에서 이 텍스트 파일은 자동 작성하므로,
준비하지 않아도 괜찮습니다.
◆dump_historylog.sh
이 도구입니다. 구현한 기능은 위에서 설명했으므로 생략합니다.
【dump_historylog.sh】
다음은 쉘의 내용입니다.
dump_historylog.sh
#!/bin/bash
###初期設定
OUT_DIR=/home/ToolAdmin/log
CUR_DIR=`dirname $0`
###MySQL設定
MY_CONF=/home/ToolAdmin/mysql.conf
###取得期間の設定
STIME=`date +%s -d '90 days ago'`
ETIME=`date +%s`
CON_FILE=logexport.txt
###取得ヒストリログリストを作成
mysql --defaults-extra-file=${MY_CONF} << _EOSQL_ | sort | uniq -c | sed -e 's/ 1 //g' -e '/itemid/d' > $CUR_DIR/$CON_FILE
SELECT distinct
i.itemid,
h.host,
i.name
FROM history_log hl
INNER JOIN items i ON hl.itemid = i.itemid
INNER JOIN hosts h ON i.hostid = h.hostid
_EOSQL_
###出力不可になる特殊文字列の排除
sed -i -e "s/[\|/|:|*|?|\"|<|>|\|]/-/g" "$CUR_DIR/$CON_FILE"
###history_log取得
while read LINE
do
ITEMID=`echo $LINE | awk '{print $1}'`
HOSTNAME=`echo $LINE | awk '{print $2}'`
INAME=`echo $LINE | awk '{print $3}'`
OUT_FILE=${HOSTNAME}_${INAME}_`date +%Y%m%d%H%M%S`.log
mysql --defaults-extra-file=${MY_CONF} << _EOSQL_ >> $OUT_DIR/$OUT_FILE
SELECT
i.itemid 'アイテムID',
h.name 'ホスト名',
FROM_UNIXTIME(hl.clock) '日時',
hl.severity 'Win深刻度',
hl.source 'Winソース',
hl.logeventid 'WinEVT_ID',
hl.value 'エラー内容'
FROM history_log hl
INNER JOIN items i ON hl.itemid = i.itemid
INNER JOIN hosts h ON i.hostid = h.hostid
WHERE hl.clock BETWEEN ${STIME} AND ${ETIME}
ORDER BY hl.clock;
_EOSQL_
done < $CUR_DIR/$CON_FILE
실행하면 아래와 같은 로그가 나옵니다.
호스트 및 항목별로 파일이 출력되므로,
많은 양의 파일이 출력됩니다. 미리 주의해 주십시오.
나의 검증 환경은 초라므로 SNMPTrap의 테스트 로그 밖에 나오지 않습니다!
그리고는 다운로드하고 확인하면 끝입니다.
만약 모든 로그를 병합하고 싶다면 이하의 커멘드를 치면 좋을까 생각합니다.
※표제행만 사라져 버립니다만.
command.
cat *.log | sed -e '/^アイテムID*/d' > AllMerge.log
【주의점이나 반성점】
・특수 문자 처리에 대해서
스크립트의 도중에 특수 문자를 삭제하고 있는 처리가 있습니다.
이 항목 이름에 특수 문자가 있으면 출력 오류가 발생하고 실패합니다.
예방하기 위해서입니다. 그러나 여기에 한점 제한이 있고 아이템 이름에 공란이 있으면
1단어째까지 밖에 파일명에 반영해 줍니다.
여기는 고치고 싶습니다만 좋은 안이 떠오르지 않기 때문에, 일단 이것으로.
・출력 파일의 단락 문자에 대해서
이번은 스페이스로 출력하고 있습니다.
쉼표도 탭도 생각했지만, 로그 내 쉼표가있을 가능성도 있기 때문에,
그대로 출력하고 있습니다.
간단하게 작성했으므로 커스터마이즈하기 쉽다고 생각합니다.
특정 아이템만 갖고 싶다든가, 제목의 이름이 센스 나쁘기 때문에 바꾸거나,
여러가지 할 수 있다고 생각하기 때문에, 활용해 주시면 다행입니다.
뭔가 있으면 댓글로 기다리고 있습니다.
※ 이전 기사에서 편집 요청 보내 주신 분 감사합니다.
이상입니다.
Reference
이 문제에 관하여(【Zabbix】history_log의 로그를 호스트/아이템 마다 로그 출력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/HOBO0222/items/66d535472cb42181e109텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)