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提供两种轮转方式:
当日志文件达到指定大小(如10MB)时,自动创建新文件并保留指定数量(如5个)的旧日志:
from logging.handlers import RotatingFileHandlerlogger = logging.getLogger('my_logger')logger.setLevel(logging.INFO)# 创建RotatingFileHandler:maxBytes=10MB,backupCount=5(保留5个备份)handler = RotatingFileHandler('app_rotating.log',maxBytes=10 * 1024 * 1024,# 10MBbackupCount=5)handler.setLevel(logging.INFO)# 设置日志格式formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)# 添加处理器到loggerlogger.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 TimedRotatingFileHandlerlogger = 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)# 添加处理器到loggerlogger.addHandler(handler)# 测试日志记录logger.info('这是一条按时间轮转的日志')运行后,每天凌晨会生成新的app_timed.log,并保留最近7天的旧日志。
若需将Python日志集成到CentOS系统日志(如/var/log/messages),可使用SysLogHandler:
import loggingfrom logging.handlers import SysLogHandlerlogger = 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)# 添加处理器到loggerlogger.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=DEBUGhandlers=consoleHandler# 只输出到控制台# 配置自定义logger(my_logger)[logger_my_logger]level=INFOhandlers=fileHandler,consoleHandler# 输出到文件和控制台qualname=my_logger# logger名称(需与代码中getLogger一致)propagate=0 # 是否向父logger传递(0=不传递)# 配置文件处理器[handler_fileHandler]class=FileHandlerlevel=INFOformatter=simpleFormatterargs=('app_config.log', 'a')# 日志文件路径和模式# 配置控制台处理器[handler_consoleHandler]class=StreamHandlerlevel=DEBUGformatter=simpleFormatterargs=(sys.stdout,)# 输出到控制台# 配置格式化器[formatter_simpleFormatter]format=%(asctime)s - %(name)s - %(levelname)s - %(message)sdatefmt=%Y-%m-%d %H:%M:%S# 时间格式import loggingimport logging.config# 加载配置文件logging.config.fileConfig('logging.conf')# 获取自定义loggerlogger = 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库),避免阻塞主线程。