fastapi uvicorn 将控制台输出日志 保存到日志文件

### FastAPI 日志配置及使用方法 在 FastAPI 应用程序中,可以通过多种方式实现日志的配置和管理。以下是几种常见的方式以及具体的操作流程。 #### 方法一:基于 `logging` 模块的标准日志配置 Python 自带的日志库 `logging` 是最常用的方法之一。通过自定义日志处理器、格式化器等组件来满足不同的需求。以下是一个典型的日志配置示例: ```python import logging from fastapi import FastAPI app = FastAPI() # 创建 logger 实例 logger = logging.getLogger("my_logger") # 设置日志级别 logger.setLevel(logging.DEBUG) # 定义控制台输出 handler ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # 定义文件输出 handler fh = logging.FileHandler('app.log') fh.setLevel(logging.INFO) # 定义日志格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 将格式应用到 handlers ch.setFormatter(formatter) fh.setFormatter(formatter) # 添加 handlers 到 logger logger.addHandler(ch) logger.addHandler(fh) @app.get("/") async def read_root(): logger.debug("This is a debug message.") logger.info("Info level log from the root endpoint.") return {"Hello": "World"} ``` 这种方法适用于大多数场景,并允许开发者灵活调整日志等级、存储位置和其他参数[^1]。 --- #### 方法二:直接调用默认日志实例 FastAPI 使用了 Uvicorn 或 Gunicorn 作为其运行服务器,默认情况下会自动集成这些工具自带的日志机制。因此可以直接利用它们提供的接口完成基础的日志记录工作而无需额外设置。 如果仅需简单地打印信息,则可采用如下形式: ```python from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/log-test/") def test_log(): uvicorn_access_logger = logging.getLogger("uvicorn.access") uvicorn_error_logger = logging.getLogger("uvicorn.error") uvicorn_access_logger.info("Accessing custom route...") uvicorn_error_logger.warning("Warning example on error logger.") return {"status": "logged"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) ``` 此方案适合快速开发阶段或者不需要复杂定制的小型项目[^2]。 --- #### 方法三:借助第三方扩展增强功能 对于更高级的需求(比如结构化日志、分布式追踪),推荐引入专门设计用于微服务架构下的开源框架如 Loguru 或 Structlog 。下面给出一段关于如何结合 Loguru 进行操作的例子: ```python from fastapi import FastAPI from loguru import logger as loguru_logger class InterceptHandler(logging.Handler): """拦截标准库中的日志并转发给Loguru""" def emit(self, record): try: level = loguru_logger.level(record.levelname).name except ValueError: level = record.levelno frame, depth = logging.currentframe(), 2 while frame.f_code.co_filename == logging.__file__: frame = frame.f_back depth += 1 log_options = { 'extra': {'user_id': None}, # 可选字段填充 } loguru_logger.opt(depth=depth, exception=record.exc_info, **log_options).log(level, record.getMessage()) # 替换原有的handlers为InterceptHandler for name in ("uvicorn.asgi", "uvicorn"): logging_logger = logging.getLogger(name) logging_logger.handlers.clear() # 清除旧handler以防冲突 logging_logger.addHandler(InterceptHandler()) # 初始化FastAPI app对象... app = FastAPI() @loguru_logger.catch @app.get('/example/') def example_endpoint(): loguru_logger.info("An info-level event occurred!") raise Exception("Oops! Something went wrong.") # 测试异常捕获能力 # 启动服务端口监听逻辑省略... ``` 上述代码片段展示了怎样无缝衔接传统 Logging API 和现代化替代品之间的桥梁构建过程[^4]^。 --- ### 总结 以上介绍了三种主流途径帮助你在实际工作中更好地管理和监控应用程序行为轨迹变化情况。无论是初学者还是资深工程师都能找到适合自己团队现状的最佳实践模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值