在python的程序实现日志log功能

又到周末了,对本周遇到的几个印象比较深刻的问题作下总结吧。
我一般在程序运行的时候,可以通过print打印一些关键的信息,来提示程序运行的状况,或者在调试的时候也可以通过print打印一些信息,来找到程序问题的大概位置,进而开始debug。
以上的方式对我们本地跑的程序来说,没有什么太大的问题,而在企业级应用中,每天的成千上万的访问量的应用中,这肯定是不行,最近在帮导师做的项目中,需要部署到云服务器中,而云是linux环境,不像我们在本地有可视化效果很好的IDE,可以清楚看到程序的运行结果,所以,我们就想到了采用日志的方式来记录程序运行的关键信息,以便出错时,及时发现。多的不说了,下面开始撸代码:

先在你的项目中新建一个文件夹log,里面包含两个文件,一个是logconfig.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<config>
    <!--  日志保存路径  -->
    <logpath>D:/PythonLog</logpath>
    <!--<logpath>/data/naiss/cloudstorage/logs</logpath>-->

    <!-- 每个脚本对应的日志文件大小,单位MB -->
    <logsize>1028</logsize>

    <!-- 每个脚本保存的日志文件个数 -->
    <lognum>3</lognum>
</config>

只需要修改一下日志保存路径就可以用了。
第二个文件是log.py,代码如下(不用修改,直接拿去用):

# coding: utf-8

from lxml import html
import logging.handlers
import logging
import os
import sys

# 提供日志功能
class logger:
    # 先读取XML文件中的配置数据
    # 由于config.xml放置在与当前文件相同的目录下,因此通过 __file__ 来获取XML文件的目录,然后再拼接成绝对路径
    # 这里利用了lxml库来解析XML
    etree = html.etree
    root = etree.parse(os.path.join(os.path.dirname(__file__), 'logconfig.xml')).getroot()
    # 读取日志文件保存路径
    logpath = root.find('logpath').text
    # 读取日志文件容量,转换为字节
    logsize = 1024*1024*int(root.find('logsize').text)
    # 读取日志文件保存个数
    lognum = int(root.find('lognum').text)

    # 日志文件名:由用例脚本的名称,结合日志保存路径,得到日志文件的绝对路径
    logname = os.path.join(logpath, sys.argv[0].split('/')[-1].split('.')[0])

    # 初始化logger
    log = logging.getLogger()
    # 日志格式,可以根据需要设置
    fmt = logging.Formatter('[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')

    # 日志输出到文件,这里用到了上面获取的日志名称,大小,保存个数
    handle1 = logging.handlers.RotatingFileHandler(logname, maxBytes=logsize, backupCount=lognum)
    handle1.setFormatter(fmt)
    # 同时输出到屏幕,便于实施观察
    #handle2 = logging.StreamHandler(stream=sys.stdout)
    #handle2.setFormatter(fmt)
    log.addHandler(handle1)
    #log.addHandler(handle2)

    # 设置日志基本,这里设置为INFO,表示只有INFO级别及以上的会打印
    log.setLevel(logging.INFO)

    # 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
    @classmethod
    def info(cls, msg):
        cls.log.info(msg)
        return

    @classmethod
    def warning(cls, msg):
        cls.log.warning(msg)
        return

    @classmethod
    def error(cls, msg):
        cls.log.error(msg)
        return

里面有详细的注释,不过要先导入lxml这个工具包。
最后直接在你的代码中使用:

from log.log import *
logger.info('This is info')
logger.warning('This is warning')
logger.error('This is error')

大功告成,拿去,不谢!

发布了7 篇原创文章 · 获赞 0 · 访问量 159

猜你喜欢

转载自blog.csdn.net/Weixiangxiang1996/article/details/101160458