1. Springboot配置logback
因為logback其他配置尚好理解,本文只說明比較少用,但是卻起關鍵作用的兩個子節點。
1、依賴:
實際開發中我們不需要直接添加該依賴,你會發現spring-boot-starter其中包含了 spring-boot-starter-logging,Spring Boot為我們提供了很多默認的日誌配置,所以,只要將spring-boot-starter-logging作為依賴加入到當前應用的classpath,則「開箱即用」。
2、日記的等級
日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL
3、配置
這里對日誌框架的支持有兩種配置方式,一般來講我們倘若不是要較復雜的需求,可以直接在 application.yml 配置文件配置下即可:
application.properties 或 application.yml (系統層面)
參考網站: https://www.cnblogs.com/nuccch/p/6221255.html
logback-spring.xml (自定義文件方式)
參考網站: http://tengj.top/2017/04/05/springboot7/
4、彩色列印
參考: https://my.oschina.net/360yg/blog/1810625
5、@Slf4j註解
安裝lombok插件,在需要列印的類名上加上該註解即可
替代下面語句的編寫
private Loggerlogger = LoggerFactory.getLogger(this.getClass());
6、列印不出json的問題
不是列印不出而是正確的要加一個佔位符 {},如下
log.info("hospital{}", JSON.toJSONString(hospitalEntity2));
7、log存放文件路徑定義
最關鍵的兩個節點,你可以理解之前的property、appender嵌套property只是一些定義好的變數,真正定義方法怎麼去運用這些變數是這兩個節點所要做的。
1、子節點--<root>
root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性,不區分大小寫,默認是DEBUG。
可以包含零個或多個元素,標識這個appender將會添加到這個 loger (理解root為一個全局的loger)。
舉例子:
上圖這是我定義好的文件輸出的appender節點,對應下圖的<appender-ref>節點,ref對應<appender>的name屬性,上面說到<root>節點好比一個方法,所以現在這個方法的意思是全局列印等級為INFO,而且四個<appender>變數都執行,即正常的控制台輸出和warn、info、error的三個文件輸出,可以到對應的控制台和日誌文件裡面看到的確有日誌。反之倘若我們level定為Debug,或者去除name為「WARN」的<appender>則是輸出Debug以上等級的日誌,WARN.log日誌文件也不會再有日誌列印進去。
2、子節點--<loger>
<loger>用來設置某一個包或者具體的某一個類的日誌列印級別、以及指定<appender>,也就是只管轄指定的區域的日誌輸出規則。<loger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
注意:這里說的上級就是root節點
name :用來指定受此loger約束的某一個包或者具體的某一個類。
level :用來設置列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那麼當前loger將會繼承上級的級別。
addtivity :是否向上級loger傳遞列印信息。默認是true。
舉例子:
控制com..controller.LearnController類的日誌列印,列印級別為「WARN」;
additivity屬性為false,表示此loger的列印信息不再向上級傳遞;
指定了名字為「console」的appender;
這時候執行com..controller.LearnController類的login方法時,先執行<logger name="com..controller.LearnController" level="WARN" additivity="false">,
將級別為「WARN」及大於「WARN」的日誌信息交給此loger指定的名為「console」的appender處理,在控制台中打出日誌,不再向上級root傳遞列印信息。
注意:
當然如果你把additivity=」false」改成additivity=」true」的話,就會列印兩次,因為列印信息向上級傳遞,logger本身列印一次,root接到後又列印一次。
四、配合多環境
據不同環境(prod:生產環境,test:測試環境,dev:開發環境)來定義不同的日誌輸出,在 logback-spring.xml中使用 springProfile 節點來定義,方法如下:
文件名稱不是logback.xml,想使用spring擴展profile支持,要以logback-spring.xml命名
可以啟動服務的時候指定 profile (如不指定使用默認),如指定prod 的方式為:
java -jar xxx.jar –spring.profiles.active=prod
關於多環境配置可以參考
Spring Boot干貨系列:(二)配置文件解析
2. log4net配置文件解析
<log net>
<root>
<level value= ALL />
<appender ref ref= rollingFile />
</root>
<appender name= rollingFile type= log net Appender RollingFileAppender log net >
<param name= File value= log txt />
<param name= AppendToFile value= false />
<param name= RollingStyle value= Date />
<param name= DatePattern value= yyyy MM dd />
<param name= StaticLogFileName value= true />
<layout type= log net Layout PatternLayout log net >
<param name= ConversionPattern value= %d [%t] % p %c %m%n />
<param name= Header value= header />
<param name= Footer value= footer />
</layout>
</appender>
<appender name= consoleApp type= log net Appender ConsoleAppender log net >
<layout type= log net Layout PatternLayout log net >
<param name= ConversionPattern value= %d [%t] % p %c %m%n />
</layout>
</appender>
<logger name= Log NetTest LogTest >
<level value= DEBUG />
<appender ref ref= rollingFile />
<appender ref ref= coloredConsoleApp />
<appender ref ref= SystemEvent />
</logger>
</log net>
log net配置節的XSD層次如下
<log net>
<root><level /><appender ref ref= /></root>
<appender name= type= Appender的完全限定類名 >
<param name= value= />
<layout type= log net Layout PatternLayout log net >
<param name= value= />
</layout>
</appender>
<logger>
<level value= />
<appender ref ref= />
</logger>
log net是log net配置節的根標記
root標記定義一個根級別的記錄者 log net的記錄者採用層級組織的 每一個LOGGER(ROOT也是一個LOGGER 只不過 他是祖先而已 別的方面 跟其他LOGGER一樣) 都可以定義Level
level定義記錄的日誌級別 就是說 你要記錄哪個級別以上的日誌 級別由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL
級別的定義要注意 如果你定義DEBUG 那麼低於DEBUG級別以下的信息 將不會記入日誌 啥意思呢?就是說 就算你在程序里 用()來寫入一個日誌信息 可是你在配置中指定level為DEBUG 由於INFO級別低於DEBUG 所以 不會被記入日誌 這樣的處理非常靈活
Logger還有一個配置就是appender ref了 ref是參照的意思 log net的架構非常有意思 可擴展性非常高非常值得借鑒 他分為四個要素:
logger
appender
layout
filter
logger是負責日誌的記錄者
appender提供記錄的介質
layout負責把記入的內容格式化
filter負責把內容進行篩選
可以說 整個過程就是一個日誌流水線 每個成員負責其中的一個環節
logger發出記錄信息 appender接到信息 根據內部的layout配置對記錄信息格式化 根據filter決定此信息是否被過濾掉 最後 將其序列化
因此 logger的appender ref就是定義說 LOGGER要找誰去將內容寫入磁碟 流或其他介質 因此 十分重要吧
既然是ref引用 那肯定要定義這個被引用的appender對象了呀
每個appender都代表了一個輸出介質
name屬性指定其名稱 type則是log net Appender命名空間的一個類的名稱 意思是 指定使用哪種介質
log net支持的appender類型有十幾種 最常用的有rollingFileAppender AdoNetAppender EventLogAppender FileAppender 分別把日誌記入文件 系統日誌和資料庫
除此之外 appender內的其他參數都用param標記 以key/value形式定義於其內
這里有個小提示 每一個appender log net並沒有在文檔中提出他們需要哪些參數 那麼 我們怎麼知道呢?
原來 這些param的名稱 你可以直接查對應的appender類的屬性名即可 例如 使用EventLogAppender時 通過查看類的屬性 我們知道其有
LogName ApplicationName屬性 那麼 意味著 你可以直接在這個APPENDER的param里加入以下內容:
<param name= LogName value= Application />
<param name= ApplicationName value= log netTest />
定義了appender的NAME及TYPE屬性 以及使用param為其指定參數後 一個appender就建立了 你可以使用他的名字在LOGGER的<appender ref中去 引用它 那麼 引用它的LOGGER在寫入日誌時 就是寫到了APPENDER中定義的介質中去了
一個LOGGER可以引用多個APPENDER 其結果是 同一個日誌 被同時記錄到多個介質中去 便如 同時發郵件 寫入系統日誌 發送到遠程主機 不過 雖然可以這樣做 但是還是要小心 因為 會對性能有一定的影響 除非你需要 否則 不要亂用此功能
另外 appender中可以定義可選的layout
layout的定義非常有必要 如果你不想將來看到你的日誌會感覺頭暈的話 雖然log net幫你寫入日誌 但是 日誌信息的格式卻是我們使用者自行定義的layout的type參數指定使用哪個類的定義來格式化 常用的有XmlLayout SimpleLayout PatternLayout 這個當然要根據你的需要 以及你要產生的格式來選啦 如果你要輸出成XML文檔格式 你肯定不能用simplelayout吧
layout使用param以KEY/VALUE形式定義其參數
各個Layout類使用的參數當然不一樣啦 具體的 你可以去看各個Layout類的屬性
其中 PatternLayout可以使用ConversionPattern參數來指定一個格式化字元串
以及可以指定一個Header參數 做為日誌開頭的字元串 Footer來指定結尾字元串
這里有一個小技巧 日誌中開頭和結尾總想產生回車符吧 雖然logger在寫入一條日誌會自動回車 可是Header和FOOTER卻不會 咋辦?用 嗎?(我從別人的BLOG上看到過)經實踐 會原樣定改日誌 根本不會轉換 其實 我們可以用XML實體呀 使用&# ;&# ;就可以在指定位置插入一個回車換行符了
最後 像log net的文檔中說的那樣 如果你不想你的日誌文件變得很大 使讀寫的性能下降的話 建議你還是分級管理日誌 把粒度變小點 也就是說 除了定義ROOT外 最後 對每一個模塊或每一個實體 依據用途 目的 定義各自的LOGGER配置 這樣的好處是日誌被分散了 日誌文件增長就沒那麼快了 每一個LOGGER的結構跟ROOT是一模一樣的 這里不再敘述了 像前面說的那樣 如果你相讓日誌產生層級關系 你可以跟他們的NAME屬性像C#中的namespace那樣命名就可以了
要說明的是 LOGGER的定義是非必須的 只是一種建議罷了 Log net的配置中 除了必須定義一個ROOT和一個APPENDER外 其他的都是可選的
lishixin/Article/program/net/201311/11448
3. 【日誌】Log4j2配置
在同步日誌模式下, Logback的性能是最糟糕的,log4j2的性能無論在同步日誌模式還是非同步日誌模式下都是最佳的。本章主要介紹Spring Boot如何集成並配置使用Log4j2
引入Log4j2依賴包,其它依賴和Logback一樣,使用SLF4J統一輸出
然後需要在resource下面添加log4j2.xml配置文件,當然了如果你不添加,springboo會提示你沒有對應文件,並使用默認的配置文件,這個時候級別可以在application.properties中配置
和logback配置類似,主要是含有loggers、appenders,其中loggers由logger,root組成。appenders由console(控制台),File、RollingFile(輸出文件)組成,作用和配置和logback差不多
(1)Console
用來定義輸出到控制台的Appender,主要設置輸出格式和level級別
ThresholdFilter: 定義列印級別,onMismatch值設置是否拒絕其它
(2)File
用來定義輸出到指定位置的文件的Appender
(3)RollingFile
用來定義超過指定條件自動刪除舊的,創建新的Appender
參數說明:
Root節點用來指定項目的根日誌,如果沒有單獨指定Logger,那麼就會默認使用該Root日誌輸出
參數說明:
變數配置,類似常量定義
默認情況下springboot是不將日誌輸出到日誌文件中,這里對日誌框架的支持有兩種配置方式(和logback一樣):
(1)application.properties 或 application.yml (系統層面)
(2)logback-spring.xml (自定義文件方式)
默認名log4j2-spring.xml,可以省下在application.yml中配置,如果自定義了文件名,需要在application.yml中配置
此種方式可以處理比較復雜的情況,比如區分 info 和 error 日誌、每天產生一個日誌文件。
通過在DefaultRolloverStrategy 標簽下添加Delete標簽實現,保留7天的日誌
IfLastModified .age要和filePattern精確的時間一致, 否則貌似無效.
4. log4j.logger寫入哪個配置文件
有沒有想過為什麼我們用:
Logger logger = Logger.getLogger(ABC.class) ;
來得到 logger?
不想只看人家的 demo, demo 畢竟是 Hello World 級別的簡單入門樣例,我們需要知道 API 是如何描述它們的。
Logger.getLogger() 除非用類當參數外還有用字元串當參數的,意思就是說「你可以給你的 Logger 取任意的名字,不是非要使用類名」。
上面這句話是說你可以在log4j.properties 裡面配置:
Log4j.appender.FileAppenderA.file = a.log
...
Log4j.appender.FileAppenderB.file = a.log
...
Log4j.appender.FileAppenderB.file = a.log
...
Log4j.logger.MyABC1Logger = FileAppenderA
Log4j.logger.MyABC2Logger = FileAppenderB
Log4j.logger.MyABC3Logger = info,FileAppenderA,FileAppenderB,FileAppenderC
代碼中一個類可以得到多個 logger,然後你想使用哪個就是隨你的便了。
Logger loggerA = Logger.getLoger("MyABC1Logger ");
Logger loggerB = Logger.getLoger("MyABC2Logger ");
Logger loggerC = Logger.getLoger("MyABC3Logger ");
如果你選擇了 logger C 的話,一次寫入消息會同時出現在 3 個 appender 對應的日誌文件中。
5. logger能不能使用代碼獲得配置文件中的路徑
一個完整的配置文件的例子如下所示,這個是」在C#代碼中應用Log4Net(二)」中使用的配置文件。
<log4net>
<!-- 錯誤日誌類-->
<logger name="logerror">
<level value="ALL" />
<appender-ref ref="ErrorAppender" />
</logger>
<!-- 信息日誌類 -->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<!-- 錯誤日誌附加介質-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogError\\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".htm"" />
<param name="RollingStyle" value="Date" />
<!--布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=red>%n異常時間:%d [%t] <BR>%n異常級別:%-5p <BR>%n異 常 類:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
<!-- 信息日誌附加介質-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".htm"" />
<param name="RollingStyle" value="Date" />
<!-- 信息日誌布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=blue>%n日誌時間:%d [%t] <BR>%n日誌級別:%-5p <BR>%n日 志 類:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
</log4net>
6. Spring Boot Logging 配置
Spring Boot 能夠使用Logback, Log4J2 , java util logging 作為日誌記錄工具。Spring Boot 默認使用Logback作為日誌記錄工具。日誌默認輸出到控制台但也能輸出到文件中。我們通過spring-boot-starter-logging 加入Logback依賴,其實只要我們加入任意的Spring Boot starter 都會默認引入spring-boot-starter-logging,因此 我們不需要分開加入他們。
logging.level.* : 作為package(包)的前綴來設置日誌級別。
logging.file : 配置日誌輸出的文件名,也可以配置文件名的絕對路徑。
logging.path : 配置日誌的路徑。如果沒有配置 logging.file ,Spring Boot 將默認使用spring.log作為文件名。
logging.pattern.console : 定義console中logging的樣式。
logging.pattern.file : 定義文件中日誌的樣式。
logging.pattern.level : 定義渲染不同級別日誌的格式。默認是%5p.
logging.exception-conversion-word : .定義當日誌發生異常時的轉換字
PID : 定義當前進程的ID
下面將討論在 application.properties , application.ym , Logback XML 中配置Logback以及在Spirng Boot 應用中使用Log4J2.
logging.level設置日誌級別。我們可以使用TARCE , DEBUG , INFO , WARN , ERROR , FATAL , OFF 。可以使用root級別和package級別來控制日誌的輸入級別。創建一個具有以下依賴關系的應用程序。
使用 srcmain esourcesapplication.properties 配置日誌級別
使用 srcmain esourcesapplication.yml
Spring Boot 默認把日誌輸入到console,如果我們要把日誌輸入到文件中,需要配置logging.file 或者logging.path屬性性。logging.file屬性用來定義文件名。他不僅僅可以配置文件名,也可以路徑+文件名。
在這種情況下mylogfile.log將在根目錄中創建。我們也可以為為mylogfile.log分配一個路徑,如concretepage/mylogfile.log。這種情況下我們將在相對根目錄下創建concretepage/mylogfile.log。我們也可以為日誌文件配置絕對路徑。
application.yml 中配置
配置logging.path或者logging.path屬性將日誌輸出到文件夾中。logging.path屬性用來定義日誌文件路徑
在 application.properties 中配置logging.path屬性
將會相對根路徑下創建concretepage/logs/spring.log ,也可以配置絕對路徑
application.yml 配置
通過設置logging.patter.console屬性我們能改變輸出到console的日誌樣式。日誌樣式包括時間,日誌級別,線程名,日誌名以及消息。我們可以按我們的喜好改變日誌樣式。
application.properties
application.yml
改變文件中的日誌樣式我們需要設置logging.pattern.file屬性。首先通過logging.file或logging.path屬性,把日誌記錄到文件中。
通過logging.path屬性將在根目錄下創建concretepage/logs並默認使用spring.log作為文件名。logging.pattern.console是設置console的日誌樣式
application.yml
通過命令行改變日誌的輸出級別
Sping Boot 默認輸出ERROR , WARN , INFO 級別的日誌。我們可以通過命令行使能DEBUG ,TRACE級別的日誌輸出,效果是跟配置文件一樣的。想像我們有一個名為my-app.jar的可執行的JAR包我們可以在啟動應用是使能DEBUG級別日誌輸出。
在application.properties中配置
application.yml
相同的方式使能TRACE級別的日誌
application.properties
application.yml
在應用程序中記錄日誌
創建一個SLF4J的例子,首先獲得org.slf4j.Logger的實例。
在application.properties配置包com.concretepage日誌記錄級別
輸出
使用Logback XML 文件
Sping Boot中默認使用logback, 我們可以在application.properties或者application.yml中設置日誌級別。如果想使用XML配置Logback,我們需要在類路徑下創建logback-spring.xml文件
srcmain
esourceslogback-spring.xml
使用自定義日誌:Log4J2
我們使用任何的starter,默認加入Logback 依賴spring-boot-starter-logging。為了使用Log4J2,我們首先要去除spring-boot-starter-logging並且引入spring-boot-starter-log4j2 依賴
現在我們可以在類路徑下創建並配置log4j2-spring.xml
原文: http://www.concretepage.com/spring-boot/spring-boot-logging-example
7. logger.info(); 什麼意思
logger是用log4j作為日誌輸出組件的,info是日誌的級別。
使用了logger.info後,可以將日誌信息寫入,例登陸成功判斷後,調用logger.info( "2010年12月17日12:20:25 用戶xxx成功登錄"),就能將日誌信息寫入配置的文件中。
設置保存日誌的位置,以日期作為文件名:
public static final Logger logger=Logger.getLogger(Main.class.toString());
StringBuffer logPath=new StringBuffer();
logPath.append("f:\javalogs"); //設置保存路徑
//設置文件名
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
logPath.append("\"+sdf.format(new Date())+".log");
//將輸出handler加入logger
try {
FileHandler fileHandler=new FileHandler(logPath.toString(),true);
logger.addHandler(fileHandler);
}catch (IOException e){
e.printStackTrace();
}
8. 如何動態修改python logging配置文件
配置文件:
#Configuration for log output
#Naiveloafer
#2012-06-04
[loggers]
keys=root,xzs
[handlers]
keys=consoleHandler,fileHandler,rotatingFileHandler
[formatters]
keys=simpleFmt
[logger_root]
level=DEBUG
#handlers=consoleHandler
#handlers=fileHandler
handlers=rotatingFileHandler
[logger_xzs]
level=DEBUG
handlers=rotatingFileHandler
qualname=xzs
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFmt
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFmt
args=("../log/p2pplayer.log", "a")
[handler_rotatingFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simpleFmt
args=("../log/p2pplayer.log", "a", 20*1024*1024, 10)
[formatter_simpleFmt]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s - [%(filename)s:%(lineno)s]
datefmt=
測試代碼:
def log_test02():
import logging
import logging.config
CONF_LOG = "../conf/p2pplayer_logging.conf"
logging.config.fileConfig(CONF_LOG); # 採用配置文件
logger = logging.getLogger("xzs")
logger.debug("Hello xzs")
logger = logging.getLogger()
logger.info("Hello root")
if __name__ == "__main__":
log_test02()
輸出:
2012-06-04 15:28:05,751 - xzs - DEBUG - Hello xzs - [xlog.py:29]
2012-06-04 15:28:05,751 - root - INFO - Hello root - [xlog.py:32]
具體就不詳細說明了,總之是能夠運行的,這個文件配置搞了我兩天時間。
特別是class=XXXX要注意!!!
9. log4j2配置文件詳解(springboot+slf4j+log4j2+yaml+lombok)
log4j2配置文件學習筆記:
說明1:本文主要針對yml配置,其他xml配置或者json配置。
說明2:下面是大致介紹了結構,什麼作用,當然還有其他分類,比如:logger,AsyncLogger | appenders fileAppenders | rollingFile,rollingRandomAccessFile這些不同的分類和裡面具體的參數設置。見官網,官網寫的非常好: log4j2官網
yaml格式可以參考: YAML語法入門
大致配置(比較長,看有注釋的就可以,沒注釋的大致都相同):
備註:關於各種filter的配置參數見: 官網filter介紹
springboot+slf4j+log4j2+yaml中使用:主要是@slf4j(topic="自定義的logger name")。
其實@slf4j註解就是實現:
10. python logging.conf是什麼類型文件
下面的函數用於配置logging模塊,它們位於logging.config模塊中。你可以使用這些函數來配置,也可以在logging或是logging.handlers中聲明它們來配置。
logging.config.dictConfig(config)
從dictionary中獲取logging配置
logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True)
從指定的fname的配置文件中讀取logging配置文件
該函數可以在應用程序中多次調用
logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT)
在指定埠啟動socket server並偵聽新配置
logging.config.stopListening()
關閉先前正在偵聽的server
Configuration file format
被fileConfiguration()所理解的配置文件格式基於configparser功能。配置文件必須包含[loggers], [handlers]和[formatters],它們分別代表日誌文件中定義的每種類型的實體。對這3種實體,後面有一個單獨的section來定義該實體如何配置。
因此,[loggers]節中名為log01的logger,相關的配置文件細節在[logger_log01]節中定義。類似地,[handlers]節中名為
hand01的handler將在[handler_hand01]節中聲明,[formatters]節中的form01將在[formatter_form01]聲明。root logger配置必須在[logger_root]節聲明。
注意:fileConfig() API比dictConfig()舊,並不包含logging某些方面的功能。建議以後盡量使用dictConfig API。
配置文件的例子如下:
[loggers]
keys=root,log02,log03,log04,log05,log06,log07
[handlers]
keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
[formatters]
keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
root logger必須指定一個級別和handlers列表。示例如下:
[logger_root]
level=NOTSET
handlers=hand01
其中level可以是DEBUG, INFO, WARNING, ERROR, CRITICAL or NOTSET之一,僅對root logger來說,NOTSET意味著所有的log message
都會記錄。對非root的logger,強制要求一些額外信息,比如
[logger_parser]
level=DEBUG
handlers=hand01
propagate=1
qualname=compiler.parser
當一個非root的logger中level被配置為NOSET,它將通過上一級的logger來確定當前logger的有效級別。propagete為1表示message必須傳播到上一級logger中,為0表示不傳。qualname表示該logger的層級channel名稱,這就是說,應用程序使用該名稱可以得到該logger對象。
handler類型很多,主要有StreamHandler,FileHandler,NullHandler,SysLogHandler,HTTPHandler等
handler節對應的配置示例如下:
[handler_hand01]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)
class表示該handler在logging包命名空間中的類名,level表示logger的級別,NONSET表示要記錄所有日誌。
formatter表示該handler的formatter的鍵名,假如空白的話,就使用默認值logging._defaultFormatter。假如formatter指定了該名字,必須在對應的section聲明。args欄位是handler類的構造函數的變數列表,參考相關handler構造函數,或者下面的例子,去觀察通常的元素是如何構造的。比如:
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form02
args=('python.log', 'w')
下面是formatter的配置
[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter
format欄位是全局格式字元串,datefmt是strftime()兼容的date/time格式字元串,為空時使用默認的ISO8601格式,比如2003-01-23 00:29:50,411,class欄位表示formatter的類名,
日誌級別如下:
Level Numeric value
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0
logging.handlers解讀
logging模塊中定義了這3個handler:StreamHandler, FileHandler and NullHandler
其它的handler都在logging.handler中定義,一並說明如下:
StreamHandler
該類位於logging包,將logging output輸出到流中,比如sys.stdout,sys.stderr或任何支持write()和flush()方法的類文件對象
class logging.StreamHandler(stream=None)
假如指定了stream名稱,日誌將輸出到流實例中,否則,日誌輸出到sys.stderr
FileHandler
該類位於logging包,將logging output輸出到磁碟文件中,文件默認無限增長
class logging.FileHandler(filename, mode='a', encoding=None, delay=False)
打開指定的文件並記錄日誌,假如mode沒有設置,默認使用'a'表示追加日誌到文件中。
NullHandler
該對象什麼也不處理
WatchedFileHandler
一個FileHandler實例,監視日誌文件的變化,假如文件變化了,它會關閉並重新打開,不建議在Windows下使用
文件的變化可以發生,當應用程序使用newsyslog和logrotate來實現日誌文件的回滾時。這個handle是在Unix/Linux下面,監視文件是否改變。(一個文件認為改變了,假如它的device厚實inode已經改變),將舊的文件關閉,這個流打開。
class logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]])
指定的文件被打開,用來記錄日誌,假如mode未指示,默認使用a
RotatingFileHandler
支持磁碟文件的回滾
class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
你可以使用 maxBytes和backupCount值去讓日誌文件在預設大小時回滾。只要日誌文件在長度上接近maxBytes時,就會關閉舊日誌文件,打開一個新的日誌文件,實現回滾。假如maxBytes或backupCount為0,回滾不會發生。假如backupCount非零,系統會備份舊文件,文件名後加『.1』, 『.2』 。比如,日誌文件名為app.log,backupCount為5,將會得到app.log, app.log.1, app.log.2, 直到app.log.5這6個文件。寫入日誌的文件總是app.log,當這個文件填滿時,就關閉它並重命名為app.log.1, 假如還存在app.log.1, app.log.2等文件,就逐一改名為app.log.2, app.log.3等等。
TimedRotatingFileHandler
支持在指定時間段內回滾日誌
class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)
回滾基於when和interval設置,when指定interval的類型,參見下表,大小寫不敏感,默認按小時回滾
Value Type of interval
'S' Seconds
'M' Minutes
'H' Hours
'D' Days
'W0'-'W6' Weekday (0=Monday)
'midnight' Roll over at midnight
回滾擴展名使用strftime format %Y-%m-%d_%H-%M-%S或其頭部子字元串,當使用基於weekday的回滾時,W0表示周一,……,W6表示周日,interval的值不會用到
backupCount表示備份數,當日誌很多時,新日誌會覆蓋舊日誌,刪除邏輯使用interval值去決定刪除哪些日誌文件
utc為true,表示使用UTC時間,否則使用本地時間
SocketHandler
通過網路套接字輸出日誌,SocketHandler類的基類使用TCP socket
class logging.handlers.SocketHandler(host, port)
向指定地址和埠的遠程主機發送日誌
DatagramHandler
繼承自基類SocketHandler類,使用UDP socket發送日誌message
class logging.handlers.DatagramHandler(host, port)
SysLogHandler
發送日誌到遠程或是本地unix syslog
class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)
NTEventLogHandler
發送日誌消息到本地Windows NT, Windows 2000 or Windows XP event log
class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')
SMTPHandler
通過SMTP將日誌消息發送到email address
MemoryHandler
支持將日誌message緩存到內存中,周期性刷新日誌到target handler
class logging.handlers.BufferingHandler(capacity)
class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None)
HTTPHandler
使用GET或是POST,將日誌message發送到web server
class logging.handlers.HTTPHandler(host, url, method='GET')