python3使用logging包,如何把日志寫(xiě)到系統(tǒng)的rsyslog中
使用logging包,把日志寫(xiě)到系統(tǒng)的rsyslog中
最近要寫(xiě)一個(gè)python程序?qū)懭罩镜絩syslog中,并通過(guò)配置rsyslog的文件來(lái)將他存到一個(gè)指定文件中。
首先,我想來(lái)看看logging提供的常用模塊:
logger
logger主要是用來(lái)配置和發(fā)送日志消息的。
可通過(guò)logging.getLogger(name)來(lái)返回一個(gè)logger對(duì)象。
不指定name就默認(rèn)為root。
這里可以取一個(gè)合適的名字。
相同的name會(huì)返回同一個(gè)logger對(duì)象。
在Formatter方法中用%(name)s在日志中打印出這個(gè)name。
例如:
log = logging.getLogger('mylog') log_format = logging.Formatter( 'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s') #打印結(jié)果示例: #Aug 2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message
handler
將日志記錄發(fā)送到目的地,如文件,socket等。
這里可以通過(guò)addHandler方法添加多個(gè)handler,可以實(shí)現(xiàn)日志的分級(jí)過(guò)濾。
如果要把日志發(fā)送到rsyslog中,就可以采用SysLogHandler(),使用這個(gè)方法前需要導(dǎo)入他
from logging.handlers import SysLogHandler
這個(gè)方法有兩個(gè)參數(shù)、一個(gè)是rsyslog中的facility:指定的是發(fā)送的設(shè)備,如kernel,mail,system等等,他還有l(wèi)ocal0-local7預(yù)留。
這里我采用local5。
還有一個(gè)參數(shù)指定的是log程序的地址,在centos7上默認(rèn)是/dev/log。
示例如下:
log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
對(duì)應(yīng)的rsyslog設(shè)置文件(/etc/rsyslog.conf):
local5.* /var/log/all.log #將local5的所有日志存入all.log文件中
如果想用handler對(duì)日志信息進(jìn)行過(guò)濾
可以這樣:
log_hdlr.setLevel(logging.ERROR) #這里就指定了接收error以及更高級(jí)別的日志
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可調(diào)用參數(shù)有:
%(name)s
Logger的名字%(levelname)s
文本形式的日志級(jí)別%(message)s
用戶輸出的消息%(asctime)s
字符串形式的當(dāng)前時(shí)間。默認(rèn)格式是 “2003-07-08 16:49:45,896”。逗號(hào)后面的是毫秒%(levelno)s
數(shù)字形式的日志級(jí)別%(pathname)s
調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒(méi)有%(filename)s
調(diào)用日志輸出函數(shù)的模塊的文件名%(module)s
調(diào)用日志輸出函數(shù)的模塊名%(funcName)s
調(diào)用日志輸出函數(shù)的函數(shù)名%(lineno)d
調(diào)用日志輸出函數(shù)的語(yǔ)句所在的代碼行%(created)f
當(dāng)前時(shí)間,用UNIX標(biāo)準(zhǔn)的表示時(shí)間的浮 點(diǎn)數(shù)表示%(relativeCreated)d
輸出日志信息時(shí)的,自Logger創(chuàng)建以 來(lái)的毫秒數(shù)%(thread)d
線程ID??赡軟](méi)有%(threadName)s
線程名??赡軟](méi)有%(process)d
進(jìn)程ID??赡軟](méi)有
由上面的這些模塊就可以實(shí)現(xiàn)我想要的功能啦
將日志寫(xiě)入到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')#指明級(jí)別為debug log.error('error message test')#指明級(jí)別為error #最后只保存error及更高優(yōu)先級(jí)的日志
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中字典和JSON互轉(zhuǎn)操作實(shí)例
這篇文章主要介紹了Python中字典和JSON互轉(zhuǎn)操作實(shí)例,本文給出了Dict轉(zhuǎn)JSON、讀取JSON并轉(zhuǎn)為Dict示例,需要的朋友可以參考下2015-01-01使用Python實(shí)現(xiàn)tail的示例代碼
tail是一個(gè)常用的Linux命令, 它可以打印文件的后面n行數(shù)據(jù), 也能實(shí)時(shí)輸出文件的追加數(shù)據(jù)。本文就來(lái)用Python實(shí)現(xiàn)tail,感興趣的可以了解一下2023-03-03Pyecharts之特殊圖表的實(shí)現(xiàn)示例
本文主要介紹了Pyecharts之特殊圖表的實(shí)現(xiàn)示例,包括象形圖、水球圖和日歷圖的定制方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01通過(guò)5個(gè)知識(shí)點(diǎn)輕松搞定Python的作用域
網(wǎng)上關(guān)于python的作用域介紹有很多,那么小編今天給大家分享的這篇文章是讓大家通過(guò)學(xué)習(xí)這5個(gè)知識(shí)點(diǎn),可以輕松搞定Python的作用域,有需要的朋友們可以參考借鑒。2016-09-09Python?Pygame實(shí)現(xiàn)可控制的煙花游戲
大家好,本篇文章主要講的是Python?Pygame實(shí)現(xiàn)可控制的煙花游戲,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01python字符串編碼識(shí)別模塊chardet簡(jiǎn)單應(yīng)用
有時(shí)候需要先檢測(cè)一個(gè)文件的編碼,然后將其轉(zhuǎn)化為另一種編碼。這時(shí)候就會(huì)用到chardet(chardet是python的一個(gè)第三方庫(kù),是非常優(yōu)秀的編碼識(shí)別模塊)2015-06-06如何使Python中的print()語(yǔ)句運(yùn)行結(jié)果不換行
這篇文章主要介紹了如何使Python中的print()顯示當(dāng)前語(yǔ)句后不換行,print() 是一個(gè)常用函數(shù),但是每次,print()語(yǔ)句顯示后都會(huì)換行,本問(wèn)我們就來(lái)節(jié)日如何使print()顯示當(dāng)前語(yǔ)句后不換行,需要的朋友可以參考一下2022-03-03