OneDay Network
로그 파싱 및 로그 내용 데이터베이스화, 시각화(Bash,Influx,Grafana) 본문
로그를 파싱하여 DB에 저장하고자 한다.
로그 파싱에 이용한 내용은 아래와 같다.
1. Bash(파싱 및 DB Insert)
2. InfluxDB(시계열 데이터베이스)
3. Grafana(시각화)
1. 로그 파싱 및 InfluxDB Insert(Bash,InfluxDB)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#!/bin/bash
new=`cat /var/log/error.log | wc -l`
old=`cat /var/log/error_old.log | wc -l`
set_num=`expr $old + 1`
echo $new $old $set_num
if [ $new == $old ]
then
echo "not diff" > /dev/null
else
new_log=`cat /var/log/error.log | sed -n "$set_num",'\$p;'""`
echo "$new_log" | while read line
do
#echo "$line"
log_time=`echo $line | awk '{print $1}'`
ip=`echo $line | awk '{print $2}'`
user=`echo $line | awk '{sub(":","",$3); print $3}'`
data_time=`echo $line | awk '{print $4 "/" $5}'`
level=`echo $line | awk '{print $6}' | sed 's/[][]//g'`
pid=`echo $line | awk '{sub(":","",$7); print $7}'`
log=`echo $line | awk '{for(i=9;i<=NF;i++)printf("%s ", $i);printf("\n")}' | sed 's/"//g'`
res=`echo logdata,ip=$ip,level=$level logtime=\"$log_time\",datatime=\"$data_time\",user=\"$user\",pid=\"$pid\",log=\"$log\"`
curl -i -XPOST 'http://Your IP Address or Domain:8086/write?db=log_data' --data-binary "$res"
done
`cat /var/log/error.log > /var/log/error_old.log`
fi
|
cs |
- old로그랑 new로그랑 로그 줄 수를 비교함
- 비교하여 바뀐줄을 db에 insert(로그는 순차적으로 쌓인다는 전제)
- 현재 로그를 old로그로 저장
2. 시각화(Grafana)
- IP or Level로 정렬하여 보면 관리가 편함.
3. 자동 작업 수행 설정(crontab)
* * * * * /root/log.sh
- crontab -e를 눌러 등록(매 분마다 실행 하게 설정)
-> 필자는 로그 갯수가 많지 않아 간단히 작성한 쉘 스크립트이다.
-> 빠른시간내에 다량의 로그가 발생하면 퍼포먼스의 문제가 생길 가능성이 높다.
-> 전체 로그의 줄 수를 읽는 것이 아니라 old로그는 압축하는 방식을 통해 한 파일이 커지는 것을 방지 할 필요가 있어 보인다.
-> 로그가 많다면 일정 시간에 한번에 db에 dump 형식으로 write하는 것이 바람직 할 것으로 보인다.
'System' 카테고리의 다른 글
alert 시스템 구축하기(bash,slack webhooks) (0) | 2020.10.12 |
---|
Comments