>백엔드 개발 >파이썬 튜토리얼 >Python 스크립트 로깅 기능 사용

Python 스크립트 로깅 기능 사용

高洛峰
高洛峰원래의
2017-02-25 13:20:241892검색

자동화된 스크립트 도구를 개발한다고 가정해 보겠습니다. Commonpackage는 우리가 작성한 테스트 케이스 스크립트입니다. 기타 관련 없는 디렉토리). Scripts

로그 기능에 대한 요구 사항은 다음과 같습니다.

1 로그 보기를 용이하게 하기 위해 각 스크립트는 로그 파일에 해당하며 로그 파일 이름은 이름을 따서 지정됩니다. 스크립트

2 각 스크립트가 저장하는 로그 경로와 로그 용량을 설정할 수 있습니다. 예를 들어 5MB로 설정하면 가장 오래된 로그를 자동으로 덮어씁니다.

3 로그 기능은 사용하기 쉽고 프레임워크 비즈니스 기능과의 결합을 줄여야 합니다

 

Python 스크립트 로깅 기능 사용

 이제 위의 요구 사항을 하나씩 분석해 보겠습니다.

 

1 각 스크립트에 대한 로그 파일을 구현하려면 로그 모듈에서 유스 케이스 스크립트 이름에 따라 로그 파일을 생성해야 합니다. 여기서 중요한 문제는 로깅 모듈에서 사용 사례 스크립트의 이름을 얻는 방법입니다.

파일 이름을 얻는 일반적인 방법은 다음과 같습니다:

, os.getcwd() 다양한 기능을 살펴보겠습니다. sys.argv[0], __file__,

먼저 파일에 다음 코드를 작성합니다() :

test.py 

Python 스크립트 로깅 기능 사용 그런 다음 다른 파일에서

(

로 가정)하고 script1.py 메서드를 호출합니다. import testfunc 

Python 스크립트 로깅 기능 사용

을 실행하면 결과는 다음과 같습니다.

script1.py

Python 스크립트 로깅 기능 사용

이 스크립트를 실행할 디렉터리를 가져오고

은 스크립트를 실행하는 절대 디렉터리이고, os.getcwd()는 실행된 코드가 있는 파일의 절대 경로 이름입니다. sys.argv[0] __file__ 이제

을 사용하여 실행 스크립트의 이름을 가져와야 한다는 점은 분명합니다.

sys.argv[0]sys.argv[0].split('/')[-1].split('.')[0]

2 로그 용량 문제. 용량 초과 후 자동으로 가장 오래된 로그를 덮어쓰려면 클래스를 사용하고 로그 파일의 크기를 설정할 수 있습니다. 백업 수. loggingRotatingFileHandler 그러면 로그 경로와 용량 구성은 어디에 있나요? 사용자가

의 매개변수를 직접 수정하도록 하는 것은 당연히 좋지 않습니다. 사용자가 프레임워크 파일을 수정하도록 하지 않는 것이 가장 좋습니다. 사용자는 인터페이스를 호출하고 스크립트를 직접 작성하면 됩니다.

RotatingFileHandler 여기서 채택한 솔루션은 구성 정보를 파일에 기록하는 것입니다. 사용자는 XML 파일을 수정하여 구성을 공식화하고 로그 모듈은 구성 파일에서 매개변수를 읽습니다. XML 파일.

편의를 위해 XML 파일을

아래에 놓고 이름을

로 지정합니다. 내용은 Commonconfig.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 파일을 만듭니다. Commonlog.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__), &#39;config.xml&#39;)).getroot()
  # 读取日志文件保存路径
  logpath = root.find(&#39;logpath&#39;).text
  # 读取日志文件容量,转换为字节
  logsize = 1024*1024*int(root.find(&#39;logsize&#39;).text)
  # 读取日志文件保存个数
  lognum = int(root.find(&#39;lognum&#39;).text)

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

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

  # 日志输出到文件,这里用到了上面获取的日志名称,大小,保存个数
  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

스크립트에 각각 다음 코드를 작성하여 테스트해 보겠습니다. script1script2

from Common.log import *

logger.info(&#39;This is info&#39;)
logger.warning(&#39;This is warning&#39;)
logger.error(&#39;This is error&#39;)

두 스크립트를 각각 실행하면 콘솔 출력은 다음과 같습니다.

 Python 스크립트 로깅 기능 사용

생성된 로그 파일:

Python 스크립트 로깅 기능 사용

파일 콘텐츠:

Python 스크립트 로깅 기능 사용

Python 스크립트 로그 기능 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.