Ubuntu下Python日志配置的常見方法
在Ubuntu系統中,Python日志配置主要通過內置的logging
模塊實現,支持代碼直接配置(快速測試)、配置文件配置(靈活維護)及第三方庫擴展(簡化操作)三種方式,以下是具體實現步驟:
通過logging.basicConfig()
快速設置日志級別、輸出格式和目標,適合臨時調試或簡單項目。
import logging
# 配置日志:級別(DEBUG/INFO/WARNING/ERROR/CRITICAL)、格式、輸出文件(追加模式)
logging.basicConfig(
level=logging.DEBUG, # 設置最低日志級別(低于此級別的日志不記錄)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 日志格式(時間+記錄器名+級別+消息)
datefmt='%Y-%m-%d %H:%M:%S', # 時間格式
filename='app.log', # 日志文件路徑(Ubuntu下默認在腳本同級目錄)
filemode='a' # 文件模式:'a'(追加,默認)或'w'(覆蓋)
)
# 獲取當前模塊的日志記錄器(__name__為當前模塊名,如"main")
logger = logging.getLogger(__name__)
# 記錄不同級別的日志
logger.debug('Debug信息:用于排查問題的詳細日志') # 僅在level=DEBUG時顯示
logger.info('Info信息:程序正常運行的提示') # 如功能啟動/完成
logger.warning('Warning信息:潛在問題提醒') # 如資源即將耗盡
logger.error('Error信息:程序錯誤(不影響運行)') # 如接口調用失敗
logger.critical('Critical信息:嚴重錯誤(可能導致崩潰)') # 如系統崩潰
效果:日志會同時輸出到app.log
文件和控制臺(默認行為),內容如:
2025-10-01 12:00:00 - __main__ - INFO - Info信息:程序正常運行的提示
通過INI/YAML/JSON等配置文件分離日志配置與代碼,便于團隊協作和動態調整。以下以INI配置文件為例:
logging.conf
)在Ubuntu終端使用touch logging.conf
創建文件,內容如下:
[loggers]
keys=root,fileLogger # 定義兩個記錄器:root(默認)和fileLogger(自定義)
[handlers]
keys=consoleHandler,fileHandler # 定義兩個處理器:控制臺輸出和文件輸出
[formatters]
keys=simpleFormatter # 定義一種格式化器(日志輸出格式)
# ===== 記錄器配置 =====
[logger_root]
level=INFO # root記錄器的最低級別(控制臺輸出)
handlers=consoleHandler # 關聯控制臺處理器
[logger_fileLogger]
level=DEBUG # 自定義記錄器的最低級別(文件輸出)
handlers=fileHandler # 關聯文件處理器
qualname=fileLogger # 記錄器名稱(獲取時用logging.getLogger("fileLogger"))
propagate=0 # 是否向父記錄器傳遞日志(0=不傳遞,避免重復輸出)
# ===== 處理器配置 =====
[handler_consoleHandler]
class=StreamHandler # 控制臺處理器(輸出到stdout)
level=INFO # 處理器處理的最低級別
formatter=simpleFormatter # 關聯格式化器
args=(sys.stdout,) # 參數:標準輸出流
[handler_fileHandler]
class=FileHandler # 文件處理器(輸出到文件)
level=DEBUG # 處理器處理的最低級別
formatter=simpleFormatter # 關聯格式化器
args=('app.log', 'a') # 參數:文件路徑(app.log)、模式(追加)
# ===== 格式化器配置 =====
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s # 日志格式
datefmt=%Y-%m-%d %H:%M:%S # 時間格式
import logging
import logging.config
# 加載配置文件(需指定正確路徑,如當前目錄下的logging.conf)
logging.config.fileConfig('logging.conf')
# 獲取自定義記錄器(對應配置文件中的"fileLogger")
logger = logging.getLogger("fileLogger")
# 記錄日志(僅符合fileLogger級別和處理器規則的日志會被輸出)
logger.debug('Debug信息:會寫入文件') # 寫入app.log
logger.info('Info信息:會輸出到控制臺和文件') # 同時輸出到控制臺和文件
logger.warning('Warning信息:會輸出到控制臺和文件')
效果:
INFO
及以上級別日志(如Info信息:會輸出到控制臺和文件
);app.log
文件包含DEBUG
及以上級別日志(如Debug信息:會寫入文件
)。使用loguru
庫(需安裝:pip install loguru
),無需復雜配置即可實現高級功能(如日志輪轉、格式化、異常捕獲)。
from loguru import logger
# 配置日志:輸出到文件(app.log)、日志輪轉(每天1個文件,保留7天)、格式化
logger.add("app.log",
rotation="daily", # 每天輪轉
retention="7 days", # 保留7天
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}", # 格式
level="DEBUG") # 最低級別
# 記錄日志(無需獲取記錄器,直接使用logger)
logger.debug('Debug信息:自動寫入文件')
logger.info('Info信息:自動輸出到控制臺和文件')
logger.error('Error信息:自動捕獲異常堆棧')
效果:
app.log
,并每天生成新文件(如app.log.2025-10-01
);from loguru import logger
@logger.catch # 裝飾器:自動捕獲函數內的異常并記錄日志
def divide(a, b):
return a / b
divide(10, 0) # 觸發ZeroDivisionError,日志會記錄異常堆棧
效果:
app.log
中會記錄完整的異常信息,包括錯誤類型、堆棧跟蹤和觸發位置。
日志文件長期運行會占用大量磁盤空間,需通過輪轉(按大小/時間分割)解決。以下是兩種常用方式:
import logging
from logging.handlers import TimedRotatingFileHandler
# 創建自定義記錄器
logger = logging.getLogger("rotating_logger")
logger.setLevel(logging.DEBUG)
# 創建定時輪轉處理器(每天午夜輪轉,保留30天)
handler = TimedRotatingFileHandler(
filename='app_rotating.log', # 日志文件路徑
when='midnight', # 輪轉時間(每天午夜)
interval=1, # 間隔天數
backupCount=30, # 保留天數
encoding='utf-8'
)
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
# 添加處理器到記錄器
logger.addHandler(handler)
# 記錄日志
logger.info('This log will be rotated daily.')
在logging.conf
中添加以下配置:
[handler_rotatingFileHandler]
class=logging.handlers.RotatingFileHandler # 按大小輪轉的文件處理器
level=DEBUG
formatter=simpleFormatter
args=('app_rotating.log', 'a', 1024*1024, 5) # 參數:文件路徑、模式、最大大?。?MB)、備份數量
效果:當日志文件達到1MB時,自動創建新文件(如app_rotating.log.1
),保留最近5個備份。
/var/log/python_app/
)存在且有寫入權限(可通過sudo mkdir -p /var/log/python_app
創建目錄,sudo chown $USER:$USER /var/log/python_app
修改權限)。%(LOG_DIR)s
),需通過os.environ
設置(如os.environ['LOG_DIR'] = '/var/log/python_app'
)。cron
任務定期清理舊日志(如每天凌晨刪除7天前的日志):# 編輯cron任務(crontab -e)
0 0 * * * find /var/log/python_app -name "*.log" -mtime +7 -delete
以上方法覆蓋了Ubuntu下Python日志配置的常見場景,可根據項目需求選擇合適的方式(簡單項目用代碼配置,復雜項目用配置文件,進階項目用loguru
)。