有個需求是將外面設備的 syslog 經由 RabbitMQ,傳送到另外一台伺服器上,透過 Cacti syslog 的插件查看狀況。
難題
- 如何操作 RabbitMQ 收送訊息
- 如何用 Python 傳送 syslog
- 如何轉換 syslog 時區與格式
解決
用了兩天的時間看了 Python syslog 以及 RabbitMQ。
一開始先下載 RabbitMQ docker container,並找了一個 RabbmitMQ 簡單的收發訊息的程式測試成功。(難題一)
接下來花蠻多時間在研究 Python syslog,我這階段也是找了一個範例程式研究。
1
handler = logging.handlers.SysLogHandler(address=('127.0.0.1', 514), facility='local1')
上面這段程式就是設置要傳送到本機端的 514 port,以及隨意設定的 facility。
然後還有其他基本設定就不贅述,設定成功後就能在 Cacti 上看到所傳送的訊息了(難題二)
但是發現 Cacti 上的 log 時間格式錯誤,
於是我就參考該連結,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class Formatter(logging.Formatter):
"""override logging.Formatter to use an aware datetime object"""
def converter(self, timestamp):
dt = datetime.datetime.fromtimestamp(timestamp)
tzinfo = pytz.timezone('Asia/Taipei')
return tzinfo.localize(dt)
def formatTime(self, record, datefmt=None):
dt = self.converter(record.created)
if datefmt:
s = dt.strftime(datefmt)
else:
try:
s = dt.isoformat(timespec='milliseconds')
except TypeError:
s = dt.isoformat()
return s
成功設置好時區就可以了。(難題三)