centos

CentOS Python日志管理如何操作

小樊
42
2025-10-01 00:34:50
栏目: 编程语言

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提供两种轮转方式:

1. 按文件大小轮转(RotatingFileHandler)

当日志文件达到指定大小(如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(旧日志)。

2. 按时间轮转(TimedRotatingFileHandler)

按时间间隔(如每天、每小时)自动创建新日志文件,适合长期运行的应用:

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天的旧日志。

四、发送日志到系统日志(syslog)

若需将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)管理日志,便于维护和修改:

1. 创建配置文件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  # 时间格式

2. 代码中加载配置文件

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信息(输出到文件和控制台)')

配置文件的优势在于:集中管理日志设置(如级别、格式、处理器),无需修改代码即可调整日志行为。

六、日志查看与管理

1. 查看日志文件

使用cattail等命令查看日志文件内容:

cat app.log          # 查看完整日志
tail -f app.log      # 实时查看日志更新(按Ctrl+C退出)
tail -n 20 app.log   # 查看最后20行日志

2. 使用logrotate管理日志(系统级)

若需更强大的日志轮转功能(如自动压缩、删除旧日志),可使用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代码。

七、注意事项

  1. 日志级别选择:生产环境建议设置为INFOWARNING,避免输出过多DEBUG日志影响性能;开发环境可设置为DEBUG方便排查问题。
  2. 日志文件权限:确保日志文件的目录有写入权限(如chmod 755 /path/to/logs),避免因权限问题导致日志无法写入。
  3. 敏感信息过滤:避免在日志中记录密码、密钥等敏感信息,可通过自定义FormatterFilter过滤。
  4. 性能优化:高频日志记录(如循环内)建议使用异步日志(如concurrent-log-handler库),避免阻塞主线程。

0
看了该问题的人还看了