Python使用colorlog庫為日志添加色彩編碼
還在看單調的黑白日志嗎?給日志加點顏色,讓調試變得更高效!
前言:為什么需要彩色日志?
在日常開發(fā)和調試中,日志是我們最親密的伙伴。但是,面對密密麻麻的黑白日志文本,快速定位錯誤、警告或關鍵信息往往如同大海撈針。這時候,colorlog 庫就能大顯身手了!它能為不同級別的日志信息添加不同的顏色,讓日志輸出一目了然,大大提升調試效率。
使用 colorlog 為日志添加色彩編碼,能讓不同嚴重級別的信息一目了然,從而提升調試體驗。
什么是 colorlog?
colorlog 是一個 Python 日志格式化工具,它擴展了 Python 標準庫中的 logging 模塊,專門用于在終端輸出帶顏色的日志 。通過為不同日志級別配置不同顏色,我們可以快速區(qū)分 DEBUG、INFO、WARNING、ERROR 等級別的信息。
安裝 colorlog
安裝 colorlog 非常簡單,只需使用 pip:
pip install colorlog
基礎用法:快速上手
讓我們先來看一個簡單的例子,了解 colorlog 的基本使用方法:
import colorlog
import logging
# 創(chuàng)建 logger 實例
logger = colorlog.getLogger('example')
# 創(chuàng)建 StreamHandler
handler = colorlog.StreamHandler()
# 設置格式化器
handler.setFormatter(colorlog.ColoredFormatter(
'%(log_color)s%(levelname)s:%(name)s:%(message)s'
))
# 添加 handler 到 logger
logger.addHandler(handler)
# 設置日志級別
logger.setLevel(logging.DEBUG)
# 測試不同級別的日志輸出
logger.debug("這是一條 DEBUG 級別的日志")
logger.info("這是一條 INFO 級別的日志")
logger.warning("這是一條 WARNING 級別的日志")
logger.error("這是一條 ERROR 級別的日志")
logger.critical("這是一條 CRITICAL 級別的日志")
運行上面的代碼,你將在終端中看到不同顏色的日志輸出,默認情況下:
- DEBUG:青色
- INFO:綠色
- WARNING:黃色
- ERROR:紅色
- CRITICAL:紅色背景白色文字
核心組件詳解
ColoredFormatter 類
ColoredFormatter 是 colorlog 的核心類,它繼承自 Python 標準的 logging.Formatter,專門用于生成帶顏色的日志輸出 。
主要參數(shù)說明:
format:用于輸出日志的格式化字符串(必需)datefmt:可選的日期格式,傳遞給基類reset:默認為 True,表示在消息輸出結束時添加顏色重置代碼log_colors:日志級別到顏色名稱的映射secondary_log_colors:定義在格式化字符串中可用的其他顏色style:在 Python 3.2 以上版本可用
顏色配置詳解
colorlog 支持豐富的顏色配置選項:
基本顏色名稱: black, red, green, yellow, blue, purple, cyan, white
顏色前綴:
fg_{color}:設置前景色(文字顏色)bg_{color}:設置背景色bold、bold_{color}:設置粗體/亮色
特殊代碼:
reset:清除所有格式(包括前景色和背景色)
高級配置技巧
1. 自定義日志顏色
你可以完全自定義每個日志級別的顏色:
from colorlog import ColoredFormatter
formatter = ColoredFormatter(
"%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s",
datefmt=None,
reset=True,
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
},
secondary_log_colors={},
style='%'
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger = logging.getLogger('custom_example')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
2. 使用輔助顏色
secondary_log_colors 允許你為同一日志消息的不同部分設置不同的顏色規(guī)則:
formatter = ColoredFormatter(
"%(log_color)s%(levelname)-8s%(reset)s %(message_log_color)s%(message)s",
secondary_log_colors={
'message': {
'ERROR': 'red',
'CRITICAL': 'red'
}
}
)
這個配置會讓 ERROR 和 CRITICAL 級別的日志消息本身顯示為紅色,而其他級別的消息保持默認顏色 。
3. 使用字典配置
對于大型項目,推薦使用 dictConfig 進行配置:
import logging.config
logging.config.dictConfig({
'formatters': {
'colored': {
'()': 'colorlog.ColoredFormatter',
'format': "%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s"
}
},
'handlers': {
'stream': {
'class': 'logging.StreamHandler',
'formatter': 'colored',
},
},
'root': {
'handlers': ['stream'],
'level': 'DEBUG',
}
})
logger = logging.getLogger('dict_config_example')
4. 配置文件方式
你也可以使用 .ini 格式的配置文件:
[loggers] keys=root [logger_root] handlers=stream level=DEBUG [formatters] keys=color [formatter_color] class=colorlog.ColoredFormatter format=%(log_color)s%(levelname)s:%(name)s:%(message)s datefmt=%H:%M:%S [handlers] keys=stream [handler_stream] class=StreamHandler formatter=color args=()
然后在代碼中加載配置:
import logging
import logging.config
logging.config.fileConfig('logging_config.ini')
logger = logging.getLogger('config_file_example')
實際應用示例
在 FastAPI 項目中使用 colorlog
讓我們看看如何在 FastAPI 項目中使用 colorlog 來美化日志輸出:
import colorlog
import logging
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
# 配置日志
handler = colorlog.StreamHandler()
formatter = colorlog.ColoredFormatter(
"%(log_color)s%(asctime)s - %(levelname)-8s%(reset)s %(blue)s%(name)-15s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
log_colors={
'DEBUG': 'cyan',
'INFO': 'bold_green',
'WARNING': 'bold_yellow',
'ERROR': 'bold_red',
'CRITICAL': 'bold_red,bg_white',
}
)
handler.setFormatter(formatter)
# 為 FastAPI 相關日志器配置 colorlog
uvicorn_logger = logging.getLogger("uvicorn")
uvicorn_logger.handlers = []
uvicorn_logger.addHandler(handler)
uvicorn_logger.setLevel(logging.DEBUG)
uvicorn_access = logging.getLogger("uvicorn.access")
uvicorn_access.handlers = []
uvicorn_access.addHandler(handler)
app = FastAPI(title="Colorful API", version="1.0.0")
logger = colorlog.getLogger("api")
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
class Item(BaseModel):
name: str
description: str = None
price: float
@app.get("/")
async def read_root():
logger.info("訪問根路徑")
return {"message": "歡迎使用彩色日志 API!"}
@app.post("/items/")
async def create_item(item: Item):
logger.debug(f"創(chuàng)建商品: {item.name}, 價格: {item.price}")
if item.price <= 0:
logger.warning(f"商品價格無效: {item.price}")
raise HTTPException(status_code=400, detail="價格必須大于0")
logger.info(f"成功創(chuàng)建商品: {item.name}")
return {"status": "success", "item": item}
@app.get("/error-test")
async def error_test():
try:
# 模擬一個錯誤
result = 1 / 0
except Exception as e:
logger.error(f"發(fā)生錯誤: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail="內部服務器錯誤")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000, log_config=None)
同時輸出到控制臺和文件
有時候,我們既想要在控制臺看到彩色日志,又希望將日志保存到文件中(不包含顏色代碼):
import colorlog
import logging
# 創(chuàng)建 logger
logger = colorlog.getLogger('multi_handler')
# 控制臺 Handler(帶顏色)
console_handler = colorlog.StreamHandler()
console_formatter = colorlog.ColoredFormatter(
"%(log_color)s%(asctime)s %(levelname)-8s%(reset)s %(blue)s%(message)s",
datefmt="%H:%M:%S"
)
console_handler.setFormatter(console_formatter)
# 文件 Handler(無顏色)
file_handler = logging.FileHandler('app.log')
file_formatter = logging.Formatter(
"%(asctime)s %(levelname)-8s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
file_handler.setFormatter(file_formatter)
# 添加兩個 handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)
logger.setLevel(logging.DEBUG)
# 測試日志
logger.info("這條消息會同時顯示在控制臺(帶顏色)和文件(無顏色)中")
自定義日志級別
你甚至可以創(chuàng)建自定義的日志級別并為其指定顏色:
import logging
import colorlog
# 創(chuàng)建自定義日志級別
TRACE = 5
logging.addLevelName(TRACE, 'TRACE')
# 添加 trace 方法到 logger
def trace(self, message, *args, **kws):
if self.isEnabledFor(TRACE):
self._log(TRACE, message, args, **kws)
logging.Logger.trace = trace
# 配置 colorlog 包含自定義級別
formatter = colorlog.ColoredFormatter(
log_colors={
'TRACE': 'yellow',
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
},
format='%(log_color)s%(levelname)-8s%(reset)s %(message)s'
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger = colorlog.getLogger('custom_level')
logger.addHandler(handler)
logger.setLevel(TRACE)
# 使用自定義級別
logger.trace("這是一條 TRACE 級別的日志")
注意事項和最佳實踐
- 兼容性:colorlog 主要適用于終端輸出,在文件日志中顏色代碼可能會顯示為亂碼。
- 性能:在生產環(huán)境中,可以考慮根據(jù)環(huán)境變量決定是否啟用彩色日志,以減少不必要的性能開銷。
- 一致性:在團隊項目中,建議統(tǒng)一顏色配置,確保所有成員對顏色含義有相同的理解。
- 可訪問性:考慮到色盲或色弱用戶,不要完全依賴顏色來區(qū)分日志級別,還應該保留文字級別的信息。
以上就是Python使用colorlog庫為日志添加色彩編碼的詳細內容,更多關于Python colorlog日志顏色的資料請關注腳本之家其它相關文章!
相關文章
Python流程控制之for循環(huán)與range函數(shù)的搭配使用教學
本文介紹了for循環(huán)與range函數(shù)的搭配使用在Python編程中的重要性,包括核心概念、應用場景、技術原理、實踐應用、常見問題與解決方案、最佳實踐等內容,希望對大家有所幫助2026-05-05
django 數(shù)據(jù)庫 get_or_create函數(shù)返回值是tuple的問題
這篇文章主要介紹了django 數(shù)據(jù)庫 get_or_create函數(shù)返回值是tuple的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Pytorch 實現(xiàn)sobel算子的卷積操作詳解
今天小編就為大家分享一篇Pytorch 實現(xiàn)sobel算子的卷積操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

