Python如何將控制臺(tái)輸出另存為日志文件_第1頁(yè)
Python如何將控制臺(tái)輸出另存為日志文件_第2頁(yè)
Python如何將控制臺(tái)輸出另存為日志文件_第3頁(yè)
Python如何將控制臺(tái)輸出另存為日志文件_第4頁(yè)
Python如何將控制臺(tái)輸出另存為日志文件_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論