自定義python日志文件系統(tǒng)實(shí)例
自定義python日志文件系統(tǒng)
python的日志系統(tǒng)非常實(shí)用,可以自定義使用。
以下程序是基于logging模塊編輯的一個(gè)自定義的logging系統(tǒng),包括自定義日志輸出級(jí)別、輸出格式、輸出方式, 自定義日志文件切分方式, 自定義日志分類等功能。
# coding=utf-8 """ Author: rpl date: 19-12-9 下午2:46 desc: """ import os import socket import datetime import logging from logging import handlers # 日志文件的保存位置 Log_path = os.path.dirname(__file__) # 用字典保存日志級(jí)別 format_dict = { 1: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 2: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - filename:%(filename)s - line:%(lineno)d ' '- message:%(message)s'), 3: None, # 不做任何格式 } def get_host_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] return ip class Logger(object): def __init__(self, log_filename=None, log_objname='Log', classify=None, format_type=1, detial_time=True, stdout=True, time_split=False, when='D', interval=1, chunk_split=False, maxchunk=1024*1024*10, backupCount=10, ip=True): """ :param log_filename: 日志文件名, 是否輸出到文件, 默認(rèn)否 :param log_objname: 日志類名 :param classify: 日志分類,用于分類輸入到不同的文件夾, 默認(rèn)無 :param format_type: 日志的輸出格式,可自定義 :param detial_time: 日志文件是否輸出詳細(xì)時(shí)間(時(shí)分秒), 默認(rèn)輸出 :param stdout: 是否打印到屏幕, 默認(rèn)打印到屏幕 :param time_split: 是否按時(shí)間切分日志文件 :param when: D按天切分 :param interval: 間隔 :param chunl_split: 是否按文件大小切分文件 :param maxchunk 10 切分標(biāo)準(zhǔn) 1024*1024*10是超過10M切分 :param backupCount 最大備份數(shù) 10 最多保留10個(gè)切分文件,之后會(huì)丟棄最舊的。 :param ip ip=True 獲取本機(jī)ip作為不同機(jī)器日志文件的識(shí)別標(biāo)志 """ self.logger = logging.getLogger(log_objname) self.logger.setLevel(logging.DEBUG) if ip: self.ip = get_host_ip().split('.')[-1] formatter = format_dict[format_type] if detial_time: # 日志文件名 詳細(xì)時(shí)間, 帶時(shí)分秒 log_date = datetime.datetime.now().strftime('.%Y-%m-%d-%H%M%S') else: log_date = datetime.datetime.now().strftime('.%Y-%m-%d') # 是否有文件名, 有則輸出到此文件 if log_filename: if classify and ip: log_path = os.path.join(Log_path, self.ip+'_log_file', classify) elif classify and not ip: log_path = os.path.join(Log_path, 'log_file', classify) elif not classify and ip: log_path = os.path.join(Log_path, self.ip + '_log_file') else: log_path = os.path.join(Log_path, 'log_file') if not os.path.exists(log_path): os.makedirs(log_path) self.log_filename = os.path.join(log_path, log_filename+log_date) if time_split: fh = logging.handlers.TimedRotatingFileHandler(log_filename, when=when, interval=interval, backupCount=backupCount) elif chunk_split: # 按大小切分日志文件, 超過30M分割, 最多備份10個(gè) fh = logging.handlers.RotatingFileHandler(log_filename, maxBytes=maxchunk, backupCount=backupCount) else: fh = logging.FileHandler(self.log_filename) fh.setLevel(logging.DEBUG) if formatter: fh.setFormatter(formatter) self.logger.addHandler(fh) if stdout: # 是否輸出到屏幕 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) def getLog(self): return self.logger if __name__ == '__main__': log = Logger(log_filename='test_log', classify='test', log_objname='test1', detial_time=True, stdout=True, format_type=1, ip=False).getLog() log.info('this is log test')
python文件與文件系統(tǒng)
open()
open(file, mode=‘r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
·file
: 必需,文件路徑(相對(duì)或者絕對(duì)路徑)。·mode
: 可選,文件打開模式·buffering
: 設(shè)置緩沖·encoding
: 一般使用utf8·errors
: 報(bào)錯(cuò)級(jí)別·newline
: 區(qū)分換行符·closefd
: 傳入的file參數(shù)類型
文件打開模式(mode)
文件對(duì)象方法
f=open('.\\python.txt',mode='r') print(f) for i in f: print(i) c=open('C:\\Users\\帥哥的電腦\\Desktop\python練習(xí)\\韓繪錦.txt',mode='w') c.write("hanhuijin") c.close() c=open('.\\韓繪錦.txt',mode='r+') print(c.read()) c.seek(3,0) print(c.read()) c.write('love lsgo') c.seek(0,0) print(c.read()) c.writelines (["韓繪錦",'love','lsgo']) c.seek(0,0) print(c.read()) print(c.tell ()) c.seek(0,0) c.truncate () print(c.read()) # <_io.TextIOWrapper name='.\\python.txt' mode='r' encoding='cp936'> line1 line2 line3 hanhuijin huijin hanhuijinlove lsgo hanhuijinlove lsgo韓繪錦lovelsgo 34 >>>
os模塊中常用函數(shù)的使用方法
os.path模塊中常用函數(shù)使用方法
import os path=os.getcwd () print(os.getcwd ()) print(os.listdir('.')) os.chdir('C:\\Users\\帥哥的電腦\\Desktop\\python練習(xí)\\text ') print(os.getcwd ()) print(os.listdir('.')) os.makedirs(r'.\test\1\2\3') # C:\Users\帥哥的電腦\Desktop\python練習(xí) ['continue 練習(xí).py', 'os.path模塊中常用的函數(shù).png', 'os模塊中常用函數(shù).png', 'pyhon練習(xí)txt', 'python.txt', 'python文件與文件系統(tǒng)mode打開模式.png', 'python文件與文件系統(tǒng)文件對(duì)象方法.png', 'test.txt', 'text', 'text.txt', '基礎(chǔ)練習(xí).py', '字符串格式化符號(hào).png', '市場(chǎng)營(yíng)銷.docx', '格式化操作符輔助指令.png', '猜數(shù).py', '聯(lián)系.py', '運(yùn)算符.png', '韓繪錦.txt'] C:\Users\帥哥的電腦\Desktop\python練習(xí)\text ['test']
import os path=os.getcwd () print(os.getcwd ()) print(os.listdir('.')) os.chdir('C:\\Users\\帥哥的電腦\\Desktop\\python練習(xí)\\text ') print(os.getcwd ()) print(os.listdir('.')) print(os.walk('C:')) # C:\Users\帥哥的電腦\Desktop\python練習(xí) ['continue 練習(xí).py', 'os.path模塊中常用的函數(shù).png', 'os模塊中常用函數(shù).png', 'pyhon練習(xí)txt', 'python.txt', 'python文件與文件系統(tǒng)mode打開模式.png', 'python文件與文件系統(tǒng)文件對(duì)象方法.png', 'text', '基礎(chǔ)練習(xí).py', '字符串格式化符號(hào).png', '格式化操作符輔助指令.png', '猜數(shù).py', '聯(lián)系.py', '運(yùn)算符.png', '韓繪錦.txt'] C:\Users\帥哥的電腦\Desktop\python練習(xí)\text ['test', '刪除.txt'] <generator object walk at 0x000001E0AA483F48>
序列化和反序列化的定義
- 序列化:就是把不可傳輸?shù)膶?duì)象轉(zhuǎn)換為可存儲(chǔ)或可傳輸?shù)倪^程
- 反序列化:就是把在磁盤,等介質(zhì)中的數(shù)據(jù)轉(zhuǎn)換為對(duì)象
pickle模塊的使用
import pickle dic1={'one':1,'two':2,'three':3} a=pickle.dumps (dic1) print(a,type(a)) b=pickle.loads(a) print(b,type(b)) # b'\x80\x03}q\x00(X\x03\x00\x00\x00oneq\x01K\x01X\x03\x00\x00\x00twoq\x02K\x02X\x05\x00\x00\x00threeq\x03K\x03u.' <class 'bytes'> {'one': 1, 'two': 2, 'three': 3} <class 'dict'>
import pickle dic1={'one':1,'two':2,'three':3} a=open('.\\text.txt','wb') pickle.dump(dic1,a) a.close() b=open('.\\text.txt','rb') result=pickle.load(b) print(b.read()) b.close() print(id(dic1),result,id(result)) # b'' 1806383632776 {'one': 1, 'two': 2, 'three': 3} 1806383812024 結(jié)果說明反序列化后的對(duì)象不是原來的對(duì)象了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
matplotlib制作雷達(dá)圖報(bào)錯(cuò)ValueError的實(shí)現(xiàn)
這篇文章主要介紹了matplotlib制作雷達(dá)圖報(bào)錯(cuò)ValueError的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn)
這篇文章主要介紹了pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12解析PyCharm Python運(yùn)行權(quán)限問題
這篇文章主要介紹了PyCharm Python運(yùn)行權(quán)限問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Django壓縮靜態(tài)文件的實(shí)現(xiàn)方法詳析
最近在學(xué)習(xí)Django配置靜態(tài)文件,下面這篇文章主要給大家介紹了關(guān)于Django壓縮靜態(tài)文件的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08深入了解python的tkinter實(shí)現(xiàn)簡(jiǎn)單登錄
這篇文章主要為大家介紹了python的tkinter實(shí)現(xiàn)簡(jiǎn)單登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12在Python中封裝GObject模塊進(jìn)行圖形化程序編程的教程
這篇文章主要介紹了在Python中封裝GObject模塊進(jìn)行圖形化程序編程的教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04