亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中l(wèi)oguru日志庫(kù)的使用

 更新時(shí)間:2023年03月27日 09:53:01   作者:chaos-god  
本文主要介紹了Python中l(wèi)oguru日志庫(kù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.概述

python中的日志庫(kù)logging使用起來(lái)有點(diǎn)像log4j,但配置通常比較復(fù)雜,構(gòu)建日志服務(wù)器時(shí)也不是方便。標(biāo)準(zhǔn)庫(kù)logging的替代品是loguru,loguru使用起來(lái)就簡(jiǎn)單的多。

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

loguru是非標(biāo)準(zhǔn)庫(kù),需要事先安裝,命令是:**pip3 install loguru****。**安裝后,最簡(jiǎn)單的使用樣例如下:

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

上述代碼輸出:

image.jpg

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

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

上述代碼運(yùn)行時(shí),可以打印到console,也可以打印到文件中去。

image.jpg

2.常見用法

2.1.顯示格式

loguru默認(rèn)格式是時(shí)間、級(jí)別、名稱+模塊和日志內(nèi)容,其中名稱+模塊是寫死的,是當(dāng)前文件的__name__變量,此變量最好不要修改。

工程比較復(fù)雜的情況下,自定義模塊名稱,是非常有用的,容易定界定位,避免陷入細(xì)節(jié)中。我們可以通過(guò)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}</>表示按照日志級(jí)別顯示顏色。8表示輸出寬度為8個(gè)字符。

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

上述代碼的輸出為:

image.jpg

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

2.2.寫入文件

日志一般需要持久化,除了輸出到命令行終端外,還需要寫入文件。標(biāo)準(zhǔn)日志庫(kù)可以通過(guò)配置文件配置logger,在代碼中也可以實(shí)現(xiàn),但過(guò)程比較繁瑣。loguru相對(duì)而已就顯得稍微簡(jiǎn)單一些,我們看下在代碼中如何實(shí)現(xiàn)此功能。日志代碼如下:

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新增了一個(gè)handler,寫入到日志文件中去。用法很簡(jiǎn)單。

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

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')通過(guò)bind方法,實(shí)現(xiàn)module_name的參數(shù)化。bind返回一個(gè)日志對(duì)象,可以通過(guò)此對(duì)象進(jìn)行日志輸出,這樣就可以實(shí)現(xiàn)不同模塊的日志格式。

loguru中自定義模塊名稱的功能比標(biāo)準(zhǔn)日志庫(kù)有點(diǎn)不同。通過(guò)bind方法,可以輕松實(shí)現(xiàn)標(biāo)準(zhǔn)日志logging的功能。而且,可以通過(guò)bind和logger.configure,輕松實(shí)現(xiàn)結(jié)構(gòu)化日志。

上述代碼的輸出如下:

image.jpg

2.3.json日志

loguru保存成結(jié)構(gòu)化json格式非常簡(jiǎn)單,只需要設(shè)置serialize=True參數(shù)即可。代碼如下:

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

輸出內(nèi)容如下:

image.jpg

2.4.日志繞接

loguru日志文件支持三種設(shè)置:循環(huán)、保留、壓縮。設(shè)置也比較簡(jiǎ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")  # 自動(dòng)循環(huán)過(guò)大的文件
logger.add("file_2.log", rotation="12:00")  # 每天中午創(chuàng)建新文件
logger.add("file_3.log", rotation="1 week")  # 一旦文件太舊進(jìn)行循環(huán)
logger.add("file_X.log", retention="10 days")  # 定期清理
logger.add("file_Y.log", compression="zip")  # 壓縮節(jié)省空間

2.5.并發(fā)安全

loguru默認(rèn)是線程安全的,但不是多進(jìn)程安全的,如果使用了多進(jìn)程安全,需要添加參數(shù)enqueue=True,樣例代碼如下:

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

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

3.高級(jí)用法

3.1.接管標(biāo)準(zhǔn)日志logging

更換日志系統(tǒng)或者設(shè)計(jì)一套日志系統(tǒng),比較難的是兼容現(xiàn)有的代碼,尤其是第三方庫(kù),因?yàn)椴荒芤驗(yàn)槿罩鞠到y(tǒng)的切換,而要去修改這些庫(kù)的代碼,也沒(méi)有必要。好在loguru可以方便的接管標(biāo)準(zhǔn)的日志系統(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')

# 使用標(biāo)注日志系統(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')

輸出為:

image.jpg

3.2.輸出日志到網(wǎng)絡(luò)服務(wù)器

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

3.2.1.自定義日志服務(wù)器

日志客戶端段代碼如下:

# 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")

日志服務(wù)器代碼如下:

# 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()

運(yùn)行結(jié)果如下:

image.jpg

3.2.2.第三方庫(kù)日志服務(wù)器

日志客戶端代碼如下:

# 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")

日志服務(wù)器代碼如下:

# 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結(jié)合

官方幫助中有一個(gè)講解logurupytest結(jié)合的例子,講得有點(diǎn)含糊不是很清楚。簡(jiǎn)單的來(lái)說(shuō),pytest有個(gè)fixture,可以捕捉被測(cè)方法中的logging日志打印,從而驗(yàn)證打印是否觸發(fā)。

下面就詳細(xì)講述如何使用logurupytest結(jié)合的代碼,如下:

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

測(cè)試輸出如下:

image.jpg

附錄

1.官方幫助文檔:https://loguru.readthedocs.io/en/stable/index.html

到此這篇關(guān)于Python中l(wèi)oguru日志庫(kù)的使用的文章就介紹到這了,更多相關(guān)Python loguru日志庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python返回?cái)?shù)組/List長(zhǎng)度的實(shí)例

    Python返回?cái)?shù)組/List長(zhǎng)度的實(shí)例

    今天小編就為大家分享一篇Python返回?cái)?shù)組/List長(zhǎng)度的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python+PyQt5實(shí)現(xiàn)自制pdf工具箱

    Python+PyQt5實(shí)現(xiàn)自制pdf工具箱

    這篇文章主要為大家詳細(xì)介紹了Python如何利用PyQt5自制pdf工具箱,可以實(shí)現(xiàn)合并拆分和刪除指定pdf頁(yè)面,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Python使用getopt處理命令行參數(shù)示例解析(最佳實(shí)踐)

    Python使用getopt處理命令行參數(shù)示例解析(最佳實(shí)踐)

    getopt模塊是Python標(biāo)準(zhǔn)庫(kù)中一個(gè)簡(jiǎn)單但強(qiáng)大的命令行參數(shù)處理工具,它特別適合那些需要快速實(shí)現(xiàn)基本命令行參數(shù)解析的場(chǎng)景,或者需要保持與Unix傳統(tǒng)命令行工具一致行為的腳本,這篇文章給大家介紹Python中如何使用getopt處理命令行參數(shù),感興趣的朋友一起看看吧
    2025-04-04
  • Python中的高級(jí)數(shù)據(jù)結(jié)構(gòu)詳解

    Python中的高級(jí)數(shù)據(jù)結(jié)構(gòu)詳解

    這篇文章主要介紹了Python中的高級(jí)數(shù)據(jù)結(jié)構(gòu)詳解,本文講解了Collection、Array、Heapq、Bisect、Weakref、Copy以及Pprint這些數(shù)據(jù)結(jié)構(gòu)的用法,需要的朋友可以參考下
    2015-03-03
  • python實(shí)現(xiàn)漢諾塔方法匯總

    python實(shí)現(xiàn)漢諾塔方法匯總

    本文給大家匯總了幾種使用Python結(jié)合遞歸算法實(shí)現(xiàn)漢諾塔的方法,非常的簡(jiǎn)單實(shí)用,對(duì)大家學(xué)習(xí)Python很有幫助,希望大家能夠喜歡
    2016-07-07
  • Django查詢數(shù)據(jù)庫(kù)的性能優(yōu)化示例代碼

    Django查詢數(shù)據(jù)庫(kù)的性能優(yōu)化示例代碼

    這篇文章主要給大家介紹了關(guān)于Django查詢數(shù)據(jù)庫(kù)性能優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • python獲取整個(gè)網(wǎng)頁(yè)源碼的方法

    python獲取整個(gè)網(wǎng)頁(yè)源碼的方法

    在本篇文章里小編給大家整理的是關(guān)于python獲取整個(gè)網(wǎng)頁(yè)源碼的方法,需要的朋友們可以參考下。
    2020-08-08
  • python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法

    python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法

    這篇文章主要介紹了python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法,實(shí)例分析了Python使用pil模塊進(jìn)行圖片處理的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析

    使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析

    這篇文章主要介紹了使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Python 使用folium繪制leaflet地圖的實(shí)現(xiàn)方法

    Python 使用folium繪制leaflet地圖的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Python 使用folium繪制leaflet地圖的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07

最新評(píng)論