簡體   English   中英

導入的模塊日志記錄調用未顯示

[英]Imported module logging calls not showing up

我一直在閱讀正確的日志記錄,到目前為止,我很喜歡它的運行情況。 一切都很好,直到我嘗試登錄主文件和我編寫的模塊。 主文件能夠寫入文件和控制台,但是導入的模塊在任何一個中均不顯示任何內容。 如果我不得不猜測,我假設我必須像在代碼配置中使用的那樣分別配置模塊輸出。 問題是我不確定這是如何或是否是原因。 我已經盡力在Google上搜索而不是詢問,但是我現在在這里。 是源代碼的鏈接。 如果嘗試運行它,則可能必須更改導入,因為當我直接導入文件時,pycharm不喜歡它。 因此,從“從測試導入速度測試”到“導入速度測試”,文件分別是main.py和speedtest.py

主要

import logging
from tests import speedtest
import time
# Logging configuration
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# creates a handler to deal with writing to the file
file_handler = logging.FileHandler("log.txt", mode="w")
file_handler.setFormatter(logFormatter)

# handler for writing to the console
console_handler = logging.StreamHandler()
console_handler.setFormatter(logFormatter)

# adds the handlers to the root logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# max speed provided
NOMINAL_SPEED = 50

# threshold in percentage 60% seems to be a decent amount to expect.
THRESHOLD = 60

# padding in percentage for severe warning
PAD = 10

# amount of time in between runs
INTERVAL = 300


class Main:
    """
    Main running class
    """

    def __init__(self):
        self.speedtest = speedtest.SpeedTest(share=True)
        self.threshold = THRESHOLD
        self.pad = PAD
        self.nominal = NOMINAL_SPEED
        self.done = False

        logger.debug("Starting main loop.")
        while not self.done:
            self.loop()
            time.sleep(INTERVAL)

    def loop(self):
        try:
            results = self.speedtest.run()
        except Exception as e:
            logger.error("Skipped running speed test this run. Will try again next time")
            return

        download = float(results["download"][:-7])
        upload = float(results["upload"][:-7])
        url = results["url"]
        host = results["host"]
        diff_download = (download / self.nominal) * 100

        logger.debug("Current download is {} Mbps upload is {} Mbps. Share url: {} host: {}".format(download, upload, url, host))

        if (((self.threshold - self.pad)/100) * self.nominal) <= diff_download <= ((self.threshold/100) * self.nominal):
            logger.info("Speed is currently at {}% nominal.".format(diff_download))
            self.warning()
        elif diff_download <= ((self.threshold - self.pad)/100) * self.nominal:
            logger.info("Speed is currently at {}% nominal. This is a problem.".format(diff_download))
            self.critical()

    def warning(self):
        pass

    def critical(self):
        pass


if __name__ == "__main__":
    Main()

速度測試

import subprocess
import logging
import os


class SpeedTest:
    """
    Class to run speed test and return the results in an easy to use manner
    """

    def __init__(self, share=False):
        """
        Init method
        :param share: When set to true it will also return a url to the speed test image
        :return:
        """

        self.logger = logging.getLogger(__name__)
        self.logger.addHandler(logging.NullHandler())

        self._share = share

        if share is True:
            self.logger.debug("Share flag set to True")
            self.cmd = ["speedtest-cli", "--share"]
        else:
            self.logger.debug("Share not set to true. Ignoring share url")
            self.cmd = ["speedtest-cli"]

    def run(self):
        """
        Runs the speed test returning a dict containing upload, download, ping, and share url if wanted.
        :return:
        """

        self.logger.debug("Starting speedtest!")

        # check_output returns the output in bytes so we use decode() to turn it into a simple string. Then we split
        # the lines giving us a list.
        try:
            stdout = subprocess.check_output(self.cmd).decode().splitlines()
        except subprocess.CalledProcessError as e:
            self.logger.error(e)
            raise e
        res = {}

        for i in stdout:
            if "Download:" in i:
                res["download"] = i[10:]
            if "Upload:" in i:
                res["upload"] = i[8:]
            if "Hosted" in i:
                res["host"] = i[2:]
            if self._share is True and "Share results:" in i:
                res["url"] = i[15:]
            else:
                res["url"] = None
        return res

    def ping(self, addr):
        """
        Pings an address and returns a 1 if the connection can not be made or a 0 if it succeeds
        :param addr: IPv4 address
        :return:
        """
        try:
            if os.name is "nt":
                self.logger.debug("Windows OS detected")
                self.logger.info("Pinging {}".format(addr))
                subprocess.check_output(["ping", "-n", "1", addr])

            elif os.name is "posix":
                self.logger.debug("Nix OS detected")
                subprocess.check_output(["ping", "-c", "1", addr])
        except subprocess.CalledProcessError:
            self.logger.warning("Returned non zero value. Is the internet working?")
            return 1

        return 0

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)

    for i in SpeedTest(share=True).run().items():
        print(i)

    print(SpeedTest().ping("8.8.8.0"))

在speedtest.py中,當您致電:

logging.getLogger(__name__)

它將為speedtest.py創建一個記錄器對象,因此您必須單獨配置它。 如果您希望它與主記錄器相同,只需添加:

self.speedtest.logger = logger

在Main的構造函數中創建SpeedTest對象之后

您的另一個選擇是將__name__作為參數傳遞給SpeedTest()並使用該參數創建記錄器(我認為這對您來說是一個更好的選擇,因為您在構造函數中寫入記錄器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM