자동화된 스크립트 도구를 개발한다고 가정해 보겠습니다. Common
이 package
는 우리가 작성한 테스트 케이스 스크립트입니다. 기타 관련 없는 디렉토리). Scripts
1 각 스크립트에 대한 로그 파일을 구현하려면 로그 모듈에서 유스 케이스 스크립트 이름에 따라 로그 파일을 생성해야 합니다. 여기서 중요한 문제는 로깅 모듈에서 사용 사례 스크립트의 이름을 얻는 방법입니다.
파일 이름을 얻는 일반적인 방법은 다음과 같습니다:, os.getcwd()
다양한 기능을 살펴보겠습니다. sys.argv[0], __file__,
test.py
그런 다음 다른 파일에서
(로 가정)하고 script1.py
메서드를 호출합니다. import test
func
을 실행하면 결과는 다음과 같습니다.
script1.py
이 스크립트를 실행할 디렉터리를 가져오고
은 스크립트를 실행하는 절대 디렉터리이고, os.getcwd()
는 실행된 코드가 있는 파일의 절대 경로 이름입니다. sys.argv[0]
__file__
이제
sys.argv[0]
sys.argv[0].split('/')[-1].split('.')[0]
2 로그 용량 문제. 용량 초과 후 자동으로 가장 오래된 로그를 덮어쓰려면 의 클래스를 사용하고 로그 파일의 크기를 설정할 수 있습니다. 백업 수. logging
RotatingFileHandler
그러면 로그 경로와 용량 구성은 어디에 있나요? 사용자가
RotatingFileHandler
여기서 채택한 솔루션은 구성 정보를 파일에 기록하는 것입니다. 사용자는 XML 파일을 수정하여 구성을 공식화하고 로그 모듈은 구성 파일에서 매개변수를 읽습니다. XML 파일.
편의를 위해 XML 파일을
아래에 놓고 이름을로 지정합니다. 내용은 Common
config.xml
<?xml version="1.0" encoding="utf-8"?> <config> <!-- 日志保存路径 --> <logpath>E:\PythonLog</logpath> <!-- 每个脚本对应的日志文件大小,单位MB --> <logsize>8</logsize> <!-- 每个脚本保存的日志文件个数 --> <lognum>3</lognum> </config>
입니다. 파일의 내용은
라이브러리를 사용하여 매우 간단하며 코드는 나중에 제공됩니다.lxml
3 로깅 기능은 사용하기 쉬워야 하며 프레임워크의 비즈니스 기능과의 결합을 줄여주는 것이 가장 좋습니다. 로그 기록을 위한 인터페이스만 있으면 충분합니다. 로그 인터페이스는 위의 요구 사항을 충족하기 위해 클래스 메서드 형식을 채택합니다. 사용자는 어디에서나 호출할 수 있는 클래스를 통해 로깅 인터페이스만 호출하면 됩니다. 클래스 인스턴스를 정의하며 프레임워크 비즈니스와 결합되지 않습니다.
위의 분석을 바탕으로 로그 모듈을 구현해 보겠습니다.
로깅 기능도 프레임워크의 기초의 일부이므로
이에 로깅 모듈을 배치하고 Common
아래에 새 package
파일을 만듭니다. Common
log.py
# coding: utf-8 from lxml import etree import logging.handlers import logging import os import sys # 提供日志功能 class logger: # 先读取XML文件中的配置数据 # 由于config.xml放置在与当前文件相同的目录下,因此通过 __file__ 来获取XML文件的目录,然后再拼接成绝对路径 # 这里利用了lxml库来解析XML root = etree.parse(os.path.join(os.path.dirname(__file__), 'config.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
및
스크립트에 각각 다음 코드를 작성하여 테스트해 보겠습니다. script1
script2
from Common.log import * logger.info('This is info') logger.warning('This is warning') logger.error('This is error')
두 스크립트를 각각 실행하면 콘솔 출력은 다음과 같습니다.
생성된 로그 파일:
파일 콘텐츠:
Python 스크립트 로그 기능 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!