python學習筆記(二十八)日志模塊

我們在寫程序的時候經常會打一些日志來幫助我們查找問題,這次學習一下logging模塊,在python里面如何操作日志。
介紹一下logging模塊,logging模塊就是python里面用來操作日志的模塊,logging模塊中主要有4個類,分別負責不同的工作:

Logger 記錄器,暴露了應用程序代碼能直接使用的接口;簡單點說就是一個創建一個辦公室,讓人在里頭工作?

Handler 處理器,將(記錄器產生的)日志記錄發送至合適的目的地;這個簡單點說就是辦事的人,你可以指定是讓在控制輸出日志,還是在文件里面打印日志,常用的有4種:?

????????????????StreamHandler 控制臺輸出?

????????????????FileHandler 文件輸出

????????????????下面兩種需要導入

? ? ? ? ? ? ? ? ? ? ? ? handlers
? ? ? ? ? ? ? ? ? ? ? ? from logging import handlers?

? ? ? ? ? ? ? ? ? ? ? ? TimedRotatingFileHandler 按照時間自動分割日志文件?

? ? ? ? ? ? ? ? ? ? ? ? RotatingFileHandler 按照大小自動分割日志文件,一旦達到指定的大小重新生成文件?

? ? ? ? ? ? ? ? ? ? ? ? Filter過濾器,提供了更好的粒度控制,它可以決定輸出哪些日志記錄。(不常用)?

? ? ? ? ? ? ? ? ? ? ? ? Formatter格式化器,指明了最終輸出中日志記錄的布局。指定輸出日志的格式

import logging
from logging import handlers
#只在控制臺打印日志
logging.basicConfig(level=logging.ERROR,#控制臺打印的日志級別format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#日志格式)
logging.debug('debug級別,最低級別,一般開發人員用來打印一些調試信息')
logging.info('info級別,正常輸出信息,一般用來打印一些正常的操作')
logging.warning('waring級別,一般用來打印警信息')
logging.error('error級別,一般用來打印一些錯誤信息')
logging.critical('critical級別,一般用來打印一些致命的錯誤信息')

日志級別 debug < info < warning < error < critical
設置了日志級別之后,會打印該級別以及比該級別高的所有日志,舉個例子,如果日志級別是warning,那么就會打印warning、error、critical,這三個級別的日志,不會打印debug和info級別的,如果是debug,最低級別的日志,那么所有的日志都會打印。
上面的只是在控制臺打印日志,并沒有把日志寫在文件里面,一般我們都會把日志寫在日志文件里面,也很簡單,只需要加個參數指定文件名就行了。

logging.basicConfig(level=logging.ERROR,#控制臺打印的日志級別filename='log.txt',#文件名filemode='a',#模式,有w和a,w就是寫模式,每次都會重新寫日志,覆蓋之前的日志#a是追加模式,默認如果不寫的話,就是追加模式format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#工作中常用的日志格式)
logging.debug('debug級別,最低級別,一般開發人員用來打印一些調試信息')
logging.info('info級別,正常輸出信息,一般用來打印一些正常的操作')
logging.warning('waring級別,一般用來打印警信息')
logging.error('error級別,一般用來打印一些錯誤信息')
logging.critical('critical級別,一般用來打印一些致命的錯誤信息')

加上文件名之后就會發現控制臺不會輸出日志了,日志文件也產生了,那么如何既在控制臺輸出日志,也在文件中寫入呢?

怎么實現呢,就得有個辦公室,里面塞倆人,一個給負責往控制臺輸出日志,一個負責寫文件,你把他倆往辦公室一塞,他倆就能干活了。

import logging
from logging import handlers
logger = logging.getLogger('my_log')
#先創建一個logger對象,相當于這個辦公室,也就是上面說的Logger
logger.setLevel(logging.INFO)#設置日志的總級別
fh = logging.FileHandler('test.log',mode='a',encoding='utf-8')#創建一個文件處理器,也就是把日志寫到文件里頭
fh.setLevel(logging.INFO)#設置文件輸出的級別
sh = logging.StreamHandler()#創建一個控制臺輸出的處理器,這兩個就是上面說的Handler
sh.setLevel(logging.INFO)
#設置控制臺輸出的日志級別,這兩個級別都可以單獨設置,他們倆和logger的級別區別是如果logger設置的級別比里面的handler級別設置的高,那么就以logger的級別為準
th = handlers.TimedRotatingFileHandler('time',when='S',interval=1,backupCount=2)
#指定間隔時間自動生成文件的處理器
#interval是時間間隔,backupCount是備份文件的個數,如果超過這個超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:# S 秒# M 分# H 小時、# D 天、# W 每星期(interval==0時代表星期一)# midnight 每天凌晨
th.setLevel(logging.INFO)
formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#指定日志格式,上面咱們寫了常用的格式,直接指定了就行了,這也就是咱們上面說的Formatter
sh.setFormatter(formater)
fh.setFormatter(formater)
th.setFormatter(formater)
#設置兩個處理器的日志格式logger.addHandler(sh)
logger.addHandler(fh)
logger.addHandler(th)
#把兩個handler加入容器里頭,相當于把工作人員培訓完了,你們可以上班了
logger.debug('debug級別,最低級別,一般開發人員用來打印一些調試信息')
logger.info('info級別,正常輸出信息,一般用來打印一些正常的操作')
logger.warning('waring級別,一般用來打印警信息')
logger.error('error級別,一般用來打印一些錯誤信息')
logger.critical('critical級別,一般用來打印一些致命的錯誤信息')

這樣logger這個日志辦公室已經搞好了,咱們就可以直接用了,運行完發現文件也產生了,控制臺也有日志。如果不設置日志級別的話,默認級別是waring。
下面我們自己封裝一個類來使用logging模塊,方便使用,默認加一些配置

import logging
from logging import handlers
class MyLogger():def __init__(self,file_name,level='info',backCount=5,when='M'):logger = logging.getLogger()  # 先實例化一個logger對象,先創建一個辦公室logger.setLevel(self.get_level(level))  # 設置日志的級別的人cl = logging.StreamHandler()  # 負責往控制臺輸出的人bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8')fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')  #時間  #打印哪個python文件的第幾行  #日志級別  #打印的信息cl.setFormatter(fmt)  # 設置控制臺輸出的日志格式bl.setFormatter(fmt)  # 設置文件里面寫入的日志格式logger.addHandler(cl)logger.addHandler(bl)self.logger = loggerdef get_level(self,str):level = {'debug':logging.DEBUG,'info':logging.INFO,'warn':logging.WARNING,'error':logging.ERROR}str = str.lower()return level.get(str)
if __name__ == '__main__':lw_log = MyLogger('lw.log','debug',when='M')lw_log.logger.warning('哈哈哈')

由于logging模塊用起來實在是費勁,所以牛教授自己封裝了一個日志模塊供大家使用,非常方便,只需要直接pip install nnlog即可

使用例子如下代碼:

import nnlog
log = nnlog.Logger(file_name='my.log',level='debug',when='D',backCount=5,interval=1)
#file_name是日志文件名
#level是日志級別,如果不傳的話默認是debug級別
#when是日志文件多久生成一個,默認是按天,S 秒、M 分、 H 小時、 D 天、 W 每星期
#backCount是備份幾個日志文件,默認保留5天的
#interval是間隔多久生成一個日志文件,默認是1天
log.debug('默認日志級別是debug')
log.info('info級別')
log.warning('waring級別')
log.error('error級別')log2 = nnlog.Logger(file_name='nn.log') #直接傳入文件名也是ok的,其他的就取默認值了
log2.debug('test')

?

轉載于:https://www.cnblogs.com/mululu/p/9121770.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251653.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TransactionScope 的基本原理簡介

C# 的事務編程 1 Db事務 DbConnection 中創建基于當前連接的 DbTransaction 2 使用TransactionScope ,創建環境事務 一旦創建&#xff0c;在這個環境包含的DbConnection 實例 都會根據連接字符串中的 Sqlserver 連接字符串支持&#xff0c;是否自動附加當前環境事務. 連接字符…

Canvas 生成交互動畫

2019獨角獸企業重金招聘Python工程師標準>>> 今天介紹的是一個HTML5交互動畫效果&#xff0c;難以置信。HTML5雖說還有很多東西在改進&#xff0c;但現在所能實現的 效果的程度我想是諸位很難想象得到的&#xff0c;實在是發展得太快了。 查看詳情 轉載于:https://m…

Spark記錄-Scala數據類型

Scala與Java具有相同的數據類型&#xff0c;具有相同的內存占用和精度。以下是提供Scala中可用的所有數據類型的詳細信息的表格&#xff1a; 序號數據類型說明1Byte8位有符號值&#xff0c;范圍從-128至1272Short16位有符號值&#xff0c;范圍從-32768至327673Int32位有符號值&…

二分搜索技術

2019獨角獸企業重金招聘Python工程師標準>>> 分治法的基本思想&#xff1a;將一個規模為n的問題&#xff0c;分解為k個規模較小的子問題&#xff0c;這些子問題互相獨立且與原問題相同。遞歸的解這些子問題&#xff0c;然后將各個子問題的解合并得到原問題的解。 經…

數據庫連接情況查詢

--sp_who 可以指定數據庫名&#xff0c;查詢指定數據庫的連接情況 sp_who go select DB_NAME(database_id) dbname, login_name, t1.session_id, t1.request_id, t2.status, t1.start_time, host_name from sys.dm_exec_requests t1inner join sys.dm_exec_sessions t2 on…

apachacxf項目使用@WebService報錯

首先去除已經導入的包那是因為我們要導入javaee的api,首先點擊最下面這個選擇自己電腦上的路徑然后就會自動導入上面的包,同時在jar庫上也會出現轉載于:https://www.cnblogs.com/fengnan/p/9311949.html

windows下redis 開機自啟動

1&#xff0c;在redis的目錄下執行&#xff08;執行后就作為windows服務了&#xff09;redis-server --service-install redis.windows.conf 2&#xff0c;安裝好后需要手動啟動redisredis-server --service-start 3&#xff0c;停止服務redis-server --service-stop 4&#xf…

Java中的屬性和方法

題目 實體類 測試類 轉載于:https://www.cnblogs.com/maoxiuying/p/9130361.html

《JavaScript》高級程序設計---第3章

3.基本概念 松散類型:所謂松散類型就是可以用來保存任何類型的數據。給未經聲明的變量賦值在嚴格模式下會導致拋出ReferenceError錯誤。Object本質上由一組無序的名值對組成。未經初始化的默認值就會取得undefined值。True和False都不是Boolean值&#xff0c;只是標識符。如果…

2019-06-13 Java學習日記之MySql

數據庫概述&#xff1a; 1、什么是數據庫&#xff0c;數據庫有什么作用&#xff1f; 數據庫就是存儲數據的倉庫&#xff0c;氣本質是一個文件系統&#xff0c;數據按照特定的格式將數據存儲起來&#xff0c;用戶可以對數據庫中的數據進行增加&#xff0c;修改&#xff0c;刪除及…

jquery 文件預覽功能

$(function() {$("#pic").click(function () {$("#upload").click(); //隱藏了input:file樣式后&#xff0c;點擊頭像就可以本地上傳$("#upload").on("change",function(){var objUrl getObjectURL(this.files[0]) ; //獲取圖片的路徑…

筆試小結---線程、進程

多進程:進程是資源分配的基本單位&#xff0c;它是程序執行時的一個實例。程序運行時&#xff0c;系統就會創建一個進程&#xff0c;并為它分配資源&#xff0c;然后把該進程放入進程就緒隊列&#xff0c;進程調度器選中它的時候就會為它分配CPU時間&#xff0c;程序開始真正運…

Spring security (一)架構框架-Component、Service、Filter分析

想要深入spring security的authentication &#xff08;身份驗證&#xff09;和access-control&#xff08;訪問權限控制&#xff09;工作流程&#xff0c;必須清楚spring security的主要技術點包括關鍵接口、類以及抽象類如何協同工作進行authentication 和access-control的實…

windows下手動安裝composer

1.下載compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件&#xff0c;寫入“php "%~dp0composer.phar" %*” 3.把composer.bat composer.phar 兩個文件放入 4.向環境變量里面寫人“;D:\phpStudy\php\php-5.4.45;D:\phpStudy\php\php-5…

寫更漂亮的javascript

用更合理的方式寫 JavaScript 目錄 聲明變量對象數組字符串函數箭頭函數模塊迭代器和生成器屬性變量提升比較運算符和等號代碼塊注釋空白逗號分號類型轉換命名規則聲明變量 1.1 使用let和const代替var 不會變的聲明用const//bad var $cat $(.cat)//good const $cat $(.cat)…

筆試小結---樹

平衡二叉樹(Balanced Binary Tree):又被稱為AVL樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1&#xff0c;并且左右兩個子樹都是一棵平衡二叉樹。 二叉搜索樹&#xff1a;是一顆二叉樹&#xff0c;可能為空;若非空,則滿足以下特征: 1.每個元素有一…

iOS 快速實現分頁界面的搭建

級別&#xff1a; ★★☆☆☆ 標簽&#xff1a;「iOS」「分頁」「QiPageMenuView」 作者&#xff1a; 沐靈洛 審校&#xff1a; QiShare團隊 iOS 快速實現分頁界面的搭建 項目中我們經常會遇到滾動分頁的設計效果&#xff0c;被用來對不同數據界面的展示進行分類。我們先可以來…

java中String的常用方法

java中String的常用方法 轉自&#xff1a;http://archer-zhou.iteye.com/blog/443864 java中String的常用方法1、length() 字符串的長度例&#xff1a;char chars[]{a,b.c};String snew String(chars);int lens.length();2、charAt() 截取一個字符例&#xff1a;char ch;ch&quo…

筆試小結---非對稱加密算法

非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey).公開密鑰和私有密鑰是一對,如果公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰進行加密,那么只有用對應的公開密鑰才能解密. 非對稱加密算法的保密性比較好,它消除了最終用戶交換…

登錄令牌 Token 介紹

Token值介紹 token 值: 登錄令牌.利用 token 值來判斷用戶的登錄狀態.類似于 MD5 加密之后的長字符串. 用戶登錄成功之后,在后端(服務器端)會根據用戶信息生成一個唯一的值.這個值就是 token 值. 基本使用: 在服務器端(數據庫)會保存這個 token 值,以后利用這個 token 值來檢索…