本文目錄一覽:
- 1、python處理日誌的包有哪些
- 2、在 python 項目中如何記錄日誌
- 3、怎樣調試 日誌 python 代碼
- 4、python之配置日誌的幾種方式
- 5、Python日誌—Python日誌模塊logging介紹
- 6、python日誌模塊記錄三_日誌命名_日誌輪轉
python處理日誌的包有哪些
#coding:utf-8
#file: FileSplit.py
import os,os.path,time
def FileSplit(sourceFile, targetFolder):
sFile = open(sourceFile, ‘r’)
number = 100000 #每個小文件中保存100000條數據
dataLine = sFile.readline()
tempData = [] #緩存列表
fileNum = 1
if not os.path.isdir(targetFolder): #如果目標目錄不存在,則創建
os.mkdir(targetFolder)
while dataLine: #有數據
for row in range(number):
tempData.append(dataLine) #將一行數據添加到列表中
dataLine = sFile.readline()
if not dataLine :
break
tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + str(fileNum) + “.txt”)
tFile = open(tFilename, ‘a+’) #創建小文件
tFile.writelines(tempData) #將列表保存到文件中
tFile.close()
tempData = [] #清空緩存列表
print(tFilename + ” 創建於: ” + str(time.ctime()))
fileNum += 1 #文件編號
sFile.close()
if __name__ == “__main__” :
FileSplit(“access.log”,”access”)
#coding:utf-8
#file: Map.py
import os,os.path,re
def Map(sourceFile, targetFolder):
sFile = open(sourceFile, ‘r’)
dataLine = sFile.readline()
tempData = {} #緩存列表
if not os.path.isdir(targetFolder): #如果目標目錄不存在,則創建
os.mkdir(targetFolder)
while dataLine: #有數據
p_re = re.compile(r'(GET|POST)\s(.*?)\sHTTP/1.[01]’,re.IGNORECASE) #用正則表達式解析數據
match = p_re.findall(dataLine)
if match:
visitUrl = match[0][1]
if visitUrl in tempData:
tempData[visitUrl] += 1
else:
tempData[visitUrl] = 1
dataLine = sFile.readline() #讀入下一行數據
sFile.close()
tList = []
for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):
tList.append(key + ” ” + str(value) + ‘\n’)
tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + “_map.txt”)
tFile = open(tFilename, ‘a+’) #創建小文件
tFile.writelines(tList) #將列表保存到文件中
tFile.close()
if __name__ == “__main__” :
Map(“access\\access.log1.txt”,”access”)
Map(“access\\access.log2.txt”,”access”)
Map(“access\\access.log3.txt”,”access”)
#coding:utf-8
#file: Reduce.py
import os,os.path,re
def Reduce(sourceFolder, targetFile):
tempData = {} #緩存列表
p_re = re.compile(r'(.*?)(\d{1,}$)’,re.IGNORECASE) #用正則表達式解析數據
for root,dirs,files in os.walk(sourceFolder):
for fil in files:
if fil.endswith(‘_map.txt’): #是reduce文件
sFile = open(os.path.abspath(os.path.join(root,fil)), ‘r’)
dataLine = sFile.readline()
while dataLine: #有數據
subdata = p_re.findall(dataLine) #用空格分割數據
#print(subdata[0][0],” “,subdata[0][1])
if subdata[0][0] in tempData:
tempData[subdata[0][0]] += int(subdata[0][1])
else:
tempData[subdata[0][0]] = int(subdata[0][1])
dataLine = sFile.readline() #讀入下一行數據
sFile.close()
tList = []
for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):
tList.append(key + ” ” + str(value) + ‘\n’)
tFilename = os.path.join(sourceFolder,targetFile + “_reduce.txt”)
tFile = open(tFilename, ‘a+’) #創建小文件
tFile.writelines(tList) #將列表保存到文件中
tFile.close()
if __name__ == “__main__” :
Reduce(“access”,”access”)
在 python 項目中如何記錄日誌
寫本文的目的是我在寫 python 項目的時候需要記錄日誌,我忘記怎麼處理了,每次都需要去網上查一遍, 好記性不如爛筆頭 , 這裡把查閱的內容記錄下來,方便以後查找。
python 項目中記錄日誌,可以使用 logging 模塊,logging 模塊定義的函數和類為應用程序和庫的開發實現了一個靈活的事件日誌系統。logging 模塊是Python的一個標準庫模塊,由標準庫模塊提供日誌記錄API的關鍵好處是所有Python模塊都可以使用這個日誌記錄功能。所以,你的應用日誌可以將你自己的日誌信息與來自第三方模塊的信息整合起來。
在 __init__.py 文件中做如下配置:
控制台輸出日誌如下:
參考文檔
怎樣調試 日誌 python 代碼
使用 pdb 進行調試
pdb 是 python 自帶的一個包,為 python 程序提供了一種交互的源代碼調試功能,主要特性包括設置斷點、單步調試、進入函數調試、查看當前代碼、查看棧片段、動態改變變量的值等。pdb 提供了一些常用的調試命令,詳情見表 1。
表 1. pdb 常用命令
命令
解釋
break 或 b 設置斷點
設置斷點
continue 或 c
繼續執行程序
list 或 l
查看當前行的代碼段
step 或 s
進入函數
return 或 r
執行代碼直到從當前函數返回
exit 或 q
中止並退出
next 或 n
執行下一行
pp
打印變量的值
help
幫助
下面結合具體的實例講述如何使用 pdb 進行調試。
清單 1. 測試代碼示例
import pdb
a = “aaa”
pdb.set_trace()
b = “bbb”
c = “ccc”
final = a + b + c
print final
開始調試:直接運行腳本,會停留在 pdb.set_trace() 處,選擇 n+enter 可以執行當前的 statement。在第一次按下了 n+enter 之後可以直接按 enter 表示重複執行上一條 debug 命令。
清單 2. 利用 pdb 調試
[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
– b = “bbb”
(Pdb) n
/root/epdb1.py(5)?()
– c = “ccc”
(Pdb)
/root/epdb1.py(6)?()
– final = a + b + c
(Pdb) list
1 import pdb
2 a = “aaa”
3 pdb.set_trace()
4 b = “bbb”
5 c = “ccc”
6 – final = a + b + c
7 print final
[EOF]
(Pdb)
[EOF]
(Pdb) n
/root/epdb1.py(7)?()
– print final
(Pdb)
退出 debug:使用 quit 或者 q 可以退出當前的 debug,但是 quit 會以一種非常粗魯的方式退出程序,其結果是直接 crash。
清單 3. 退出 debug
[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
– b = “bbb”
(Pdb) n
/root/epdb1.py(5)?()
– c = “ccc”
(Pdb) q
Traceback (most recent call last):
File “epdb1.py”, line 5, in ?
c = “ccc”
File “epdb1.py”, line 5, in ?
c = “ccc”
File “/usr/lib64/python2.4/bdb.py”, line 48, in trace_dispatch
return self.dispatch_line(frame)
File “/usr/lib64/python2.4/bdb.py”, line 67, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit
打印變量的值:如果需要在調試過程中打印變量的值,可以直接使用 p
加上變量名,但是需要注意的是打印僅僅在當前的 statement 已經被執行了之後才能看到具體的值,否則會報 NameError:
exceptions.NameError … …. 錯誤。
清單 4. debug 過程中打印變量
[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
– b = “bbb”
(Pdb) n
/root/epdb1.py(5)?()
– c = “ccc”
(Pdb) p b
‘bbb’
(Pdb)
‘bbb’
(Pdb) n
/root/epdb1.py(6)?()
– final = a + b + c
(Pdb) p c
‘ccc’
(Pdb) p final
*** NameError: exceptions.NameError instance at 0x1551b710
(Pdb) n
/root/epdb1.py(7)?()
– print final
(Pdb) p final
‘aaabbbccc’
(Pdb)
使用 c 可以停止當前的 debug 使程序繼續執行。如果在下面的程序中繼續有 set_statement() 的申明,則又會重新進入到 debug 的狀態,讀者可以在代碼 print final 之前再加上 set_trace() 驗證。
清單 5. 停止 debug 繼續執行程序
[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
– b = “bbb”
(Pdb) n
/root/epdb1.py(5)?()
– c = “ccc”
(Pdb) c
aaabbbccc
顯示代碼:在 debug 的時候不一定能記住當前的代碼塊,如要要查看具體的代碼塊,則可以通過使用 list 或者 l 命令顯示。list 會用箭頭 – 指向當前 debug 的語句。
清單 6. debug 過程中顯示代碼
[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
– b = “bbb”
(Pdb) list
1 import pdb
2 a = “aaa”
3 pdb.set_trace()
4 – b = “bbb”
5 c = “ccc”
6 final = a + b + c
7 pdb.set_trace()
8 print final
[EOF]
(Pdb) c
/root/epdb1.py(8)?()
– print final
(Pdb) list
3 pdb.set_trace()
4 b = “bbb”
5 c = “ccc”
6 final = a + b + c
7 pdb.set_trace()
8 – print final
[EOF]
(Pdb)
在使用函數的情況下進行 debug
清單 7. 使用函數的例子
import pdb
def combine(s1,s2): # define subroutine combine, which…
s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, …
s3 = ‘”‘ + s3 +'”‘ # encloses it in double quotes,…
return s3 # and returns it.
a = “aaa”
pdb.set_trace()
b = “bbb”
c = “ccc”
final = combine(a,b)
print final
如果直接使用 n 進行 debug 則到 final=combine(a,b)
這句的時候會將其當做普通的賦值語句處理,進入到 print final。如果想要對函數進行 debug 如何處理呢 ? 可以直接使用 s
進入函數塊。函數裏面的單步調試與上面的介紹類似。如果不想在函數里單步調試可以在斷點處直接按 r 退出到調用的地方。
清單 8. 對函數進行 debug
[root@rcc-pok-idg-2255 ~]# python epdb2.py
/root/epdb2.py(10)?()
– b = “bbb”
(Pdb) n
/root/epdb2.py(11)?()
– c = “ccc”
(Pdb) n
/root/epdb2.py(12)?()
– final = combine(a,b)
(Pdb) s
–Call–
/root/epdb2.py(3)combine()
– def combine(s1,s2): # define subroutine combine, which…
(Pdb) n
/root/epdb2.py(4)combine()
– s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, …
(Pdb) list
1 import pdb
2
3 def combine(s1,s2): # define subroutine combine, which…
4 – s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, …
5 s3 = ‘”‘ + s3 +'”‘ # encloses it in double quotes,…
6 return s3 # and returns it.
7
8 a = “aaa”
9 pdb.set_trace()
10 b = “bbb”
11 c = “ccc”
(Pdb) n
/root/epdb2.py(5)combine()
– s3 = ‘”‘ + s3 +'”‘ # encloses it in double quotes,…
(Pdb) n
/root/epdb2.py(6)combine()
– return s3 # and returns it.
(Pdb) n
–Return–
/root/epdb2.py(6)combine()-‘”aaabbbaaa”‘
– return s3 # and returns it.
(Pdb) n
/root/epdb2.py(13)?()
– print final
(Pdb)
在調試的時候動態改變值 。在調試的時候可以動態改變變量的值,具體如下實例。需要注意的是下面有個錯誤,原因是 b 已經被賦值了,如果想重新改變 b 的賦值,則應該使用! B。
清單 9. 在調試的時候動態改變值
[root@rcc-pok-idg-2255 ~]# python epdb2.py
/root/epdb2.py(10)?()
– b = “bbb”
(Pdb) var = “1234”
(Pdb) b = “avfe”
*** The specified object ‘= “avfe”‘ is not a function
or was not found along sys.path.
(Pdb) !b=”afdfd”
(Pdb)
pdb
調試有個明顯的缺陷就是對於多線程,遠程調試等支持得不夠好,同時沒有較為直觀的界面顯示,不太適合大型的 python 項目。而在較大的
python 項目中,這些調試需求比較常見,因此需要使用更為高級的調試工具。接下來將介紹 PyCharm IDE 的調試方法 .
python之配置日誌的幾種方式
1)使用Python代碼顯式的創建loggers, handlers和formatters並分別調用它們的配置函數;
2)創建一個日誌配置文件,然後使用fileConfig()函數來讀取該文件的內容;
3)創建一個包含配置信息的dict,然後把它傳遞個dictConfig()函數;
Python日誌—Python日誌模塊logging介紹
從事與軟件相關工作的人,應該都聽過「日誌」一詞。
日誌就是跟蹤軟件運行時事件的方法,為了能夠在程序運行過程中記錄錯誤。
通過日誌記錄程序的運行,方便我們查詢信息,以便追蹤問題、進行維護和調試、還是數據分析。
並且各編程語言都形成了各自的日誌體系和相應的框架。
日誌的作用總結:
首先我們要樹立一個觀點,那就是「不是為了記錄日誌而記錄日誌,日誌也不是隨意記的」。要實現能夠只通過日誌文件還原整個程序執行的過程,達到能透明地看到程序里執行情況,每個線程每個過程到底執行結果的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節。
在項目中,日誌這個功能非常重要,我們要重視起來。
在Python中,使用logging模塊來進行日誌的處理。
logging是Python的內置模塊,主要用於將日誌信息進行格式化內容輸出,可將格式化內容輸出到文件,也可輸出到屏幕。
我們在開發過程中,常用print()函數來進行調試,但是在實際應用的部署時,我們要將日誌信息輸出到文件中,方便後續查找以及備份。
在我們使用日誌管理時,我們也可以將日誌格式化成Json對象轉存到ELK中方便圖形化查看及管理。
logging模塊將日誌系統從高向低依次定義了四個類,分別是logger(日誌器)、handler(處理器)、filter(過濾器)和formatter(格式器)。其中由日誌器生成的實例將接管原本日誌記錄函數logging.log的功能。
說明:
我們先來思考下下面的兩個問題:
在軟件開發階段或部署開發環境時,為了儘可能詳細的查看應用程序的運行狀態來保證上線後的穩定性,我們可能需要把該應用程序所有的運行日誌全部記錄下來進行分析,這是非常耗費機器性能的。
當應用程序正式發佈或在生產環境部署應用程序時,我們通常只需要記錄應用程序的異常信息、錯誤信息等,這樣既可以減小服務器的I/O壓力,也可以避免我們在排查故障時被淹沒在日誌的海洋里。
那麼怎樣才能在不改動應用程序代碼的情況下,根據事件的重要性或者稱之為等級,實現在不同的環境中,記錄不同詳細程度的日誌呢?
這就是日誌等級的作用了,我們通過配置文件指定我們需要的日誌等級就可以了。
說明:
總結:
開發應用程序時或部署開發環境時,可以使用DEBUG或INFO級別的日誌獲取儘可能詳細的日誌信息,可以方便進行開發或部署調試。 應用上線或部署生產環境時,應用使用WARNING或ERROR或CRITICAL級別的日誌,來降低機器的I/O壓力和提高獲取錯誤日誌信息的效率。 日誌級別的指定通常都是在應用程序的配置文件中進行指定的。 不同的應用程序所定義的日誌等級會有所差別,根據實際需求來決定。
python日誌模塊記錄三_日誌命名_日誌輪轉
在日誌記錄中,我們往往要能看到是什麼哪裡出錯了。可以通過日誌名字記錄哪裡出錯了。而日誌也需要輪轉,一個日誌文件不能無限大,也需要備份。所以有了通過日誌名的靈活配置,和通過設置handler文件輸出調用 logging.handlers.RotatingFileHandler 方法來實現輪轉和備份。
my_logging文件如下配置
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/227674.html