




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Python如何將控制臺(tái)輸出另存為日志文件目錄Python將控制臺(tái)輸出另存為日志文件需求方法一:使用Logger類(推薦)方法二:僅使用sys方法三:使用logging模塊Python記錄日志,保存控制臺(tái)輸出總結(jié)
Python將控制臺(tái)輸出另存為日志文件
需求
在PyCharm中或者說(shuō)運(yùn)行python程序時(shí)會(huì)使用print輸出些過(guò)程信息、traceback異常信息到控制臺(tái),但是程序運(yùn)行結(jié)束后記錄就沒(méi)有了,所以想著每次運(yùn)行將信息顯示在控制臺(tái)的同時(shí)記錄到文件中。
方法一:使用Logger類(推薦)
自定義創(chuàng)建Logger類,結(jié)合sys進(jìn)行記錄控制臺(tái)輸出信息
demo.py
importsys
importos
importtime
#控制臺(tái)輸出記錄到文件
classLogger(object):
def__init__(self,file_name="Default.log",stream=sys.stdout):
self.terminal=stream
self.log=open(file_name,"a")
defwrite(self,message):
self.terminal.write(message)
self.log.write(message)
defflush(self):
pass
if__name__=='__main__':
#自定義目錄存放日志文件
log_path='./Logs/'
ifnotos.path.exists(log_path):
os.makedirs(log_path)
#日志文件名按照程序運(yùn)行時(shí)間設(shè)置
log_file_name=log_path+'log-'+time.strftime("%Y%m%d-%H%M%S",time.localtime())+'.log'
#記錄正常的print信息
sys.stdout=Logger(log_file_name)
#記錄traceback異常信息
sys.stderr=Logger(log_file_name)
print(5555)
print(2/0)
./Logs/log-20250103-140231.log
5555
Traceback(mostrecentcalllast):
FileG:\Codes\demo.py,line33,inmodule
print(2/0)
ZeroDivisionError:divisionbyzero
方法二:僅使用sys
將所有輸出全部直接保存到文件中,不再顯示到控制臺(tái)
demo.py
importsys
log_print=open('Defalust.log','w')
sys.stdout=log_print
sys.stderr=log_print
if__name__=='__main__':
print(555)
print(2/0)
Default.log
555
Traceback(mostrecentcalllast):
FileG:\Codes\demo.py,line9,inmodule
print(2/0)
ZeroDivisionError:divisionbyzero
方法三:使用logging模塊
功能更加全面,主要用于輸出運(yùn)行日志、設(shè)置輸出日志的等級(jí)、日志保存路徑等等
必須放到trycatch里面才能保存traceback的錯(cuò)誤的信息,然后不能保存print(如果要保存可以參考方法二,但是這樣控制臺(tái)就沒(méi)有print了)
demo.py
importlogging
importos
importtime
importtraceback
importsys
#創(chuàng)建一個(gè)logger
logger=logging.getLogger(__name__)
#logger的等級(jí)
logger.setLevel(level=logging.INFO)
#創(chuàng)建一個(gè)handler,寫入日志文件
log_path='./Logs/'
ifnotos.path.exists(log_path):
os.makedirs(log_path)
log_file_name=log_path+'log-'+time.strftime("%Y%m%d-%H%M%S",time.localtime())+'.log'
logfile=log_file_name
handler=logging.FileHandler(logfile,mode='a+')
#輸入到日志文件中的日志等級(jí)
handler.setLevel(logging.DEBUG)
#設(shè)置handler中日志記錄格式
formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
handler.setFormatter(formatter)
#將handler添加到logger里面
logger.addHandler(handler)
#將日志輸出到控制臺(tái),默認(rèn)sys.stderr
logger.addHandler(logging.StreamHandler(sys.stdout))
("Startprintlog")
if__name__=='__main__':
try:
print(5555555555)
print(5/0)
exceptExceptionase:
logger.error(str(traceback.format_exc()))
log-20250103-151751.log
2025-01-0315:17:51,597-__main__-INFO-Startprintlog
2025-01-0315:17:51,597-__main__-ERROR-Traceback(mostrecentcalllast):
FileG:\Codes\demo.py,line34,inmodule
print(5/0)
ZeroDivisionError:divisionbyzero
Python記錄日志,保存控制臺(tái)輸出
首先,保存控制臺(tái)的信息不等于保存代碼中的輸出print的內(nèi)容??刂婆_(tái)上的信息不僅僅只有代碼中print的信息,區(qū)分控制臺(tái)重定向和標(biāo)準(zhǔn)輸出重定向。
1.僅保存代碼中print的信息。即重定向標(biāo)準(zhǔn)輸出。
定義日志類:
classLogger(object):
def__init__(self,filename='default.log',stream=sys.stdout):
self.terminal=stream
self.log=open(filename,'a')
defwrite(self,message):
self.terminal.write(message)
self.log.write(message)
self.terminal.flush()#不啟動(dòng)緩沖,實(shí)時(shí)輸出
self.log.flush()
defflush(self):
pass
在main函數(shù)開(kāi)頭啟動(dòng)日志
sys.stdout=Logger('./log.log',sys.stdout)
sys.stderr=Logger('./log.log',sys.stderr)
例子:
importtensorflowastf
importos,sys
os.environ['TF_CPP_MIN_LOG_LEVEL']='3'
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="2"
classLogger(object):
def__init__(self,filename='default.log',stream=sys.stdout):
self.terminal=stream
self.log=open(filename,'a')
defwrite(self,message):
self.terminal.write(message)
self.log.write(message)
self.terminal.flush()#不啟動(dòng)緩沖,實(shí)時(shí)輸出
self.log.flush()
defflush(self):
pass
sys.stdout=Logger('./log.log',sys.stdout)
sys.stderr=Logger('./log.log',sys.stderr)
logit=tf.constant(1)
tf_config=tf.ConfigProto(log_device_placement=True)
sess=tf.Session(config=tf_config)
print(sess.run(logit))
此時(shí)log.log中只有內(nèi)容1,沒(méi)有l(wèi)og_device的信息,因?yàn)槠洳粚儆趕tdout/stderr,盡管控制臺(tái)上有這些信息,
2.保存控制臺(tái)上的所有信息。即控制臺(tái)重定向。
測(cè)試代碼:
#控制臺(tái)重定向
importtensorflowastf
importos,time
os.environ['TF_CPP_MIN_LOG_LEVEL']='3'
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
logit=tf.constant(1)
tf_config=tf.ConfigProto(log_device_placement=True)
sess=tf.Session(config=tf_config)
print(sess.run(logit))
Linux下:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CTRA 07-2024橡膠粉改性瀝青碳減排核算
- T/CHES 118-2023城市河湖污染底泥處理效果評(píng)估技術(shù)導(dǎo)則
- T/CECS 10404-2024綠色建材評(píng)價(jià)耐堿網(wǎng)格布
- T/CACE 0130-2024竹漿短纖維
- 上海市建筑安全知識(shí)a試題及答案
- 上海安全員c3考試題庫(kù)及答案
- 上海安全b證模擬考試題庫(kù)及答案
- 2025年房屋簡(jiǎn)易租賃合同4篇
- T/CEPPEA 5039-2023配電站工程竣工驗(yàn)收規(guī)范
- 講衛(wèi)生不得病教案
- TSGD7002-2023-壓力管道元件型式試驗(yàn)規(guī)則
- 交通運(yùn)輸測(cè)繪成果及檔案管理制度
- 2023年公司財(cái)務(wù)制度大全
- 2023年鐵塔動(dòng)環(huán)監(jiān)控系統(tǒng)統(tǒng)一互聯(lián)B接口技術(shù)規(guī)范培訓(xùn)資料
- 中國(guó)偏頭痛診治指南(第一版)2023解讀
- GB/T 15688-2024動(dòng)植物油脂不溶性雜質(zhì)含量的測(cè)定
- 北京市西城區(qū)2021-2022學(xué)年八年級(jí)下學(xué)期期末道德與法治試題(試題+答案)
- 高中音樂(lè)鑒賞《中國(guó)傳統(tǒng)音樂(lè)》說(shuō)課課件
- 公司面試官選拔認(rèn)證實(shí)施方案
- 食品配方保密協(xié)議
- 建筑施工企業(yè)新員工入職安全教育
評(píng)論
0/150
提交評(píng)論