日志級別level | 數(shù)值 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 ,默認(rèn)日志級別 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0,表示不設(shè)置 |
日志級別是指產(chǎn)生日志的嚴(yán)重程度
設(shè)置一個級別后,嚴(yán)重程度低于次級別的日志消息將會被忽略
數(shù)字越高,優(yōu)先級別越高成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比西平網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式西平網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋西平地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
#!/usr/bin/python3.6
#conding:utf-8
import threading
import time
import logging
logging.basicConfig(level=logging.INFO) #設(shè)置日志級別為info
def add(x,y):
logging.warning(x+y) # 此處定義的日志級別是warning,因此能夠被打印出來,默認(rèn)的日志打印格式是 級別:用戶:信息
t=threading.Timer(1,add,args=(3,4)) # 此處表示6秒后出結(jié)果
t.start()
結(jié)果如下
默認(rèn)的日志打印格式是級別:用戶:信息
屬性名 | 格式 | 描述 |
---|---|---|
日志消息內(nèi)容 | %(message)s | 當(dāng)調(diào)用formatter.format() 時設(shè)置 |
asctime | %(asctime)s | 創(chuàng)建logrecord時的可讀時間,默認(rèn)格式是Y-m-d H:M:S, (逗號后面的數(shù)字是毫秒部分的時間) |
函數(shù)名 | %(funcName)s | 日志調(diào)用所在的函數(shù)名 |
日志級別名稱 | %(levelname)s | 消息級別名稱,DEBUG,INFO,WARNING,ERROR,CRITICAL |
日志級別數(shù)值 | %(levelno)s | 消息的級別數(shù)字DEBUG,INFO,WARNING,ERROR,CRITICAL |
行號 | %(lineno)d | 日志調(diào)用所在源碼行號 |
模塊 | %(module)s | 模塊(filename的名字部分) |
進(jìn)程ID | %(process)d | 進(jìn)程ID |
線程ID | %(thread)d | 線程ID |
進(jìn)程名稱 | %(processName)s | 進(jìn)程名 |
線程名稱 | %(threadName)s | 線程名字 |
d 格式化成數(shù)字,s格式化成字符串
#!/usr/bin/python3.6
#conding:utf-8
import threading
import time
FORMAT="%(asctime)-15s\tThread Name: %(threadName)s\t%(message)s" # 此處定義日志格式
import logging
logging.basicConfig(level=logging.INFO,format=FORMAT) #設(shè)置日志級別為info,此處format為引用日志格式
def add(x,y):
logging.warning(x+y) # 此處定義的日志級別是warning,因此能夠被打印出來
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()
結(jié)果如下
#!/usr/bin/python3.6
#conding:utf-8
import threading
import time
FORMAT="%(asctime)-15s\tThread Name: %(threadName)s\t%(message)s" # 此處定義日志格式
import logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z') #設(shè)置日志級別為info,此處format為引用日志格式,此處通過定義日志格式來
# 確定打印的日志為正常格式,其和%(asctime)互相作用
def add(x,y):
logging.warning(x+y) # 此處定義的日志級別是warning,因此能夠被打印出來
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()
結(jié)果如下
不同打印風(fēng)格
#!/usr/bin/python3.6
#conding:utf-8
import threading
import time
FORMAT="%(asctime)-15s\tThread Name: %(threadName)s\t%(message)s" # 此處定義日志格式
import logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z') #設(shè)置日志級別為info,此處format為引用日志格式,此處通過定義日志格式來
# 確定打印的日志為正常格式,其和%(asctime)互相作用
def add(x,y):
logging.warning("%d",x+y) # 此處定義的日志級別是warning,因此能夠被打印出來,此處是c風(fēng)格處理日志
logging.info("{} 值為 {}".format(threading.enumerate(),x+y)) # 此處是format方式處理
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()
打印結(jié)果如下
定義一個新的變量來進(jìn)行存儲
#!/usr/bin/python3.6
#conding:utf-8
import threading
import time
FORMAT="%(asctime)s \t threadName: %(threadName)s \t %(message)s \t %(myname1)s" # 此處定義日志格式,此處定義變量名為myname
import logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z') #設(shè)置日志級別為info,此處format為引用日志格式,此處通過定義日志格式來
# 確定打印的日志為正常格式,其和%(asctime)互相作用
d={"myname1":"zhangsan"} #此處定義變量值為zhangsan,是字典格式
def add(x,y):
logging.warning("%d",x+y,extra=d) # 此處定義的日志級別是warning,因此能夠被打印出來,此處是c風(fēng)格處理日志,通過此處引用extra 字典得到結(jié)果
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()
結(jié)果如下
#!/usr/bin/python3.6
#conding:utf-8
import threading
import time
FORMAT="%(asctime)s \t threadName: %(threadName)s \t %(message)s \t %(myname1)s" # 此處定義日志格式,此處定義變量名為myname
import logging
logging.basicConfig(level=logging.INFO,format=FORMAT,datefmt='%y-%m-%d %H:%M:%S %z',filename='/root/test.log') #設(shè)置日志級別為info,此處format為引用日志格式,此處通過定義日志格式來
# 確定打印的日志為正常格式,其和%(asctime)互相作用,此處指定打印的路徑,若不存在,則創(chuàng)建并追加,如此下面便不會再次打印
d={"myname1":"zhangsan"} #此處定義變量值為zhangsan,是字典格式
def add(x,y):
logging.warning("%d",x+y,extra=d) # 此處定義的日志級別是warning,因此能夠被打印出來,此處是c風(fēng)格處理日志,通過此處引用extra 字典得到結(jié)果
t=threading.Thread(target=add,args=(3,4),name='a1')
t.start()
結(jié)果如下
其相當(dāng)于輸出重定向到文件
使用工廠方法返回一個logger實例。
logger.getLogger([name=None)]
指定name,返回一個名稱為name的Logger實例,如果再次使用相同的名字,是實例化一個對象。
未指定name,則返回logger實例,名稱是root。及根Logger
Logger 是層次結(jié)構(gòu)的,使用. 點號分割。如'a',或'a.b'或'a.b.c.d',a是a.b的父parent,a.b是a的子child,對于foo來說,名字為foo.bar,foo.bar.baz,foo.bam都是foo的后代。
#!/usr/bin/python3.6
#conding:utf-8
import logging
log=logging.getLogger()
print (log.name) #打印當(dāng)前實例的名稱,其默認(rèn)名稱為root
print (type(log))# 打印當(dāng)前實例的類型
結(jié)果如下
#!/usr/bin/python3.6
#conding:utf-8
import logging
log=logging.getLogger('a') # 此處定義其名稱,
print (log.name) #打印當(dāng)前實例的名稱
print (log,type(log))# 打印當(dāng)前實例的類型和實例情況
結(jié)果如下
#!/usr/bin/python3.6
#conding:utf-8
import logging
#!/usr/bin/poython3.6
#conding:utf-8
import logging
root=logging.getLogger()
print (root,id(root)) # 此處返回跟和跟地址
log=logging.getLogger('a') # 此處定義其名稱,
print (log.name) #打印當(dāng)前實例的名稱
print (log,type(log),log.parent,id(log),id(log.parent))# 打印當(dāng)前實例的類型和實例情況及其父類情況,此處打印當(dāng)前給情況和父根情況
#
log1=logging.getLogger('a.b')
print (log1.name)
print (log1,type(log1),log1.parent,id(log1.parent))# 此處打印當(dāng)前根父跟情況
結(jié)果如下
上述表明,其a.b的父類是a,a的父類是root ,其直接存在父子級別
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
root.warning('my root')
log=logging.getLogger('a') # 此處定義其名稱,
log.warning('my log')
log1=logging.getLogger('a.b')
log1.warning('my log1')
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
print (root,id(root))
root.warning('my root')
loga=logging.getLogger(__name__) # 此處使用模塊名稱進(jìn)行定義名字
print (loga,id(loga),loga.name)
loga.warning('my loga')# loga.name 也不能在此中打印出來
logb=logging.getLogger("{}.{}".format(__name__,'abcd')) # 此處使用模塊名稱下的具體方法定義名稱,通過format進(jìn)行字符串的拼接
print (logb,id(logb),logb.name)
logb.warning('my logb') # logb.name不能打印出來
結(jié)果如下
獲取和設(shè)置相關(guān)級別
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
print (root,id(root))
print (root.getEffectiveLevel())#此處打印日志級別
loga=logging.getLogger(__name__) # 此處使用模塊名稱進(jìn)行定義名字
loga.warning('my loga')# loga.name 也不能在此中打印出來
print (loga.getEffectiveLevel())#此處打印日志級別
logb=logging.getLogger("{}.{}".format(__name__,'abcd')) # 此處使用模塊名稱下的具體方法定義名稱,通過format進(jìn)行字符串的拼接
logb.warning('my logb') # logb.name不能打印出來
logb.debug('my debug') # 此處的debug日志將不能被打印出來
print (logb.getEffectiveLevel()) #此處打印日志級別
結(jié)果如下
修改日志級別并進(jìn)行配置和獲取
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,datefmt='%Y-%m-%d %H:%M:%S',format=FORMAT)
root=logging.getLogger()
print (root,id(root))
print (root.getEffectiveLevel())#此處打印日志級別
loga=logging.getLogger(__name__) # 此處使用模塊名稱進(jìn)行定義名字
loga.info('my loga')# loga.name 也不能在此中打印出來
print (root.getEffectiveLevel())#此處打印日志級別
print (loga.getEffectiveLevel())#此處打印日志級別
loga.setLevel(28)# 此時日志級別位于INFO 和 WARNING之間,
print (loga.getEffectiveLevel()) # 獲取修改后的日志級別
print ('+'*20,'logb')
logb=logging.getLogger("{}.{}".format(__name__,'abcd')) # 此處使用模塊名稱下的具體方法定義名稱,通過format進(jìn)行字符串的拼接
logb.info('my logb') # 此處因為自身沒有配置日志級別,因此繼承了上面的日志級別,因此,其不能打印
logb.setLevel(10)
logb.info('my logb') # 此處因為自身設(shè)置了日志級別,因此其可以打印
logb.warning('my debug')
print (logb.getEffectiveLevel()) #此處打印日志級別
結(jié)果如下
全局可以設(shè)定,但自己模塊可以根據(jù)自己的情況進(jìn)行調(diào)整和修改
上述用于設(shè)置模塊和模塊對應(yīng)函數(shù)或類的日志級別,通過上述的定義可以確定打印日志的級別和相關(guān)的配置情況
向在模塊級別的進(jìn)行配置和修改日志的級別設(shè)置
想做個性化比較難
重要的主要是level和format 的情況
handler 控制日志信息的輸出目的地,可以是控制臺,文件
可以單獨設(shè)置level
可以單獨設(shè)置格式
可以設(shè)置過濾器
handler分為
1 StreamHandler # 不指定使用sys.stderr
A FileHandler # 文件輸出
B _StderrHandler # 標(biāo)準(zhǔn)輸出
2 NullHandler # 什么都不做Handler父類 ,FileHandle和_StderrHandler和NullHandler是子類,子類可以繼承父類的相關(guān)屬性
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.WARNING) #設(shè)置此對象的相關(guān)屬性
h2=logging.StreamHandler() # 實例化一個標(biāo)準(zhǔn)輸出的handler
h2.setLevel(logging.INFO) # 設(shè)置handler的級別
log1.addFilter(h2) # 將h2加入到log1
log1.info('info log1') # 打印INFO日志。
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
結(jié)果如下
此處表明,雖然handler設(shè)置了info級別,但其沒不能影響log1的設(shè)置,仍然不能打印info級別
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.INFO) #設(shè)置此對象的相關(guān)屬性
h2=logging.StreamHandler() # 實例化一個標(biāo)準(zhǔn)輸出的handler
h2.setLevel(logging.ERROR) # 設(shè)置handler的級別
log1.addFilter(h2) # 將h2加入到log1
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
log1.info('info log1')
log2=logging.getLogger('s.s1') #此處繼承了s1的屬性
print (log2.getEffectiveLevel())
log2.warning('wangring log2') #此處設(shè)置的warning 和handler中設(shè)置的ERROR不沖突,因為ERROR 不針對當(dāng)前設(shè)置
結(jié)果如下
此處雖然handler設(shè)置了ERROR 級別,但info級別還是能夠打印出來,其不會影響當(dāng)前級別的日志,而繼承的日志也沒受到handler的影響直接打印
日志輸出到文件
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.INFO) #設(shè)置此對象的相關(guān)屬性
h2=logging.FileHandler('/root/test1.log') # 實例化一個文件輸出的handler
h2.setLevel(logging.ERROR) # 設(shè)置handler的級別
log1.addHandler(h2) # 將h2加入到log1
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
log1.info('info log1')
log1.error('error log1') #打印error級別
結(jié)果如下
文件中結(jié)果如下
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.WARNING) #設(shè)置此對象的相關(guān)屬性
h2=logging.FileHandler('/root/test1.log') # 實例化一個文件輸出的handler
h2.setLevel(logging.INFO) # 設(shè)置handler的級別
log1.addHandler(h2) # 將h2加入到log1
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
log1.info('info log1')
結(jié)果如下
文件結(jié)果
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.WARNING) #設(shè)置此對象的相關(guān)屬性
h2=logging.FileHandler('/root/test1.log') # 實例化一個文件輸出的handler
h2.setLevel(logging.INFO) # 設(shè)置handler的級別
log1.addHandler(h2) # 將h2加入到log1
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
log1.info('info log1')
log2=logging.getLogger('s.s1')
print (log2.getEffectiveLevel())
log2.info('log2 info')
文件結(jié)果
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.INFO) #設(shè)置此對象的相關(guān)屬性
h2=logging.FileHandler('/root/test1.log') # 實例化一個文件輸出的handler
h2.setLevel(logging.INFO) # 設(shè)置handler的級別
log1.addHandler(h2) # 將h2加入到log1
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
log1.info('info log1')
log2=logging.getLogger('s.s1')
print (log2.getEffectiveLevel())
log2.info('log2 info')
結(jié)果
文件結(jié)果
#!/usr/bin/python3.6
#conding:utf-8
import logging
FORMAT="%(asctime)s Threadinfo: %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)
log1=logging.getLogger('s') #此處實例化出來一個對象
log1.setLevel(logging.INFO) #設(shè)置此對象的相關(guān)屬性
h2=logging.FileHandler('/root/test1.log') # 實例化一個文件輸出的handler
h2.setLevel(logging.INFO) # 設(shè)置handler的級別
fmtr=logging.Formatter("%(asctime)s Threadinfo: %(threadName)s %(message)s %(thread)s")
h2.setFormatter(fmtr)
log1.addHandler(h2) # 將h2加入到log1
log1.warning('warning log1') # 打印WARING ,此處只能打印WAENING
log1.info('info log1')
log2=logging.getLogger('s.s1')
print (log2.getEffectiveLevel())
log2.info('log2 info')
結(jié)果如下
文件結(jié)果如下
import logging
root=logging.getLogger()
root.setLevel(logging.ERROR)
print ('root',root.handlers) #打印handler列表
h0=logging.StreamHandler()
h0.setLevel(logging.WARNING)
root.addHandler(h0)
print ('root',root.handlers) # 打印列表
for h in root.handlers:
print ("root handler = {} ,formatter= {}".format(h,h.formatter)) # 打印默認(rèn)的formatter
結(jié)果如下
import logging
root=logging.getLogger()
root.setLevel(logging.ERROR)
print ('root',root.handlers) #打印handler列表
h0=logging.StreamHandler()
h0.setLevel(logging.WARNING)
root.addHandler(h0)
print ('root',root.handlers) # 打印列表
for h in root.handlers:
print ("root handler = {} ,formatter= {}".format(h,h.formatter)) # 打印默認(rèn)的formatter
log1=logging.getLogger('s')
log1.setLevel(logging.ERROR)
h2=logging.FileHandler('/root/test2.log')
log1.addHandler(h2)
print ('log1',log1.handlers)
log2=logging.getLogger('s.s1')
log2.setLevel(logging.CRITICAL)
h3=logging.FileHandler('/root/test2.log')
h3.setLevel(logging.WARNING)
print ('log2 formatter',h3.formatter)
# handler 默認(rèn)無Formatter
f2=logging.Formatter("log2 %(name)s %(asctime)s %(message)s")
h3.setFormatter(f2)
print ('log2.formatter',h3.formatter)
log2.addHandler(h3)
print ('log2',log2.handlers)
結(jié)果為
文件結(jié)果為
1 每一個logger實例的level如同入水口,讓水流進(jìn)來,如果這個門檻太高,水流就不能進(jìn)來,其相關(guān)低級別的信息一定不能被打印出來
2 如果level沒有設(shè)置,則使用父類logger的,如果父類沒有,則繼續(xù)尋找父類的,最終找到root,而root的默認(rèn)設(shè)置是WARNING
3 消息傳遞流程
在某個logger上產(chǎn)生某種級別的消息,首先和logger的level檢查,如果消息level低于logger的EffectiveLevel有效級別,則丟棄消息,如果通過(大于等于)檢查后,消息交給所有的handler處理,每一個handler需要和自己的level比較來決定是否處理,如果沒有一個handler,或者消息已經(jīng)被處handler處理過了,則需要通過本logger的propagate屬性是否是True,True則會把這個消息繼續(xù)傳遞給父logger,父logger成為新的logger。新的logger直接把消息交給新的logger的所有handler,handler都處理完了,如果paragate屬性是True,新的logger的父成為新的logger,它的所有handler處理消息。
4 logger 實例初始化的paragate屬性為True,及允許向父傳遞logger消息
5 logging.basicConfig
如果root沒有handler,就默認(rèn)創(chuàng)建一個StreamHandler ,如果設(shè)置了filename,則就創(chuàng)建了一個FileHandler,如果設(shè)置了format參數(shù),它就會生成一個formatter對象,并把這個formatter加入到剛才創(chuàng)建的handler上,然后把這些handler加入到root.handlers列表上,level是設(shè)置給root logger的。如果root.handlers列表不是空,則logging.basicConfig的調(diào)用什么都不做。
可以為handler增加過濾器,所以過濾器只影響某一個handler,不會影響整個處理流程
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.ERROR,format=FORMAT,datefmt="%y-%m-%d %H:%M%S %z") #重新格式化傳值,定義日志輸出到文件
root=logging.getLogger()
print (root,id(root))
loga=logging.getLogger('s') # 模塊和模塊下的某個函數(shù)或類
print (loga,id(loga),id(loga.parent))
loga.setLevel(logging.INFO)
print (loga.getEffectiveLevel()) #默認(rèn)對應(yīng)的是常量20
hadr=logging.FileHandler('/root/loga.txt') # 定義,不指定則是標(biāo)準(zhǔn)錯誤輸出
hadr.setLevel(logging.INFO)
fmtr=logging.Formatter("%(asctime)s %(thread)d %(threadName)s %(message)s") #此處是一個實例。此處可以自己定義
hadr.setFormatter(fmtr)
fltr=logging.Filter('s') # 此處設(shè)置過濾器為s,則為s,s.s1均可通過
hadr.addFilter(fltr)
loga.addHandler(hadr)
logb=logging.getLogger('s.s1')
logb.getEffectiveLevel()
logb.info('logb info')
結(jié)果如下
文件結(jié)果如下
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.ERROR,format=FORMAT,datefmt="%y-%m-%d %H:%M%S %z") #重新格式化傳值,定義日志輸出到文件
root=logging.getLogger()
print (root,id(root))
loga=logging.getLogger('s') # 模塊和模塊下的某個函數(shù)或類
print (loga,id(loga),id(loga.parent))
loga.setLevel(logging.INFO)
print (loga.getEffectiveLevel()) #默認(rèn)對應(yīng)的是常量20
hadr=logging.FileHandler('/root/loga.txt') # 定義,不指定則是標(biāo)準(zhǔn)錯誤輸出
hadr.setLevel(logging.INFO)
fmtr=logging.Formatter("%(asctime)s %(thread)d %(threadName)s %(message)s") #此處是一個實例。此處可以自己定義
hadr.setFormatter(fmtr)
fltr=logging.Filter('s') # 此處設(shè)置過濾器為s,則為s,s.s1均可通過
hadr.addFilter(fltr)
loga.addHandler(hadr)
loga.info('loga info')
logb=logging.getLogger('s.s1')
logb.getEffectiveLevel()
logb.info('logb info')
logc=logging.getLogger('s.s1')
logc.getEffectiveLevel()
logc.info('logc info')
結(jié)果如下
文件如下
import logging
FORMAT="%(asctime)s %(thread)d %(message)s"
logging.basicConfig(level=logging.ERROR,format=FORMAT,datefmt="%y-%m-%d %H:%M%S %z") #重新格式化傳值,定義日志輸出到文件
root=logging.getLogger()
print (root,id(root))
loga=logging.getLogger('s') # 模塊和模塊下的某個函數(shù)或類
print (loga,id(loga),id(loga.parent))
loga.setLevel(logging.INFO)
print (loga.getEffectiveLevel()) #默認(rèn)對應(yīng)的是常量20
hadr=logging.FileHandler('/root/loga.txt') # 定義,不指定則是標(biāo)準(zhǔn)錯誤輸出
hadr.setLevel(logging.INFO)
fmtr=logging.Formatter("%(asctime)s %(thread)d %(threadName)s %(message)s") #此處是一個實例。此處可以自己定義
hadr.setFormatter(fmtr)
fltr=logging.Filter('a') # 此處設(shè)置過濾器為s,則為s,s.s1均可通過
hadr.addFilter(fltr)
loga.addHandler(hadr)
loga.info('loga info')
logb=logging.getLogger('s.s1')
logb.getEffectiveLevel()
logb.info('logb info')
logc=logging.getLogger('s.s1')
logc.getEffectiveLevel()
logc.info('logc info')
文件如下
消息loga,它的名字是's',因此過濾器名字設(shè)置為s,則s.s1,s.x和s都能通過,但其他的則不能通過,不設(shè)置過濾器名字,所有消息都能通過,設(shè)置為a,則和s,s.s1和s.s2無任何關(guān)系,因此其不能使用,實例對象只有一個,一旦同名,也是只有一個,線程的不安全不會影響logging,只會影響print。
分享標(biāo)題:python日志處理模塊
URL地址:http://bm7419.com/article40/pssoho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站內(nèi)鏈、網(wǎng)站制作、外貿(mào)建站、自適應(yīng)網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)