CentOS下Python日志管理操作指南
確保CentOS系統已安裝Python 3及pip(Python包管理器),若未安裝可通過以下命令完成:
sudo yum install python3 python3-pip -y
驗證安裝:
python3 --version # 檢查Python版本
pip3 --version # 檢查pip版本
使用logging.basicConfig()
快速設置日志輸出到文件和控制臺,適用于簡單場景:
import logging
# 配置日志:級別(DEBUG/INFO/WARNING/ERROR/CRITICAL)、格式、文件、模式
logging.basicConfig(
level=logging.INFO, # 設置最低日志級別(低于此級別的不記錄)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 日志格式(時間、模塊名、級別、消息)
filename='app.log', # 日志文件路徑(當前目錄)
filemode='a' # 文件模式('a'=追加,'w'=覆蓋)
)
# 獲取logger實例(推薦使用模塊名__name__,便于區分不同模塊日志)
logger = logging.getLogger(__name__)
# 記錄不同級別日志
logger.debug('Debug信息(調試用,生產環境建議關閉)')
logger.info('程序正常運行的信息')
logger.warning('警告信息(潛在問題)')
logger.error('錯誤信息(功能異常)')
logger.critical('嚴重錯誤信息(系統可能崩潰)')
運行腳本后,當前目錄會生成app.log
文件,包含上述日志內容。
當日志文件過大時,需通過輪轉壓縮舊日志,節省存儲空間。Python提供兩種輪轉方式:
當日志文件達到指定大?。ㄈ?0MB)時,自動創建新文件并保留指定數量(如5個)的舊日志:
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
# 創建RotatingFileHandler:maxBytes=10MB,backupCount=5(保留5個備份)
handler = RotatingFileHandler(
'app_rotating.log',
maxBytes=10 * 1024 * 1024, # 10MB
backupCount=5
)
handler.setLevel(logging.INFO)
# 設置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 添加處理器到logger
logger.addHandler(handler)
# 測試日志記錄
for i in range(1000):
logger.info(f'這是第{i}條日志信息')
運行后,會生成app_rotating.log
(當前日志)和app_rotating.log.1
~app_rotating.log.5
(舊日志)。
按時間間隔(如每天、每小時)自動創建新日志文件,適合長期運行的應用:
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
# 創建TimedRotatingFileHandler:when='midnight'(每天凌晨),interval=1(每天),backupCount=7(保留7天)
handler = TimedRotatingFileHandler(
'app_timed.log',
when='midnight', # 時間間隔(midnight=凌晨0點,hourly=每小時)
interval=1, # 間隔數量(如1表示每天/每小時)
backupCount=7 # 保留舊日志天數
)
handler.setLevel(logging.INFO)
# 設置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 添加處理器到logger
logger.addHandler(handler)
# 測試日志記錄
logger.info('這是一條按時間輪轉的日志')
運行后,每天凌晨會生成新的app_timed.log
,并保留最近7天的舊日志。
若需將Python日志集成到CentOS系統日志(如/var/log/messages
),可使用SysLogHandler
:
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
# 創建SysLogHandler:address='/dev/log'(CentOS系統日志地址)
handler = SysLogHandler(address='/dev/log')
handler.setLevel(logging.INFO)
# 設置日志格式(syslog專用格式)
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s')
handler.setFormatter(formatter)
# 添加處理器到logger
logger.addHandler(handler)
# 測試日志記錄
logger.info('這是一條發送到系統日志的信息')
運行后,日志會出現在/var/log/messages
中(需root權限查看):
sudo tail -f /var/log/messages
對于復雜項目,建議使用INI格式的配置文件(如logging.conf
)管理日志,便于維護和修改:
logging.conf
[loggers]
keys=root,my_logger # 定義logger名稱(root為根logger,my_logger為自定義logger)
[handlers]
keys=fileHandler,consoleHandler # 定義處理器名稱(fileHandler=文件,consoleHandler=控制臺)
[formatters]
keys=simpleFormatter # 定義格式化器名稱
# 配置root logger(默認logger)
[logger_root]
level=DEBUG
handlers=consoleHandler # 只輸出到控制臺
# 配置自定義logger(my_logger)
[logger_my_logger]
level=INFO
handlers=fileHandler,consoleHandler # 輸出到文件和控制臺
qualname=my_logger # logger名稱(需與代碼中getLogger一致)
propagate=0 # 是否向父logger傳遞(0=不傳遞)
# 配置文件處理器
[handler_fileHandler]
class=FileHandler
level=INFO
formatter=simpleFormatter
args=('app_config.log', 'a') # 日志文件路徑和模式
# 配置控制臺處理器
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,) # 輸出到控制臺
# 配置格式化器
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S # 時間格式
import logging
import logging.config
# 加載配置文件
logging.config.fileConfig('logging.conf')
# 獲取自定義logger
logger = logging.getLogger('my_logger')
# 記錄日志
logger.debug('Debug信息(不會輸出到文件,因為fileHandler級別為INFO)')
logger.info('Info信息(輸出到文件和控制臺)')
logger.warning('Warning信息(輸出到文件和控制臺)')
配置文件的優勢在于:集中管理日志設置(如級別、格式、處理器),無需修改代碼即可調整日志行為。
使用cat
、tail
等命令查看日志文件內容:
cat app.log # 查看完整日志
tail -f app.log # 實時查看日志更新(按Ctrl+C退出)
tail -n 20 app.log # 查看最后20行日志
若需更強大的日志輪轉功能(如自動壓縮、刪除舊日志),可使用CentOS自帶的logrotate
工具。創建自定義配置文件/etc/logrotate.d/my_python_app
:
/var/log/myapp.log { # 日志文件路徑(需與Python日志路徑一致)
daily # 每天輪轉
rotate 7 # 保留7個舊日志
compress # 壓縮舊日志(如app.log.1.gz)
missingok # 日志文件不存在時不報錯
notifempty # 日志為空時不輪轉
create 640 root adm # 創建新日志的權限和所有者
}
測試logrotate配置:
sudo logrotate -vf /etc/logrotate.d/my_python_app # 強制輪轉并顯示詳細信息
logrotate會自動處理日志輪轉,無需修改Python代碼。
INFO
或WARNING
,避免輸出過多DEBUG
日志影響性能;開發環境可設置為DEBUG
方便排查問題。chmod 755 /path/to/logs
),避免因權限問題導致日志無法寫入。Formatter
或Filter
過濾。concurrent-log-handler
庫),避免阻塞主線程。