1. 程式人生 > >python3使用logging包,把日誌寫到系統的rsyslog中

python3使用logging包,把日誌寫到系統的rsyslog中

最近要寫一個python程式寫日誌到rsyslog中,並通過配置rsyslog的檔案來將他存到一個指定檔案中。

首先,我想來看看logging提供的常用模組:

logger:logger主要是用來配置和傳送日誌訊息的。可通過logging.getLogger(name)來返回一個logger物件。不指定name就預設為root。這裡可以取一個合適的名字。相同的name會返回同一個logger物件。在Formatter方法中用%(name)s在日誌中打印出這個name。例如:

log = logging.getLogger('mylog')
log_format = logging.Formatter(
    'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')

#列印結果示例:
#Aug  2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message

handler:將日誌記錄傳送到目的地,如檔案,socket等。這裡可以通過addHandler方法新增多個handler,可以實現日誌的分級過濾。如果要把日誌傳送到rsyslog中,就可以採用SysLogHandler(),使用這個方法前需要匯入他

from logging.handlers import SysLogHandler

這個方法有兩個引數、一個是rsyslog中的facility:指定的是傳送的裝置,如kernel,mail,system等等,他還有local0-local7預留。這裡我採用local5。還有一個引數指定的是log程式的地址,在centos7上預設是/dev/log。示例如下:

log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')

對應的rsyslog設定檔案(/etc/rsyslog.conf):

local5.*						/var/log/all.log
#將local5的所有日誌存入all.log檔案中

如果想用handler對日誌資訊進行過濾,可以這樣:

log_hdlr.setLevel(logging.ERROR)
#這裡就指定了接收error以及更高級別的日誌

formatter:指定日誌的輸出格式,包括訊息格式和日期字元格式,例如:

log_format = logging.Formatter(
    'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
#輸出示例
#Aug  2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message

formatter可呼叫引數有:

%(name)s Logger的名字
%(levelname)s 文字形式的日誌級別
%(message)s 使用者輸出的訊息
%(asctime)s 字串形式的當前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(levelno)s 數字形式的日誌級別
%(pathname)s 呼叫日誌輸出函式的模組的完整路徑名,可能沒有
%(filename)s 呼叫日誌輸出函式的模組的檔名
%(module)s  呼叫日誌輸出函式的模組名
%(funcName)s 呼叫日誌輸出函式的函式名
%(lineno)d 呼叫日誌輸出函式的語句所在的程式碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌資訊時的,自Logger建立以 來的毫秒數
%(thread)d 執行緒ID。可能沒有
%(threadName)s 執行緒名。可能沒有
%(process)d 程序ID。可能沒有

由上面的這些模組就可以實現我想要的功能啦

將日誌寫入到all.log檔案中-----原始碼:

import logging
from logging.handlers import SysLogHandler

log = logging.getLogger('mylog')
log.setLevel(logging.DEBUG)
log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
log_format = logging.Formatter(
    'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
log_hdlr.setFormatter(log_format)
log_hdlr.setLevel(logging.ERROR)#接受error及以上的日誌資訊
log.addHandler(log_hdlr)
log.debug('debug message test')#指明級別為debug
log.error('error message test')#指明級別為error
#最後只儲存error及更高優先順序的日誌

可能有些地方說的不對,還望大家能夠指正!