網站首頁 編程語言 正文
一. 使用logging模塊時
用python寫代碼時,logging模塊最基本的幾行配置,如下:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info('this is another debug message')
logger.warning('this is another debug message')
logger.error('this is another debug message')
logger.info('this is another debug message')
執行結果如下:
二. loguru模塊的基礎使用
如果想更簡潔,可用loguru庫,python3安裝:pip3 install loguru。
loguru默認的輸出格式是上面的內容,有時間、級別、模塊名、行號以及日志信息,不需要手動創建 logger,直接使用即可,另外其輸出還是彩色的,看起來會更加友好。
用法如下:
from loguru import logger
logger.debug('this is a debug message')
logger.info('this is another debug message')
logger.warning('this is another debug message')
logger.error('this is another debug message')
logger.info('this is another debug message')
logger.success('this is success message!')
logger.critical('this is critical message!')
執行結果如下:
不需要配置什么東西,直接引入一個 logger,然后調用其 debug 方法即可。
如果想要輸出到文件,只需要:
from loguru import logger
logger.add('my_log.log')
logger.debug('this is a debug')
運行之后會發現目錄下 my_log.log 出現了剛剛控制臺輸出的 DEBUG 信息。上面只是基礎用法,更詳細的在下面
三. logurr詳細使用
比如支持輸出到多個文件,分級別分別輸出,過大創建新文件,過久自動刪除等等。
3.1 add 方法的定義
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
):
pass
看看它的源代碼,它支持這么多的參數,如 level、format、filter、color 等等,另外我們還注意到它有個非常重要的參數 sink,我們看看官方文檔:,可以了解到通過 sink 我們可以傳入多種不同的數據結構,匯總如下:
- sink 可以傳入一個 file 對象,例如 sys.stderr 或者 open(‘file.log’, ‘w’) 都可以。
- sink 可以直接傳入一個 str 字符串或者 pathlib.Path 對象,其實就是代表文件路徑的,如果識別到是這種類型,它會自動創建對應路徑的日志文件并將日志輸出進去。
- sink 可以是一個方法,可以自行定義輸出實現。
- sink 可以是一個 logging 模塊的 Handler,比如 FileHandler、StreamHandler 等等。
- sink 還可以是一個自定義的類,具體的實現規范可以參見官方文檔https://loguru.readthedocs.io/en/stable/api/logger.html#sink。
所以說,剛才我們所演示的輸出到文件,僅僅給它傳了一個 str 字符串路徑,他就給我們創建了一個日志文件,就是這個原理。
3.2 基本參數
下面我們再了解下它的其他參數,例如 format、filter、level 等等。
其實它們的概念和格式和 logging 模塊都是基本一樣的了,例如這里使用 format、filter、level 來規定輸出的格式:
logger.add('runtime.log', format="{time} {level} {message}", filter="my_module", level="INFO")
3.3 刪除 sink
另外添加 sink 之后我們也可以對其進行刪除,相當于重新刷新并寫入新的內容。
刪除的時候根據剛剛 add 方法返回的 id 進行刪除即可,看下面的例子:
from loguru import logger
trace = logger.add('my_log.log')
logger.debug('this is a debug message')
logger.remove(trace)
logger.debug('this is another debug message')
看這里,我們首先 add 了一個 sink,然后獲取它的返回值,賦值為 trace。隨后輸出了一條日志,然后將 trace 變量傳給 remove 方法,再次輸出一條日志,看看結果是怎樣的。
控制臺輸出如下:
日志文件 my_log.log 內容如下:
可以發現,在調用 remove 方法之后,確實將歷史 log 刪除了。但實際上這并不是刪除,只不過是將 sink 對象移除之后,在這之前的內容不會再輸出到日志中。
這樣我們就可以實現日志的刷新重新寫入操作。
3.4 rotation 配置
用了 loguru 我們還可以非常方便地使用 rotation 配置,比如我們想一天輸出一個日志文件,或者文件太大了自動分隔日志文件,我們可以直接使用 add 方法的 rotation 參數進行配置。
我們看看下面的例子:
logger.add('runtime_{time}.log', rotation="500 MB")
通過這樣的配置我們就可以實現每 500MB 存儲一個文件,每個 log 文件過大就會新創建一個 log 文件。我們在配置 log 名字時加上了一個 time 占位符,這樣在生成時可以自動將時間替換進去,生成一個文件名包含時間的 log 文件。
另外我們也可以使用 rotation 參數實現定時創建 log 文件,例如:
logger.add('runtime_{time}.log', rotation='00:00')
這樣就可以實現每天 0 點新創建一個 log 文件輸出了。
另外我們也可以配置 log 文件的循環時間,比如每隔一周創建一個 log 文件,寫法如下:
logger.add('runtime_{time}.log', rotation='1 week')
這樣我們就可以實現一周創建一個 log 文件了。
3.5 retention 配置
很多情況下,一些非常久遠的 log 對我們來說并沒有什么用處了,它白白占據了一些存儲空間,不清除掉就會非常浪費。retention 這個參數可以配置日志的最長保留時間。
比如我們想要設置日志文件最長保留 10 天,可以這么來配置:
logger.add('runtime.log', retention='10 days')
這樣 log 文件里面就會保留最新 10 天的 log,媽媽再也不用擔心 log 沉積的問題啦。
3.6 compression 配置
loguru 還可以配置文件的壓縮格式,比如使用 zip 文件格式保存,示例如下:
logger.add('runtime.log', compression='zip')
這樣可以更加節省存儲空間。
3.7 字符串格式化
loguru 在輸出 log 的時候還提供了非常友好的字符串格式化功能,像這樣:
logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')
這樣在添加參數就非常方便了。
3.8 Traceback 記錄
在很多情況下,如果遇到運行錯誤,而我們在打印輸出 log 的時候萬一不小心沒有配置好 Traceback 的輸出,很有可能我們就沒法追蹤錯誤所在了。
但用了 loguru 之后,我們用它提供的裝飾器就可以直接進行 Traceback 的記錄,類似這樣的配置即可:
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return 1 / (x + y + z)
我們做個測試,我們在調用時三個參數都傳入 0,直接引發除以 0 的錯誤,看看會出現什么情況:
my_function(0, 0, 0)
運行完畢之后,可以發現 log 里面就出現了 Traceback 信息,而且給我們輸出了當時的變量值,真的是不能再贊了!結果如下:
> File "run.py", line 15, in <module>
my_function(0, 0, 0)
└ <function my_function at 0x1171dd510>
File "/private/var/py/logurutest/demo5.py", line 13, in my_function
return 1 / (x + y + z)
│ │ └ 0
│ └ 0
└ 0
ZeroDivisionError: division by zero
因此,用 loguru 可以非常方便地實現日志追蹤,debug 效率可能要高上十倍了?
另外 loguru 還有很多很多強大的功能,這里就不再一一展開講解了,更多的內容大家可以看看 loguru 的官方文檔詳細了解一下:https://loguru.readthedocs.io/en/stable/index.html。
看完之后,是時候把自己的 logging 模塊替換成 loguru 啦!
原文鏈接:https://cuiyonghua.blog.csdn.net/article/details/107498535
相關推薦
- 2022-10-30 系統應用根據Uri授予權限方法詳解_Android
- 2022-03-31 用Python實現石頭剪刀布游戲_python
- 2022-01-03 當前時間與新年倒計時
- 2022-07-14 如何修改numpy?array的數據類型_python
- 2022-07-08 C語言完整實現12種排序算法(小結)_C 語言
- 2023-12-23 React環境安裝配置
- 2022-11-24 PyTorch?Dataset與DataLoader使用超詳細講解_python
- 2022-11-16 PyTorch中torch.utils.data.DataLoader實例詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支