Python的log日志打印

Python日志打印,循环保存10个日志文件。

# 日志打印, logger.py
import logging
import os.path
from logging import StreamHandler
from logging.handlers import RotatingFileHandler


class Logger(object):

    def __init__(self, dirname, basename):
        """

        :param dirname: 日志路径
        :param basename: 日志名字
        """
        self.logger = logging.getLogger(basename)
        del self.logger.handlers[:]
        dirname = os.path.abspath(dirname)
        filename = os.path.join(dirname,
                                basename if basename.endswith(".log")
                                else basename + ".log")
        max_bytes = 10 * 1024 * 1024
        backup_count = 10

        if not os.path.exists(dirname):
            os.makedirs(dirname, exist_ok=True)

        formatter = logging.Formatter(
            '%(asctime)s - %(filename)s'
            '[line:%(lineno)d] - %(levelname)s'
            ': %(message)s'
        )

        stream_handler = StreamHandler()
        stream_handler.setFormatter(formatter)
        stream_handler.setLevel(logging.DEBUG)

        log_file_handler = RotatingFileHandler(filename=filename,
                                               maxBytes=max_bytes,
                                               backupCount=backup_count)
        log_file_handler.suffix = '%Y%m%d.log' if basename.endswith(".log") \
            else '%Y%m%d.' + os.path.splitext(basename)[-1]
        log_file_handler.setFormatter(formatter)
        log_file_handler.setLevel(logging.DEBUG)

        self.logger.setLevel(logging.DEBUG)
        self.logger.addHandler(log_file_handler)
        self.logger.addHandler(stream_handler)

    def get_logger(self):
        return self.logger
# 日志打印,cfg.py
from logger import Logger

# -----日志配置-----
LOG_FORMAT = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
LOG_FILE = 'log'
log = Logger('./base_logs/', LOG_FILE).get_logger()

打印日志的代码:

from cfg import log

log.info(f"{user_no}_已完成!")

有用请点个赞!!
本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.youkuaiyun.com/weixin_45092662。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

<think>好的,用户想了解如何在Python项目中设计日志打印功能,特别是使用logging模块的最佳实践。我需要结合之前提供的引用内容,整理出一个清晰的步骤指南。 首先,用户的问题涉及到日志打印的设计方案,所以需要从基础配置开始,比如创建日志记录器、设置级别和格式。引用[3]提到官方文档和realpython的教程,可以作为推荐的资源。然后引用[4]中的代码示例展示了如何配置日志格式和输出到文件,这部分应该详细说明。 接下来,分层次结构可能很重要,特别是不同模块使用不同的日志记录器,避免使用root logger。这部分可能需要结合引用[2]中的内容,说明如何根据项目需求设置不同的日志级别和方式。 然后,文件轮转和分线程处理日志也是用户可能关心的点。引用[1]提到分线程输出日志的实现,这里需要解释使用QueueHandler和QueueListener来处理多线程环境下的日志记录,避免线程安全问题。 另外,错误码整合和第三方库集成可能也是最佳实践的一部分,引用[2]提到结合错误码和第三方日志库,这里需要举例说明如何将错误码嵌入日志消息,或者如何将日志发送到外部系统。 最后,性能优化部分需要提到避免在日志语句中进行昂贵的计算,使用惰性求值,如使用%格式化的原因,以及设置适当的日志级别来减少不必要的开销。 检查是否有遗漏的点,比如日志的过滤、上下文信息的添加,或者测试中的日志配置。确保每个步骤都有对应的引用支持,比如引用[4]的配置示例,引用[1]的多线程处理等。 可能还需要注意结构化日志记录,比如输出JSON格式,便于后续分析,但可能引用中没有提到,不过可以提到使用第三方库如python-json-logger来实现。 最后,生成相关问题时要覆盖用户可能进一步想知道的内容,比如多进程日志、性能影响、第三方库集成、调试技巧等,确保问题与主题相关且有价值。</think>在Python项目中设计高效的日志系统需要遵循模块化、可配置性和可维护性原则。以下是以logging模块为核心的最佳实践方案: ### 一、基础配置架构 1. **分层日志记录器** 使用$logging.getLogger(__name__)$创建模块级记录器,避免直接使用root logger。这种层级结构允许对不同模块进行细粒度控制: ```python # 模块初始化时创建记录器 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) ``` 2. **多处理器组合** 通过添加多个Handler实现日志分流,建议至少包含: - 控制台Handler:输出INFO及以上级别 - 文件Handler:记录DEBUG及以上级别 - 错误专用Handler:捕获ERROR及以上级别 ```python # 示例:创建控制台和文件处理器 console_handler = logging.StreamHandler() file_handler = logging.FileHandler('app.log', encoding='utf-8') ``` ### 二、格式规范实践 3. **结构化日志格式** 采用包含时间戳、模块名、线程ID等元数据的格式模板: ```python LOG_FORMAT = "%(asctime)s | %(name)-12s | %(threadName)s | %(levelname)-8s | %(message)s" formatter = logging.Formatter(LOG_FORMAT) console_handler.setFormatter(formatter) ``` 4. **上下文增强** 通过$logging.LoggerAdapter$添加请求ID、用户信息等上下文: ```python extra = {'request_id': '12345'} logger = logging.LoggerAdapter(logger, extra) ``` ### 三、进阶配置方案 5. **文件轮转策略** 使用$RotatingFileHandler$或$TimedRotatingFileHandler$实现日志滚动: ```python from logging.handlers import RotatingFileHandler rotating_handler = RotatingFileHandler( 'app.log', maxBytes=10*1024*1024, backupCount=5 ) ``` 6. **多线程安全处理** 通过$QueueHandler$实现线程安全日志记录[^1]: ```python from logging.handlers import QueueHandler, QueueListener log_queue = Queue() queue_handler = QueueHandler(log_queue) listener = QueueListener(log_queue, console_handler, file_handler) listener.start() ``` ### 四、性能优化要点 7. **条件过滤机制** 创建自定义Filter控制日志输出: ```python class InfoFilter(logging.Filter): def filter(self, record): return record.levelno == logging.INFO console_handler.addFilter(InfoFilter()) ``` 8. **惰性求值优化** 使用%格式代替f-string避免不必要的计算: ```python logger.debug("Processing item %s", item.name) # 正确 logger.debug(f"Processing item {item.name}") # 避免 ``` ### 五、部署建议 9. **环境敏感配置** 通过字典配置实现开发/生产环境切换: ```python LOGGING_CONFIG = { 'version': 1, 'formatters': { 'detailed': {'format': LOG_FORMAT} }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': 'INFO', 'formatter': 'detailed' } }, 'root': { 'level': 'DEBUG', 'handlers': ['console'] } } ``` 10. **错误追踪集成** 结合Sentry等工具实现异常监控: ```python from sentry_sdk.integrations.logging import LoggingIntegration sentry_logging = LoggingIntegration( level=logging.INFO, event_level=logging.ERROR ) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值