有個需求是將外面設備的 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
  成功設置好時區就可以了。(難題三)