⑴ python編寫一個程序 可以讀取郵件日誌(mbox.txt),統計每個郵件發出的郵件數量,並輸出結果。
由於工作需要在一大堆日誌裡面提取相應的一些固定字元,如果單純靠手工取提取,數據量大,勞心勞力,於是自然而然想到了用Python做一個對應的提取工具,代替手工提取的繁雜,涉及中文字元,正則表達式不好匹配,但不是不可以實現,這個以後優化時再說。
需求描述:
一個父目錄中存在多個子文件夾,子文件夾下有多個txt形式化的Log日誌,要求從所有地方Log日誌中找出CardType=9, CardNo=0時的CardID的值,並將其統計存儲到一個文本文件中,要求CardID不能夠重復。
需求解析:
首先獲取所有的Log日誌的全路徑,根據路徑分別載入到將各個Log日誌載入到內存中進行提取分析,並將結果存儲到給定的文本文件中。
解決方案:
為了盡可能的簡潔通用,這里使用配置文件作為輸入變數的依據。不多說,上代碼:
配置文件如下:
心得體會:
1、利用Python去處理一些日常的小任務,可以很方便的完成,相比較C/C++來說,這方面生產力高了不少。
2、本文設計對中文字元的處理,所以使用正則表達式不太怎麼方便,但不少不可以,後續版本中會添加對正則的支持!
3、由於初學中,所以代碼寫的不夠精煉簡潔,後續進行再優化!
⑵ python 讀取日誌文件
#-*-coding:utf-8-*-
withopen('log.txt','r')asf:
foriinf:
ifdt.strftime(dt.now(),'%Y-%m-%d')ini:
#判斷是否當天時間
if'ERROR'iniand'atcom.mytijian'ini:
#判斷此行中是否含有'ERROR'及'atcom.mytijian'
if((dt.now()-dt.strptime(i.split(',')[0],'%Y-%m-%d%H:%M:%S')).seconds)<45*60:
#判斷時間是為當前45分鍾內
printi
⑶ python中log info 是什麼文件
a. 利用sys.stdout將print行導向到你定義的日誌文件中,例如:
import sys# make a of original stdout routestdout_backup = sys.stdout# define the log file that receives your log infolog_file = open("message.log", "w")# redirect print output to log filesys.stdout = log_fileprint "Now all print info will be written to message.log"# any command line that you will execute...
log_file.close()# restore the output to initial patternsys.stdout = stdout_backupprint "Now this will be presented on screen"
b. 利用logging模塊(規范化日誌輸出,推薦!!)
由於logging模塊的功能比較多,下面就放一些文檔里介紹的簡單的例子,更詳細具體的用法請戳這里
需求
最好的實現方式
故障調查或者狀態監測 logging.info()或logging.debug()(後者常用於針對性檢測診斷的目的)
特定運行事件發出警告 logging.warning()
報告錯誤抑制不出發異常(常見於長時間運行的伺服器進程的錯誤處理程序) logging.error(), logging.exception()或者logging.critical()
而以下是根據事件的嚴重性程度而應採取的logging函數的建議:
程度
使用場景
DEBUG 獲得診斷問題是具體的信息
INFO 確認程序是否按正常工作
WARNING 在程序還正常運行時獲取發生的意外的信息,這可能會在之後引發異常(例如磁碟空間不足)
ERROR 獲取程序某些功能無法正常調用這類嚴重異常的信息
CRITICAL 獲取程序無法繼續運行的這類最嚴重異常信息
默認的等級是WARNING,也就是說logging函數在沒有特別配置的前提下只追蹤比WARNING程度更嚴重的異常。
下面就用一些例子來具體說明如何用logging函數記錄日誌信息:
# this is a simple exampleimport logging# define the log file, file mode and logging levellogging.basicConfig(filename='example.log', filemode="w", level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
查看example.log文件可以看到以下信息:
DEBUG:root:This message should go to the log fileINFO:root:So should thisWARNING:root:And this, too
從多個文件記錄日誌
# myapp.pyimport loggingimport mylibdef main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')if __name__ == '__main__':
main()
# mylib.pyimport loggingdef do_something():
logging.info('Doing something')
輸出的信息為
INFO:root:StartedINFO:root:Doing somethingINFO:root:Finished
改變默認輸出信息的格式
import logging# output format: output time - logging level - log messageslogging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')
logging.warning('This message will appear in python console.')
在python console中直接列印以下輸出:
2016-8-2 2:59:11, 510 - WARNING - This message will appear in python console
logging高級用法
可以通過構建logger或者讀取logging config文件對logging函數進行任意配置。
構建logger法
以上程序結果會輸出到python console中:
讀取配置文件法
其中logging.conf文件格式為:(其實就是將前一種方法的各項配置參數寫到logging.conf文件中)
與前面一樣,上述文件輸出結果為:
⑷ 有幾千個TXT格式的log文件,怎麼用Python批量提取每個log文件固定位置的具體數值,輸出到一個TXT文件
1.將這些TXT文件先合並
2.找到這些具體數值的特徵
3.用正則表達式過濾提取
這陣子正學習python,不介意可以發給我,練著玩
⑸ 如何用python提取log文件中的特定字元串和數字
一般用正則表達式提取
⑹ Loguru:Python 日誌終極解決方案
日誌的作用非常重要,日誌可以記錄用戶的操作、程序的異常,還可以為數據分析提供依據,日誌的存在意義就是為了能夠在程序在運行過程中記錄錯誤,方便維護和調試,能夠快速定位出錯的地方,減少維護成本。每個程序員都應該知道,不是為了記錄日誌而記錄日誌,日誌也不是隨意記的。要實現能夠只通過日誌文件還原整個程序執行的過程,達到能透明地看到程序里執行情況,每個線程、每個過程到底執行到哪的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節!
最常見的是把輸出函數 print() 當作日誌記錄的方式,直接列印各種提示信息,常見於個人練習項目里,通常是懶得單獨配置日誌,而且項目太小不需要日誌信息,不需要上線,不需要持續運行,完整的項目不推薦直接列印日誌信息,現實中也幾乎沒有人這么做。
我們可以在不少小項目裡面看到作者自己寫了一個日誌模板,通常利用 print() 或者 sys.stdout 稍微封裝一下即可實現簡單的日誌輸出,這里的 sys.stdout 是 Python 中的標准輸出流, print() 函數是對 sys.stdout 的高級封裝,當我們在 Python 中列印對象調用 print(obj) 時候,事實上是調用了 sys.stdout.write(obj+'\n') , print() 將內容列印到了控制台,然後追加了一個換行符 \n 。
自寫日誌模板適合比較小的項目,可以按照自己的喜好編寫模板,不需要太多復雜配置,方便快捷,但是這種記錄日誌的方式並不是很規范,有可能你自己覺得閱讀體驗不錯,但是別人在接觸你的項目的時候往往需要花費一定的時間去學習日誌的邏輯、格式、輸出方式等,比較大的項目同樣不推薦這種方法。
一個簡單的自寫日誌模板舉例:
日誌模板 log.py:
調用日誌模塊:
日誌輸出:
在一個完整的項目中,大多數人都會引入專門的日誌記錄庫,而 Python 自帶的標准庫 logging 就是專門為日誌記錄而生的,logging 模塊定義的函數和類為應用程序和庫的開發實現了一個靈活的事件日誌系統。由標准庫模塊提供日誌記錄 API 的關鍵好處是所有 Python 模塊都可以使用這個日誌記錄功能。所以,你的應用日誌可以將你自己的日誌信息與來自第三方模塊的信息整合起來。
logging 模塊雖然強大,但是其配置也是比較繁瑣的,在大型項目中通常需要單獨初始化日誌、配置日誌格式等等,K哥在日常使用中通常都會對 logging 做如下的封裝寫法,使日誌可以按天保存,保留15天的日誌,可以配置是否輸出到控制台和文件,如下所示:
輸出日誌:
它在控制台中是這樣的:
當然,如果你不需要很復雜的功能,希望簡潔一點,僅僅需要在控制台輸出一下日誌的話,也可以只進行簡單的配置:
對於 logging 模塊,即便是簡單的使用,也需要自己定義格式,這里介紹一個更加優雅、高效、簡潔的第三方模塊:loguru,官方的介紹是:Loguru is a library which aims to bring enjoyable logging in Python. Loguru 旨在為 Python 帶來愉快的日誌記錄。這里引用官方的一個 GIF 來快速演示其功能:
Loguru 僅支持 Python 3.5 及以上的版本,使用 pip 安裝即可:
Loguru 的主要概念是只有一個:logger
控制台輸出:
可以看到不需要手動設置,Loguru 會提前配置一些基礎信息,自動輸出時間、日誌級別、模塊名、行號等信息,而且根據等級的不同,還自動設置了不同的顏色,方便觀察,真正做到了開箱即用!
如果想自定義日誌級別,自定義日誌格式,保存日誌到文件該怎麼辦?與 logging 模塊不同,不需要 Handler,不需要 Formatter,只需要一個 add() 函數就可以了,例如我們想把日誌儲存到文件:
我們不需要像 logging 模塊一樣再聲明一個 FileHandler 了,就一行 add() 語句搞定,運行之後會發現目錄下 test.log 裡面同樣出現了剛剛控制台輸出的 debug 信息。
與 add() 語句相反, remove() 語句可以刪除我們添加的配置:
此時控制台會輸出兩條 debug 信息:
而 test.log 日誌文件裡面只有一條 debug 信息,原因就在於我們在第二條 debug 語句之前使用了 remove() 語句。
Loguru 對輸出到文件的配置有非常強大的支持,比如支持輸出到多個文件,分級別分別輸出,過大創建新文件,過久自動刪除等等。 下面我們來詳細看一下 add() 語句的詳細參數:
基本語法:
基本參數釋義:
當且僅當 sink 是協程函數時,以下參數適用:
當且僅當 sink 是文件路徑時,以下參數適用:
這么多參數可以見識到 add() 函數的強大之處,僅僅一個函數就能實現 logging 模塊的諸多功能,接下來介紹幾個比較常用的方法。
add() 函數的 rotation 參數,可以實現按照固定時間創建新的日誌文件,比如設置每天 0 點新創建一個 log 文件:
設置超過 500 MB 新創建一個 log 文件:
設置每隔一個周新創建一個 log 文件:
add() 函數的 retention 參數,可以設置日誌的最長保留時間,比如設置日誌文件最長保留 15 天:
設置日誌文件最多保留 10 個:
也可以是一個 datetime.timedelta 對象,比如設置日誌文件最多保留 5 個小時:
add() 函數的 compression 參數,可以配置日誌文件的壓縮格式,這樣可以更加節省存儲空間,比如設置使用 zip 文件格式保存:
其格式支持: gz 、 bz2 、 xz 、 lzma 、 tar 、 tar.gz 、 tar.bz2 、 tar.xz
Loguru 在輸出 log 的時候還提供了非常友好的字元串格式化功能,相當於 str.format() :
輸出:
在 Loguru 里可以直接使用它提供的裝飾器就可以直接進行異常捕獲,而且得到的日誌是無比詳細的:
日誌輸出:
在控制台的輸出是這樣的:
相比 Logging,Loguru 無論是在配置方面、日誌輸出樣式還是異常追蹤,都遠優於 Logging,使用 Loguru 無疑能提升開發人員效率。本文僅介紹了一些常用的方法,想要詳細了解可參考 Loguru 官方文檔 或關注 Loguru GitHub 。
⑺ python 使用logging,生成的log文件是什麼編碼格式腳本的編碼格式決定系統的編碼格式決定
log的文件當然是byte格式。或者是無格式的。漢字編碼取決於你自己設定的類型。
#coding:utf-8這個東西,只在python2下有效果。還需要編程器配合。你使用python自帶的idle當然是沒有問題的。
log中的漢字是一定要編碼的。不編碼你存貯不了。
編輯器本身的預設編碼格式要與你的源代碼編碼一致,不然看到的就是亂碼。如果是idle,它會根據python腳本自動識別。
不過有些編輯器是有些不智能的。它不能理解python腳本第一行的提示。所以有時候,覺著很別扭自己要手工保持編輯器的編碼與源碼一致。還需要維護那個coding:utf-8
不過python3已將這一句去掉了。源代碼全部要求使用utf-8編碼(也許是utf-16),我很少用python3