使用 snmp 監控檔案

使用snmp監控檔案大小, 以及檔案中出現指定字樣的次數

snmp提供兩個entry來達到目標, 使用此方法可以來監控比如nginx access log裡面502的次數, 又或者是 error log的大小.


監控檔案大小, 單位為kb: file FILE [MAXSIZE]

監控指定字樣出現次數: logmatch NAME FILE CYCLETIME REGEX


/etc/snmp/snmpd.conf新增以下兩行

logmatch mylogcheck /var/log/dummy/dummy.log 150 SYSTEM STATS
file /var/log/dummy/dummy.log 2

這樣的意思就是說

  • 監控/var/log/dummy/dummy.log這個檔案 SYSTEM STATS出現的次數
  • /var/log/dummy/dummy.log這個檔案的大小不能超過2k
  • mylogcheck只是名子, 可以自己取


先看一下狀態, 目前SYSTEM STAT出現三次, 並且檔案大小是8.3k

root@ubuntu:/var/log/dummy# grep "SYSTEM STAT" dummy.log | wc -l
3
root@ubuntu:/var/log/dummy# du -h dummy.log
8.3K dummy.log

查看出現次數

❯ snmpwalk -v2c -c labsnmp 192.168.41.123 .1.3.6.1.4.1.2021.16
UCD-SNMP-MIB::logMatchMaxEntries.0 = INTEGER: 250
UCD-SNMP-MIB::logMatchIndex.1 = INTEGER: 1
UCD-SNMP-MIB::logMatchName.1 = STRING: mylogcheck
UCD-SNMP-MIB::logMatchFilename.1 = STRING: /var/log/dummy/dummy.log
UCD-SNMP-MIB::logMatchRegEx.1 = STRING: SYSTEM STATS
UCD-SNMP-MIB::logMatchGlobalCounter.1 = Counter32: 8
UCD-SNMP-MIB::logMatchGlobalCount.1 = INTEGER: 8
UCD-SNMP-MIB::logMatchCurrentCounter.1 = Counter32: 3
UCD-SNMP-MIB::logMatchCurrentCount.1 = INTEGER: 3
UCD-SNMP-MIB::logMatchCounter.1 = Counter32: 3
UCD-SNMP-MIB::logMatchCount.1 = INTEGER: 0
UCD-SNMP-MIB::logMatchCycle.1 = INTEGER: 150
UCD-SNMP-MIB::logMatchErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::logMatchRegExCompilation.1 = STRING: Success

抓到該字詞出現3次


查看檔案大小

❯ snmpwalk -v2c -c labsnmp 192.168.41.123 .1.3.6.1.4.1.2021.15.1
UCD-SNMP-MIB::fileIndex.1 = INTEGER: 1
UCD-SNMP-MIB::fileName.1 = STRING: /var/log/dummy/dummy.log
UCD-SNMP-MIB::fileSize.1 = INTEGER: 8 kB
UCD-SNMP-MIB::fileMax.1 = INTEGER: 2 kB
UCD-SNMP-MIB::fileErrorFlag.1 = INTEGER: error(1)
UCD-SNMP-MIB::fileErrorMsg.1 = STRING: /var/log/dummy/dummy.log: size exceeds 2kb (= 8kb)

抓到檔案大小8k, 超過我們配置的2k



那個 oid 是哪來的?

其實我沒有找到oid.. Orz
那我是怎麼知道要使用這個oid呢? 是用下面這種偷吃步的方式啦!

因為snmpd已經註冊了我們配置的名子, 所以就大範圍搜尋!

❯ snmpwalk -v2c -c labsnmp 192.168.41.123 .1.3.6.1.4.1.2021 | grep mylogcheck
UCD-SNMP-MIB::logMatchName.1 = STRING: mylogcheck

找到以後,再把他翻譯回來

❯ snmptranslate -On UCD-SNMP-MIB::logMatchName.1
.1.3.6.1.4.1.2021.16.2.1.2.1

其實不用特別翻譯也可以用哦, 前提是你的snmp client有安裝mib; 我覺得反解回來oid比較通用啦~



額外技巧: snmp正反解
正解

% snmptranslate .1.3.6.1.2.1.1.3.0
SNMPv2-MIB::sysUpTime.0

反解

% snmptranslate -On SNMPv2-MIB::sysUpTime.0
.1.3.6.1.2.1.1.3.0

參考:
SNMPD manpage (Log File Monitoring)
snmptranslate