'''
date:2019-06-28
autor:wangxc
功能:
1.寫日志功能,當沒有傳入日志寫入路徑時,他會將 本文件名.log 的日志文件存放到腳本同路徑下
例子:腳本路徑在c:logger.py,那么生成的日志文件logger.log將會在c:下存在
2.可以傳入日志的級別,控制日志輸出的形式,如何配置日志輸出形式,可以看下面注釋
'''
import logging
import os,sys
from logging.handlers import RotatingFileHandler
'''
%(name)s Logger的名字
%(levelno)s 數字形式的日志級別
%(levelname)s 文本形式的日志級別
%(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日志輸出函數的模塊的文件名
%(module)s 調用日志輸出函數的模塊名
%(funcName)s 調用日志輸出函數的函數名
%(lineno)d 調用日志輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日志信息時的,自Logger創建以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s 用戶輸出的消息
'''
#用字典保存日志級別 日志輸出的形式
format_dict = {
1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(levelno)s - %(pathname)s - %(filename)s - %(module)s - %(funcName)s - %(lineno)d - %(thread)d - %(threadName)s - %(process)d'),
2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}
# 開發一個日志系統, 既要把日志輸出到控制臺, 還要寫入日志文件
class Logger():
def __init__(self, logname, loglevel, logger="logger"):
path = os.path.split(sys.argv[0])[0]
filename = os.path.split(sys.argv[0])[-1]
log_file = filename.split(".")[0] + ".log"
#日志輸出具體路徑
log_path = os.sep.join([path,log_file])
# 創建一個logger
self.logger = logging.getLogger(logger)
#設置日志打印的級別
#如果設置成ERROR,則只會打印ERROR日志信息
#如果設置成INFO,則會打印出INFO和ERROR的日志信息
#如果設置成DEBUG,則會打印ERROR,INFO和ERROR的日志信息
self.logger.setLevel(logging.DEBUG)
#判斷日志路徑,不存在創建
if not os.path.exists(logname):
os.makedirs(logname)
# 創建一個handler,用于寫入日志文件
#fh = logging.FileHandler(logname,mode='w',encoding='UTF-8')
#fh.setLevel(logging.DEBUG)
# 定義一個RotatingFileHandler,最多備份5個日志文件,每個日志文件最大10M
fh = RotatingFileHandler(log_path,encoding='UTF-8', maxBytes=1 * 1024 * 1024, backupCount=5)
#控制輸出到日志文件的日志級別
fh.setLevel(logging.DEBUG)
# 再創建一個handler,用于輸出到控制臺
ch = logging.StreamHandler()
#控制輸出到控制臺的日志級別
ch.setLevel(logging.DEBUG)
# 定義handler的輸出格式
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter = format_dict[int(loglevel)]
#同時在控制臺和日志中輸出,可以按個人需求修改
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 給logger添加handler
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getlog(self):
return self.logger
if __name__ == '__main__':
#測試
logger = Logger(logname='C:/Users/Administrator/Desktop/a/', loglevel=1, logger="ww").getlog()
i = 0
while(i<10):
logger.error('this is error')
logger.debug('this is debug')
logger.info('this is info')
i = i + 1
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
