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 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
库),避免阻塞主线程。