Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung der Python-Skriptprotokollierungsfunktion

Verwendung der Python-Skriptprotokollierungsfunktion

高洛峰
高洛峰Original
2017-02-25 13:20:241844Durchsuche

Angenommen, Sie möchten ein automatisiertes Skripttool entwickeln. Common Dies ist die Implementierung der Framework-Funktion. Das Verzeichnis package ist das Testfallskript, das wir geschrieben haben andere irrelevante Verzeichnisse). Scripts

Unsere Anforderungen an die Protokollfunktion lauten wie folgt:

1 Um die Protokollanzeige zu erleichtern, entspricht jedes Skript einer Protokolldatei, und die Protokolldatei wird nach dem Namen benannt des Skripts

2 Der Protokollpfad und die von jedem Skript gespeicherte Protokollkapazität können festgelegt werden. Wenn sie beispielsweise auf 5 MB eingestellt ist, wird das älteste Protokoll automatisch überschrieben

3 Die Die Protokollfunktion sollte einfach zu verwenden sein und die Kopplung mit den Geschäftsfunktionen des Frameworks reduzieren

 

Verwendung der Python-Skriptprotokollierungsfunktion

 Jetzt analysieren wir die oben genannten Anforderungen einzeln.

 

1 Um eine Protokolldatei für jedes Skript zu implementieren, müssen Sie eine Protokolldatei entsprechend dem Namen des Anwendungsfallskripts im Protokollmodul generieren Das Hauptproblem hierbei ist, wie man den Namen des Anwendungsfallskripts im Protokollierungsmodul erhält.

Gängige Methoden zum Erhalten von Dateinamen sind:

, os.getcwd() Werfen wir einen Blick auf die verschiedenen Funktionen: sys.argv[0], __file__,

Schreiben Sie zunächst den folgenden Code in eine Datei (angenommen

) :test.py

 

Verwendung der Python-Skriptprotokollierungsfunktion

 Dann

in einer anderen Datei (angenommen script1.py) und dann die import test-Methode aufrufen: func

 

Verwendung der Python-Skriptprotokollierungsfunktion

Wenn Sie

ausführen, ist das Ergebnis: script1.py

Verwendung der Python-Skriptprotokollierungsfunktion

Es ist ersichtlich, dass

das Verzeichnis zum Ausführen des Skripts erhält und os.getcwd() ist der absolute Pfadname für die Ausführung des Skripts, sys.argv[0] ist der absolute Pfadname der Datei, in der sich der ausgeführte Code befindet. __file__

Jetzt ist klar, dass wir

verwenden sollten, um den Namen des Ausführungsskripts zu erhalten. Da der absolute Pfad ermittelt wird, muss eine gewisse Verarbeitung durchgeführt werden: sys.argv[0]sys.argv[0].split('/')[-1].split('.')[0]

2 Problem mit der Protokollkapazität Um das älteste Protokoll nach Überschreiten der Kapazität automatisch zu überschreiben, verwenden Sie die Klasse in logging Anzahl der Backups. RotatingFileHandler

Wo sind also die Protokollpfade und die Kapazitätskonfiguration? Es ist offensichtlich nicht gut, Benutzer die Parameter von

direkt ändern zu lassen. Es ist am besten, Benutzer die Framework-Datei nicht ändern zu lassen. Benutzer müssen nur die Schnittstelle aufrufen und ihre eigenen Skripte schreiben. RotatingFileHandler

Die hier gewählte Lösung besteht darin, die Konfigurationsinformationen in eine Datei zu schreiben. Die XML-Datei eignet sich besser als Konfigurationsdatei. Der Benutzer formuliert die Konfiguration, indem er die XML-Datei ändert, und das Protokollmodul liest Parameter aus der Datei XML-Datei.

Der Einfachheit halber legen Sie die XML-Datei unter

ab und nennen sie Common. Der Inhalt lautet: config.xml

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

<config>
  <!-- 日志保存路径 -->
  <logpath>E:\PythonLog</logpath>

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

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

Lesen Es ist sehr einfach, die

-Bibliothek zu verwenden, um den Inhalt der XML-Datei abzurufen. Der Code wird später angegeben. lxml

 

 

3 Die Protokollierungsfunktion sollte einfach zu verwenden sein und die Kopplung mit den Geschäftsfunktionen des Frameworks reduzieren. Es ist am besten, sie zu kapseln die Protokollierungsfunktion und stellen nur die Schnittstelle zum Aufzeichnen von Protokollen bereit.

Die Protokollschnittstelle übernimmt die Form einer Klassenmethode, um die oben genannten Anforderungen zu erfüllen. Benutzer müssen die Protokollschnittstelle nur über die Klasse aufrufen, die einfach und nicht erforderlich ist definiert Klasseninstanzen und ist nicht mit dem Framework-Geschäft gekoppelt.  

Mit der obigen Analyse implementieren wir das Protokollmodul.

Da die Protokollierungsfunktion auch Teil der Grundlage des Frameworks ist, platzieren wir auch das Protokollierungsmodul in

diesem Common und erstellen eine neue package-Datei unter Common lautet wie folgt: 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__), &#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

Um es zu testen, schreiben Sie die folgenden Codes in die Skripte

bzw. script1: script2

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;)

Führen Sie jeweils die beiden Skripte aus und die Konsolenausgabe lautet:

 Verwendung der Python-Skriptprotokollierungsfunktion

Erstellte Protokolldatei:

Verwendung der Python-Skriptprotokollierungsfunktion

Dateiinhalt:

Verwendung der Python-Skriptprotokollierungsfunktion

Für Weitere Artikel zur Verwendung der Python-Skriptprotokollfunktion finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn