python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > 自定义python日志文件系统

自定义python日志文件系统实例

作者:littleRpl

这篇文章主要介绍了自定义python日志文件系统方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

自定义python日志文件系统

python的日志系统非常实用,可以自定义使用。

以下程序是基于logging模块编辑的一个自定义的logging系统,包括自定义日志输出级别、输出格式、输出方式, 自定义日志文件切分方式, 自定义日志分类等功能。

# 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__)
# 用字典保存日志级别
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: 日志文件名, 是否输出到文件, 默认否
        :param log_objname: 日志类名
        :param classify: 日志分类,用于分类输入到不同的文件夹, 默认无
        :param format_type: 日志的输出格式,可自定义
        :param detial_time: 日志文件是否输出详细时间(时分秒), 默认输出
        :param stdout: 是否打印到屏幕, 默认打印到屏幕
        :param time_split: 是否按时间切分日志文件
        :param when: D按天切分
        :param interval: 间隔
        :param chunl_split: 是否按文件大小切分文件
        :param maxchunk 10  切分标准  1024*1024*10是超过10M切分
        :param backupCount 最大备份数 10 最多保留10个切分文件,之后会丢弃最旧的。
        :param ip ip=True 获取本机ip作为不同机器日志文件的识别标志
        """
        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:  # 日志文件名 详细时间, 带时分秒
            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个
                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文件与文件系统

open()

open(file, mode=‘r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

文件打开模式(mode)

文件对象方法

f=open('.\\python.txt',mode='r')
print(f)
for i in f:
    print(i)
c=open('C:\\Users\\帅哥的电脑\\Desktop\python练习\\韩绘锦.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模块中常用函数的使用方法

os.path模块中常用函数使用方法

import os
path=os.getcwd ()
print(os.getcwd ())
print(os.listdir('.'))
os.chdir('C:\\Users\\帅哥的电脑\\Desktop\\python练习\\text ')
print(os.getcwd ())
print(os.listdir('.'))
os.makedirs(r'.\test\1\2\3')
#
C:\Users\帅哥的电脑\Desktop\python练习
['continue 练习.py', 'os.path模块中常用的函数.png', 'os模块中常用函数.png', 'pyhon练习txt', 'python.txt', 'python文件与文件系统mode打开模式.png', 'python文件与文件系统文件对象方法.png', 'test.txt', 'text', 'text.txt', '基础练习.py', '字符串格式化符号.png', '市场营销.docx', '格式化操作符辅助指令.png', '猜数.py', '联系.py', '运算符.png', '韩绘锦.txt']
C:\Users\帅哥的电脑\Desktop\python练习\text
['test']
import os
path=os.getcwd ()
print(os.getcwd ())
print(os.listdir('.'))
os.chdir('C:\\Users\\帅哥的电脑\\Desktop\\python练习\\text ')
print(os.getcwd ())
print(os.listdir('.'))
print(os.walk('C:'))
#
C:\Users\帅哥的电脑\Desktop\python练习
['continue 练习.py', 'os.path模块中常用的函数.png', 'os模块中常用函数.png', 'pyhon练习txt', 'python.txt', 'python文件与文件系统mode打开模式.png', 'python文件与文件系统文件对象方法.png', 'text', '基础练习.py', '字符串格式化符号.png', '格式化操作符辅助指令.png', '猜数.py', '联系.py', '运算符.png', '韩绘锦.txt']
C:\Users\帅哥的电脑\Desktop\python练习\text
['test', '删除.txt']
<generator object walk at 0x000001E0AA483F48>

序列化和反序列化的定义

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
结果说明反序列化后的对象不是原来的对象了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文