欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python中l(wèi)oguru日志庫怎么使用

這篇“Python中l(wèi)oguru日志庫怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python中l(wèi)oguru日志庫怎么使用”文章吧。

創(chuàng)新互聯建站主要從事網站制作、成都做網站、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務石鼓,十多年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575

1.概述

python中的日志庫logging使用起來有點像log4j,但配置通常比較復雜,構建日志服務器時也不是方便。標準庫logging的替代品是loguru,loguru使用起來就簡單的多。

loguru默認的輸出格式是:時間、級別、模塊、行號以及日志內容。loguru不需要手動創(chuàng)建 logger,開箱即用,比logging使用方便得多;另外,日志輸出內置了彩色功能,顏色和非顏色控制很方便,更加友好。

loguru是非標準庫,需要事先安裝,命令是:**pip3 install loguru****。**安裝后,最簡單的使用樣例如下:

from loguru import logger

logger.debug('hello, this debug loguru')
logger.info('hello, this is info loguru')
logger.warning('hello, this is warning loguru')
logger.error('hello, this is error loguru')
logger.critical('hello, this is critical loguru')

上述代碼輸出:

Python中l(wèi)oguru日志庫怎么使用

日志打印到文件的用法也很簡單,代碼如下:

from loguru import logger

logger.add('myloguru.log')

logger.debug('hello, this debug loguru')
logger.info('hello, this is info loguru')
logger.warning('hello, this is warning loguru')
logger.error('hello, this is error loguru')
logger.critical('hello, this is critical loguru')

上述代碼運行時,可以打印到console,也可以打印到文件中去。

Python中l(wèi)oguru日志庫怎么使用

2.常見用法

2.1.顯示格式

loguru默認格式是時間、級別、名稱+模塊和日志內容,其中名稱+模塊是寫死的,是當前文件的__name__變量,此變量最好不要修改。

工程比較復雜的情況下,自定義模塊名稱,是非常有用的,容易定界定位,避免陷入細節(jié)中。我們可以通過logger.configure手工指定模塊名稱。如下如下:

import sys

from loguru import logger

logger.configure(handlers=[
    {
        "sink": sys.stderr,
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<lvl>{level:8}</>| {name} : {module}:{line:4} | <cyan>mymodule</> | - <lvl>{message}</>",
        "colorize": True
    },
])

logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')
logger.critical('this is critical')

handlers:表示日志輸出句柄或者目的地,sys.stderr表示輸出到命令行終端。

"sink": sys.stderr,表示輸出到終端

"format":表示日志格式化。<lvl>{level:8}</>表示按照日志級別顯示顏色。8表示輸出寬度為8個字符。

"colorize": True**:表示顯示顏色。

上述代碼的輸出為:

Python中l(wèi)oguru日志庫怎么使用

這里寫死了模塊名稱,每個日志都這樣設置也是比較繁瑣。下面會介紹指定不同模塊名稱的方法。

2.2.寫入文件

日志一般需要持久化,除了輸出到命令行終端外,還需要寫入文件。標準日志庫可以通過配置文件配置logger,在代碼中也可以實現,但過程比較繁瑣。loguru相對而已就顯得稍微簡單一些,我們看下在代碼中如何實現此功能。日志代碼如下:

import sys

from loguru import logger

logger.configure(handlers=[
    {
        "sink": sys.stderr,
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<lvl>{level:8}</>| {name} : {module}:{line:4} | <cyan>mymodule</> | - <lvl>{message}</>",
        "colorize": True
    },
    {
        "sink": 'first.log',
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |{level:8}| {name} : {module}:{line:4} | mymodule | - {message}",
        "colorize": False
    },
])

logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')
logger.critical('this is critical')

與2.1.唯一不同的地方,logger.configure新增了一個handler,寫入到日志文件中去。用法很簡單。

上述只是通過logger.configure設置日志格式,但是模塊名不是可變的,實際項目開發(fā)中,不同模塊寫日志,需要指定不同的模塊名稱。因此,模塊名稱需要參數化,這樣實用性更強。樣例代碼如下:

import sys

from loguru import logger

logger.configure(handlers=[
    {
        "sink": sys.stderr,
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<lvl>{level:8}</>| {name} : {module}:{line:4} | <cyan>{extra[module_name]}</> | - <lvl>{message}</>",
        "colorize": True
    },
    {
        "sink": 'first.log',
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |{level:8}| {name} : {module}:{line:4} | {extra[module_name]} | - {message}",
        "colorize": False
    },
])

log = logger.bind(module_name='my-loguru')
log.debug("this is hello, module is my-loguru")

log2 = logger.bind(module_name='my-loguru2')
log2.info("this is hello, module is my-loguru2")

logger.bind(module_name='my-loguru')通過bind方法,實現module_name的參數化。bind返回一個日志對象,可以通過此對象進行日志輸出,這樣就可以實現不同模塊的日志格式。

loguru中自定義模塊名稱的功能比標準日志庫有點不同。通過bind方法,可以輕松實現標準日志logging的功能。而且,可以通過bind和logger.configure,輕松實現結構化日志。

上述代碼的輸出如下:

Python中l(wèi)oguru日志庫怎么使用

2.3.json日志

loguru保存成結構化json格式非常簡單,只需要設置serialize=True參數即可。代碼如下:

from loguru import logger

logger.add('json.log', serialize=True, encoding='utf-8')
logger.debug('this is debug message')
logger.info('this is info message')
logger.error('this is error message')

輸出內容如下:

Python中l(wèi)oguru日志庫怎么使用

2.4.日志繞接

loguru日志文件支持三種設置:循環(huán)、保留、壓縮。設置也比較簡單。尤其是壓縮格式,支持非常豐富,常見的壓縮格式都支持,比如:"gz", "bz2", "xz", "lzma", "tar", "tar.gz", "tar.bz2", "tar.xz", "zip"。樣例代碼如下:

from loguru import logger

logger.add("file_1.log", rotation="500 MB")  # 自動循環(huán)過大的文件
logger.add("file_2.log", rotation="12:00")  # 每天中午創(chuàng)建新文件
logger.add("file_3.log", rotation="1 week")  # 一旦文件太舊進行循環(huán)
logger.add("file_X.log", retention="10 days")  # 定期清理
logger.add("file_Y.log", compression="zip")  # 壓縮節(jié)省空間
2.5.并發(fā)安全

loguru默認是線程安全的,但不是多進程安全的,如果使用了多進程安全,需要添加參數enqueue=True,樣例代碼如下:

logger.add("somefile.log", enqueue=True)

loguru另外還支持協程,有興趣可以自行研究。

3.高級用法

3.1.接管標準日志logging

更換日志系統(tǒng)或者設計一套日志系統(tǒng),比較難的是兼容現有的代碼,尤其是第三方庫,因為不能因為日志系統(tǒng)的切換,而要去修改這些庫的代碼,也沒有必要。好在loguru可以方便的接管標準的日志系統(tǒng)。

樣例代碼如下:

import logging
import logging.handlers
import sys

from loguru import logger

handler = logging.handlers.SysLogHandler(address=('localhost', 514))
logger.add(handler)

class LoguruHandler(logging.Handler):
    def emit(self, record):
        try:
            level = logger.level(record.levelname).name
        except ValueError:
            level = record.levelno
        frame, depth = logging.currentframe(), 2
        while frame.f_code.co_filename == logging.__file__:
            frame = frame.f_back
            depth += 1
        logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())

logging.basicConfig(handlers=[LoguruHandler()], level=0, format='%(asctime)s %(filename)s %(levelname)s %(message)s',
                    datefmt='%Y-%M-%D %H:%M:%S')

logger.configure(handlers=[
    {
        "sink": sys.stderr,
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<lvl>{level:8}</>| {name} : {module}:{line:4} | [ModuleA] | - <lvl>{message}</>",
        "colorize": True
    },
])

log = logging.getLogger('root')

# 使用標注日志系統(tǒng)輸出
log.info('hello wrold, that is from logging')
log.debug('debug hello world, that is from logging')
log.error('error hello world, that is from logging')
log.warning('warning hello world, that is from logging')

# 使用loguru系統(tǒng)輸出
logger.info('hello world, that is from loguru')

輸出為:

Python中l(wèi)oguru日志庫怎么使用

3.2.輸出日志到網絡服務器

如果有需要,不同進程的日志,可以輸出到同一個日志服務器上,便于日志的統(tǒng)一管理。我們可以利用自定義或者第三方庫進行日志服務器和客戶端的設置。下面介紹兩種日志服務器的用法。

3.2.1.自定義日志服務器

日志客戶端段代碼如下:

# client.py
import pickle
import socket
import struct
import time

from loguru import logger

class SocketHandler:

    def __init__(self, host, port):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect((host, port))

    def write(self, message):
        record = message.record
        data = pickle.dumps(record)
        slen = struct.pack(">L", len(data))
        self.sock.send(slen + data)

logger.configure(handlers=[{"sink": SocketHandler('localhost', 9999)}])

while True:
    time.sleep(1)
    logger.info("Sending info message from the client")
    logger.debug("Sending debug message from the client")
    logger.error("Sending error message from the client")

日志服務器代碼如下:

# server.py
import pickle
import socketserver
import struct

from loguru import logger

class LoggingStreamHandler(socketserver.StreamRequestHandler):

    def handle(self):
        while True:
            chunk = self.connection.recv(4)
            if len(chunk) < 4:
                break
            slen = struct.unpack('>L', chunk)[0]
            chunk = self.connection.recv(slen)
            while len(chunk) < slen:
                chunk = chunk + self.connection.recv(slen - len(chunk))
            record = pickle.loads(chunk)
            level, message = record["level"].no, record["message"]
            logger.patch(lambda record: record.update(record)).log(level, message)

server = socketserver.TCPServer(('localhost', 9999), LoggingStreamHandler)
server.serve_forever()

運行結果如下:

Python中l(wèi)oguru日志庫怎么使用

3.2.2.第三方庫日志服務器

日志客戶端代碼如下:

# client.py
import zmq
from zmq.log.handlers import PUBHandler
from loguru import logger

socket = zmq.Context().socket(zmq.PUB)
socket.connect("tcp://127.0.0.1:12345")
handler = PUBHandler(socket)logger.add(handler)
logger.info("Logging from client")

日志服務器代碼如下:

# server.py
import sys
import zmq
from loguru import logger

socket = zmq.Context().socket(zmq.SUB)
socket.bind("tcp://127.0.0.1:12345")
socket.subscribe("")
logger.configure(handlers=[{"sink": sys.stderr, "format": "{message}"}])

while True:
    _, message = socket.recv_multipart()
    logger.info(message.decode("utf8").strip())
3.3.與pytest結合

官方幫助中有一個講解logurupytest結合的例子,講得有點含糊不是很清楚。簡單的來說,pytest有個fixture,可以捕捉被測方法中的logging日志打印,從而驗證打印是否觸發(fā)。

下面就詳細講述如何使用logurupytest結合的代碼,如下:

import pytest
from _pytest.logging import LogCaptureFixture
from loguru import logger

def some_func(i, j):
    logger.info('Oh no!')
    logger.info('haha')
    return i + j

@pytest.fixture
def caplog(caplog: LogCaptureFixture):
    handler_id = logger.add(caplog.handler, format="{message}")
    yield caplog
    logger.remove(handler_id)

def test_some_func_logs_warning(caplog):
    assert some_func(-1, 3) == 2
    assert "Oh no!" in caplog.text

測試輸出如下:

Python中l(wèi)oguru日志庫怎么使用

以上就是關于“Python中l(wèi)oguru日志庫怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注創(chuàng)新互聯行業(yè)資訊頻道。

網站名稱:Python中l(wèi)oguru日志庫怎么使用
標題來源:http://aaarwkj.com/article18/phoddp.html

成都網站建設公司_創(chuàng)新互聯,為您提供搜索引擎優(yōu)化云服務器、微信小程序靜態(tài)網站、外貿建站、小程序開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都網站建設
亚洲午夜精品久久久天堂| 亚洲国产视频中文字幕| 亚洲成人久久久av一区| 日韩成人高清免费在线| 国产欧美日韩亚洲精品区| 九九热这里只有免费视频| 国产精品日产三级在线观看| 午夜精品国产日韩欧美在线| 一二区中文字幕在线观看| 粉嫩一区二区三区精品视频| 亚洲国产不卡一区二区三区| 免费一区二区不卡去日本| 青青草原这里只有精品| 久久亚洲精品中文字幕一| 久久久久精品国产亚洲av影院| 久久麻豆精亚洲av品国产一区| 少妇高潮毛片免费看高潮| 国产另类极品熟女露脸自拍| 加勒比在线观看欧美一区| 欧美看黄网站在线观看| 九九热在线免费观看精品视频 | 91午夜福利国产精品| 日韩最新视频一区二区三| 国产成人免费自拍一区| 中文字幕乱码人妻一区二| 亚洲中少妇久久中文字幕| 黄片超刺激在线看在线| 中文字幕日韩在线欧美一区| 精品国产无遮挡污污网站| 性生活视性生活大片日本| 国产欧美日韩精品一区| 日本韩国欧美一区二区在线| 中国亚洲黄色录像免费看| 亚洲天堂av现在观看| 午夜视频在线观看黄片| 日韩免费毛片在线观看| 日本免费一区二区三区的电影啊| 九九在线视频免费观看精彩| 国产精品日本欧美久久久| 久久精品国产普通话对白| 日韩精品视频播放一区 |