国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python更優雅的日志記錄解決方案Loguru

馬哥Linux運維 ? 來源:Escape ? 作者:Escape ? 2021-11-18 11:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Loguru: 更優雅的日志記錄解決方案!

loguru是一個Python簡易且強大的第三方日志記錄庫,該庫旨在通過添加一系列有用的功能來解決標準記錄器的注意事項,從而減少Python日志記錄的痛苦。

1. 引入原因

簡單且方便的幫助我們輸出需要的日志信息!

  • 使用Python來寫程序或者腳本的話,常常遇到的問題就是需要對日志進行刪除。一方面可以幫助我們在程序出問題的時候排除問題,二來可以幫助我們記錄需要關注的信息。

  • 但是,使用自帶自帶的logging模塊的話,則需要我們進行不同的初始化等相關工作。對應不熟悉該模塊的同學來說,還是有些費勁的,比如需要配置Handler/Formatter等。

import logging
logger = logging.getLogger('xxx')handler = logging.StreamHandler()formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')handler.setFormatter(formatter)logger.addHandler(handler)logger.setLevel(logging.DEBUG)
logger.debug('This is a %s', 'test')
  • loguru就是一個可以開箱即用的日志記錄模塊,我們不再需要復雜的初始化操作就可以通過如下命令來記錄日志信息了。

# pip$ pip install loguru

2. 功能特性

有很多優點,以下列舉了其中比較重要的幾點!

  • 開箱即用,無需準備

  • 無需初始化,導入函數即可使用

  • 更容易的文件日志記錄與轉存/保留/壓縮方式

  • 更優雅的字符串格式化輸出

  • 可以在線程或主線程中捕獲異常

  • 可以設置不同級別的日志記錄樣式

  • 支持異步,且線程和多進程安全

  • 支持惰性計算

  • 適用于腳本和庫

  • 完全兼容標準日志記錄

  • 更好的日期時間處理


3. 快速上手

介紹 loguru 的常用操作和功能介紹!

[1] 開箱即用,無需準備

    • loguru并沒有什么黑科技,只是它預先幫助我們設置好了相關的配置,我們導入之后即可直接使用。

from loguru import logger
logger.debug("That's it, beautiful and simple logging!")

[2] 無需初始化,導入函數即可使用

  • 如何添加處理程序(handler)呢?

  • 如何設置日志格式(logs formatting)呢?

  • 如何過濾消息(filter messages)呢?

  • 如何如何設置級別(log level)呢?

# addlogger.add(sys.stderr,     format="{time} {level} {message}",    filter="my_module",    level="INFO")

[3] 更容易的文件日志記錄與轉存/保留/壓縮方式

# 日志文件記錄logger.add("file_{time}.log")
# 日志文件轉存logger.add("file_{time}.log", rotation="500 MB")logger.add("file_{time}.log", rotation="12:00")logger.add("file_{time}.log", rotation="1 week")
# 多次時間之后清理logger.add("file_X.log", retention="10 days")
# 使用zip文件格式保存logger.add("file_Y.log", compression="zip")

[4] 更優雅的字符串格式化輸出

logger.info(    "If you're using Python {}, prefer {feature} of course!",    3.6, feature="f-strings")

[5] 在線程或主線程中捕獲異常

@logger.catchdef my_function(x, y, z):    # An error? It's caught anyway!    return 1 / (x + y + z)
my_function(0, 0, 0)

[6] 可以設置不同級別的日志記錄樣式

  • Loguru會自動為不同的日志級別,添加不同的顏色進行區分,當然我們也是可以自定義自己喜歡的顯示顏色樣式的。

logger.add(sys.stdout,    colorize=True,    format="{time} {message}")
logger.add('logs/z_{time}.log',           level='DEBUG',           format='{time:YYYY-MM-DD ss} - {level} - {file} - {line} - {message}',           rotation="10 MB")

[7] 支持異步且線程和多進程安全

  • 默認情況下,添加到logger中的日志信息都是線程安全的。但這并不是多進程安全的,我們可以通過添加enqueue參數來確保日志完整性。

  • 如果我們想要在異步任務中使用日志記錄的話,也是可以使用同樣的參數來保證的。并且通過complete()來等待執行完成。

# 異步寫入logger.add("some_file.log", enqueue=True)

[8] 異常的完整性描述

  • 用于記錄代碼中發生的異常的bug跟蹤,Loguru通過允許顯示整個堆棧跟蹤(包括變量值)來幫助您識別問題。

logger.add("out.log", backtrace=True, diagnose=True)
def func(a, b):    return a / b
def nested(c):    try:        func(5, c)    except ZeroDivisionError:        logger.exception("What?!")
nested(0)

[9] 結構化日志記錄

  • 對日志進行序列化以便更容易地解析或傳遞數據結構,使用序列化參數,在將每個日志消息發送到配置的接收器之前,將其轉換為JSON字符串。

  • 同時,使用bind()方法,可以通過修改額外的record屬性來將日志記錄器消息置于上下文中。還可以通過組合bind()filter對日志進行更細粒度的控制。

  • 最后patch()方法允許將動態值附加到每個新消息的記錄dict上。

# 序列化為json格式logger.add(custom_sink_function, serialize=True)
# bind方法的用處logger.add("file.log", format="{extra[ip]} {extra[user]} {message}")context_logger = logger.bind(ip="192.168.0.1", user="someone")context_logger.info("Contextualize your logger easily")context_logger.bind(user="someone_else").info("Inline binding of extra attribute")context_logger.info("Use kwargs to add context during formatting: {user}", user="anybody")
# 粒度控制logger.add("special.log", filter=lambda record: "special" in record["extra"])logger.debug("This message is not logged to the file")logger.bind(special=True).info("This message, though, is logged to the file!")
# patch()方法的用處logger.add(sys.stderr, format="{extra[utc]} {message}")logger = logger.patch(lambda record: record["extra"].update(utc=datetime.utcnow()))

[10] 惰性計算

  • 有時希望在生產環境中記錄詳細信息而不會影響性能,可以使用opt()方法來實現這一點。

logger.opt(lazy=True).debug("If sink level <= DEBUG: {x}", x=lambda: expensive_function(2**64))
# By the way, "opt()" serves many usageslogger.opt(exception=True).info("Error stacktrace added to the log message (tuple accepted too)")logger.opt(colors=True).info("Per message colors")logger.opt(record=True).info("Display values from the record (eg. {record[thread]})")logger.opt(raw=True).info("Bypass sink formatting
")logger.opt(depth=1).info("Use parent stack context (useful within wrapped functions)")logger.opt(capture=False).info("Keyword arguments not added to {dest} dict", dest="extra")

[11] 可定制的級別

new_level = logger.level("SNAKY", no=38, color="", icon="")logger.log("SNAKY", "Here we go!")

[12] 適用于腳本和庫

# For scriptsconfig = {    "handlers": [        {"sink": sys.stdout, "format": "{time} - {message}"},        {"sink": "file.log", "serialize": True},    ],    "extra": {"user": "someone"}}logger.configure(**config)
# For librarieslogger.disable("my_library")logger.info("No matter added sinks, this message is not displayed")logger.enable("my_library")logger.info("This message however is propagated to the sinks")

[13] 完全兼容標準日志記錄

  • 希望使用Loguru作為內置的日志處理程序?

  • 需要將Loguru消息到標準日志?

  • 想要攔截標準的日志消息到Loguru中匯總?

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

class PropagateHandler(logging.Handler):    def emit(self, record):        logging.getLogger(record.name).handle(record)
logger.add(PropagateHandler(), format="{message}")
class InterceptHandler(logging.Handler):    def emit(self, record):        # Get corresponding Loguru level if it exists        try:            level = logger.level(record.levelname).name        except ValueError:            level = record.levelno
        # Find caller from where originated the logged message        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=[InterceptHandler()], level=0)

[14] 方便的解析器

  • 從生成的日志中提取特定的信息通常很有用,這就是為什么Loguru提供了一個parse()方法來幫助處理日志和正則表達式。

pattern = r"(?Pcaster_dict = dict(time=dateutil.parser.parse, level=int)        # Transform matching groups
for groups in logger.parse("file.log", pattern, cast=caster_dict):    print("Parsed:", groups)    # {"level": 30, "message": "Log example", "time": datetime(2018, 12, 09, 11, 23, 55)}

[15] 通知機制

import notifiers
params = {    "username": "you@gmail.com",    "password": "abc123",    "to": "dest@gmail.com"}
# Send a single notificationnotifier = notifiers.get_notifier("gmail")notifier.notify(message="The application is running!", **params)
# Be alerted on each error messagefrom notifiers.logging import NotificationHandler
handler = NotificationHandler("gmail", defaults=params)logger.add(handler, level="ERROR")

[16] Flask 框架集成

  • 現在最關鍵的一個問題是如何兼容別的logger,比如說tornado或者django有一些默認的logger

  • 經過研究,最好的解決方案是參考官方文檔的,完全整合logging的工作方式。比如下面將所有的logging都用logurulogger再發送一遍消息。

import loggingimport sys
from pathlib import Path
from flask import Flaskfrom loguru import logger
app = Flask(__name__)
class InterceptHandler(logging.Handler):    def emit(self, record):        logger_opt = logger.opt(depth=6, exception=record.exc_info)        logger_opt.log(record.levelname, record.getMessage())
def configure_logging(flask_app: Flask):    """配置日志"""    path = Path(flask_app.config['LOG_PATH'])    if not path.exists():        path.mkdir(parents=True)    log_name = Path(path, 'sips.log')
    logging.basicConfig(handlers=[InterceptHandler(level='INFO')], level='INFO')    # 配置日志到標準輸出流    logger.configure(handlers=[{"sink": sys.stderr, "level": 'INFO'}])    # 配置日志到輸出到文件    logger.add(log_name, rotation="500 MB", encoding='utf-8', colorize=False, level='INFO')

4. 要點解析

介紹,主要函數的使用方法和細節 - add()的創建和刪除

  • add() - 非常重要的參數sink參數

    • 具體的實現規范可以參見官方文檔

    • 可以實現自定義Handler的配置,比如FileHandlerStreamHandler等等

    • 可以自行定義輸出實現

    • 代表文件路徑,會自動創建對應路徑的日志文件并將日志輸出進去

    • 例如sys.stderr或者open('file.log', 'w')都可以

    • 可以傳入一個file對象

    • 可以直接傳入一個str字符串或者pathlib.Path對象

    • 可以是一個方法

    • 可以是一個logging模塊的Handler

    • 可以是一個自定義的類

def add(self, sink, *,    level=_defaults.LOGURU_LEVEL, format=_defaults.LOGURU_FORMAT,    filter=_defaults.LOGURU_FILTER, colorize=_defaults.LOGURU_COLORIZE,    serialize=_defaults.LOGURU_SERIALIZE, backtrace=_defaults.LOGURU_BACKTRACE,    diagnose=_defaults.LOGURU_DIAGNOSE, enqueue=_defaults.LOGURU_ENQUEUE,    catch=_defaults.LOGURU_CATCH, **kwargs):
  • 另外添加sink之后我們也可以對其進行刪除,相當于重新刷新并寫入新的內容。刪除的時候根據剛剛add方法返回的id進行刪除即可。可以發現,在調用remove方法之后,確實將歷史log刪除了。但實際上這并不是刪除,只不過是將sink對象移除之后,在這之前的內容不會再輸出到日志中,這樣我們就可以實現日志的刷新重新寫入操作

from loguru import logger
trace = logger.add('runtime.log')logger.debug('this is a debug message')logger.remove(trace)logger.debug('this is another debug message')

原文鏈接:https://www.escapelife.site/posts/d4521b7.html

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 輸出
    +關注

    關注

    0

    文章

    96

    瀏覽量

    22819
  • 日志
    +關注

    關注

    0

    文章

    146

    瀏覽量

    11063
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90025

原文標題:使用loguru優雅的輸出日志

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    模組日志功能技術概覽

    模組日志功能技術方案以低侵入、高可用為原則,提供統一的日志API、多級日志分類與條件輸出機制。通過集成該技術,開發者可在不干擾業務邏輯的前提下,全面掌握模組的執行狀態與異常行為。 一、
    的頭像 發表于 01-14 15:32 ?129次閱讀
    模組<b class='flag-5'>日志</b>功能技術概覽

    電能質量在線監測裝支持用戶操作日志審計嗎?

    1. 日志記錄的核心內容 記錄類別 具體操作內容 關鍵信息要素 用戶登錄 成功登錄、失敗登錄(密碼錯誤 / 權限不足)、超時退出 用戶名、IP 地址、時間、結果 配置修改 參數設置、閾值調整、通信配置變更、用戶權限管理 操作人
    的頭像 發表于 12-11 16:48 ?1207次閱讀
    電能質量在線監測裝支持用戶操作<b class='flag-5'>日志</b>審計嗎?

    電能質量在線監測裝置數據日志能加密存儲嗎?

    加密的技術實現方式 1. 加密算法與分級策略 日志類型 推薦加密算法 密鑰管理方式 適用場景 敏感日志(事件記錄、故障數據、用戶信息) AES-256 (高級加密標準) 硬件安全模塊(HSM/TPM/SE)管理密鑰 電網關口、新
    的頭像 發表于 12-05 10:16 ?609次閱讀
    電能質量在線監測裝置數據<b class='flag-5'>日志</b>能加密存儲嗎?

    AMD助力Medilit開發AI醫療記錄解決方案

    Medilit 意識到醫療專業人員在患者護理和文檔記錄方面投入頗多。AI Scribe( AI 記錄助手)通過簡化工作流程并提高效率,改善了醫生的日常診療安排。該解決方案使醫生能夠接診更多患者,同時
    的頭像 發表于 10-27 15:33 ?5976次閱讀

    Python 給 Amazon 做“全身 CT”——可量產、可擴展的商品詳情爬蟲實戰

    一、技術選型:為什么選 Python 而不是 Java? 結論: “調研階段用 Python,上線后如果 QPS 爆表再考慮 Java 重構。” 二、整體架構速覽(3 分鐘看懂) 三、開發前準備(5
    的頭像 發表于 10-21 16:59 ?515次閱讀
    用 <b class='flag-5'>Python</b> 給 Amazon 做“全身 CT”——可量產、可擴展的商品詳情爬蟲實戰

    termux調試python猜數字游戲

    )) ``` --- ? 五、備用解決方案(如果Python不可用) ```bash Bash腳本版(保存為guess.sh) #!/data/data/com.termux/files/usr/bin/bash
    發表于 08-29 17:15

    python app不能運行怎么解決?

    我使用helloword的模板,上傳了IG502,但不能運行,請大神幫忙。系統日志如下:sntpc[1226]: ntp request error: 113, No route to host
    發表于 08-06 06:27

    C++ 與 Python:樹莓派上哪種語言更優

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯網項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發表于 07-24 15:32 ?947次閱讀
    C++ 與 <b class='flag-5'>Python</b>:樹莓派上哪種語言<b class='flag-5'>更優</b>?

    電商API日志分析的實用工具

    ? 在當今數字化電商時代,API(應用程序編程接口)已成為平臺與外部系統交互的核心通道。電商API日志記錄了每一次請求的詳細信息,包括用戶行為、交易狀態、錯誤響應等。分析這些日志能幫助企業監控性能
    的頭像 發表于 07-23 15:50 ?652次閱讀
    電商API<b class='flag-5'>日志</b>分析的實用工具

    Centos7分用戶記錄歷史命令至日志文件教程

    在企業級Linux運維中,實時記錄用戶操作歷史是審計排查的關鍵步驟。本文華納云針對CentOS7系統,提供三種高效方案實現分用戶日志記錄+防篡改管理。所有步驟均經過實際驗證,代碼段內含
    的頭像 發表于 06-28 14:50 ?813次閱讀

    詳解journalctl日志管理

    systemd 提供了自己的日志系統(logging system),稱為 journal。使用 systemd 日志,無需額外安裝日志服務(syslog)。
    的頭像 發表于 06-05 17:22 ?1541次閱讀
    詳解journalctl<b class='flag-5'>日志</b>管理

    DevEcoStudio 中使用模擬器時如何過濾日志

    /JSAPP(打印內容) 操作后在控制臺查看就行了 其他 日志內容類型 啟動相關日志記錄模擬器啟動過程中的各種信息,如加載系統鏡像、初始化硬件設備、配置網絡等操作的結果和狀態。如果模擬器啟動失敗
    發表于 05-23 10:46

    如何在CentOS系統中部署ELK日志分析系統

    日志分析已成為企業監控、故障排查和性能優化的重要組成部分。ELK(Elasticsearch、Logstash 和 Kibana)堆棧作為一種強大的開源解決方案,提供了高效的日志收集、存儲和可視化
    的頭像 發表于 05-08 11:47 ?1032次閱讀
    如何在CentOS系統中部署ELK<b class='flag-5'>日志</b>分析系統

    基于RV1126開發板限制系統日志大小教程

    無論管理什么系統,對日志文件的監控、調用、管理都是其中重要的一部分。服務器問題的解決都是從查看系統(錯誤)日志開始的。系統日志記錄系統硬件狀況、內核動作、軟件啟動、用戶動作等各項信息
    的頭像 發表于 04-16 11:18 ?734次閱讀
    基于RV1126開發板限制系統<b class='flag-5'>日志</b>大小教程

    云翎智能單北斗執法記錄儀的AI智能識別與云端協同解決方案

    -云端智判-高效協同”的一體化解決方案。云翎智能單北斗工作記錄儀一、方案核心架構:北斗+AI+云端的深度融合云翎智能單北斗執法記錄儀通過“厘米級定位+實時AI識別+云
    的頭像 發表于 04-08 11:35 ?964次閱讀
    云翎智能單北斗執法<b class='flag-5'>記錄</b>儀的AI智能識別與云端協同<b class='flag-5'>解決方案</b>