首页 > 其他分享 >FastAPI学习-29 log_config 设置 logger 日志格式

FastAPI学习-29 log_config 设置 logger 日志格式

时间:2024-01-16 10:47:29浏览次数:28  
标签:INFO log FastAPI 29 uvicorn access 日志 config

前言

FastAPI 服务是通过 uvicorn 来提供的,日志都是 uvicorn 里配置的。
官方文档地址:https://www.uvicorn.org/settings/#logging

uvicorn 的 logging 日志

我们可以通过 uvicorn.run() 方式启动服务

uvicorn.run("example:app", port=5000, reload=True, access_log=False)

于是可以加一些启动参数,与logging 日志相关的几个参数:

** --log-config<path> 日志配置文件。**
选项:dictConfig()格式:.json、.yaml。任何其他格式都将使用fileConfig()处理。
设置formatters.default.use_colors和formatters.access.use_cors值以覆盖自动检测的行为。
如果您希望在日志配置中使用YAML文件,则需要将PyYAML作为项目的依赖项,或者安装带有[标准]可选附加功能的uvicorn。

--log-level<str> 置日志级别。
选项:'critical', 'error', 'warning', 'info', 'debug', 'trace'。默认值:'info'。

--no-access-log 仅禁用访问日志,不更改日志级别。

--use-colors/--no-use-colorss-启用/禁用日志记录的彩色格式,如果未设置此选项,则会自动检测到。如果使用--log-config CLI选项,则会忽略此选项。

启动服务

当我们启动服务,服务接口的时候,看到的日志是没有显示时间格式的

from fastapi import FastAPI


app = FastAPI()


@app.get("/demo/")
async def create_item():
    return {"demo": "hello world"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        app='main:app',
        host="127.0.0.1",
        reload=True,
        port=8000,
    )

运行日志

INFO:     Will watch for changes in these directories: ['D:\\code\\fast_project\\xxx']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [10924] using StatReload
INFO:     Started server process [5708]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:5161 - "GET / HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:5161 - "GET /docs HTTP/1.1" 200 OK
INFO:     127.0.0.1:5161 - "GET /demo HTTP/1.1" 307 Temporary Redirect
INFO:     127.0.0.1:5161 - "GET /demo/ HTTP/1.1" 200 OK

那么这些日志是从哪来的,又如何修改日志的默认格式呢?

LOGGING_CONFIG 日志默认格式

LOGGING_CONFIG 是uvicorn默认的日志配置

from uvicorn.config import LOGGING_CONFIG

找到源码里面的配置内容如下

LOGGING_CONFIG: Dict[str, Any] = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(levelprefix)s %(message)s",
            "use_colors": None,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s',  # noqa: E501
        },
    },
    "handlers": {
        "default": {
            "formatter": "default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr",
        },
        "access": {
            "formatter": "access",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout",
        },
    },
    "loggers": {
        "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
        "uvicorn.error": {"level": "INFO"},
        "uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
    },
}

我们可以通过修改"formatters"默认的日志格式,来控制日志输出的格式

from fastapi import FastAPI
from uvicorn.config import LOGGING_CONFIG

LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelprefix)s %(message)s"

app = FastAPI()

······

于是就可以看到启动的日志,前面加上了时间"%(asctime)s"

2024-01-16 09:49:04,408 - INFO:     Will watch for changes in these directories: ['D:\\code\\fast_project\\xxx']
2024-01-16 09:49:04,408 - INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
2024-01-16 09:49:04,408 - INFO:     Started reloader process [9124] using StatReload
2024-01-16 09:49:04,924 - INFO:     Started server process [11020]
2024-01-16 09:49:04,924 - INFO:     Waiting for application startup.
2024-01-16 09:49:04,924 - INFO:     Application startup complete.

访问 http 接口的日志通过修改"access"格式来控制

from fastapi import FastAPI
from uvicorn.config import LOGGING_CONFIG

LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelprefix)s %(message)s"
LOGGING_CONFIG["formatters"]["access"]["fmt"] = "%(asctime)s - %(levelprefix)s %(client_addr)s - \"%(request_line)s\" %(status_code)s"

app = FastAPI()

log_config 配置文件

前面是通过修改LOGGING_CONFIG 默认的参数来配置日志,我们也可以把配置文件单独写到一个uvicorn_config.json文件,加载本地配置文件覆盖默认的LOGGING_CONFIG
uvicorn_config.json

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "default": {
      "()": "uvicorn.logging.DefaultFormatter",
      "fmt": "%(asctime)s - %(levelprefix)s %(message)s",
      "use_colors": null
    },
    "access": {
      "()": "uvicorn.logging.AccessFormatter",
      "fmt": "%(asctime)s - %(levelprefix)s %(client_addr)s - \"%(request_line)s\" %(status_code)s"
    }
  },
  "handlers": {
    "default": {
      "formatter": "default",
      "class": "logging.StreamHandler",
      "stream": "ext://sys.stderr"
    },
    "access": {
      "formatter": "access",
      "class": "logging.StreamHandler",
      "stream": "ext://sys.stdout"
    }
  },
  "loggers": {
    "uvicorn": {
      "handlers": [
        "default"
      ],
      "level": "INFO"
    },
    "uvicorn.error": {
      "level": "INFO"
    },
    "uvicorn.access": {
      "handlers": [
        "access"
      ],
      "level": "INFO",
      "propagate": false
    }
  }
}

启动时导入配置文件

from fastapi import FastAPI


app = FastAPI()


@app.get("/demo/")
async def create_item():
    return {"demo": "hello world"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        app='main:app',
        host="127.0.0.1",
        reload=True,
        port=8000,
        log_config="./uvicorn_config.json"
    )

标签:INFO,log,FastAPI,29,uvicorn,access,日志,config
From: https://www.cnblogs.com/yoyoketang/p/17966998

相关文章

  • FastAPI学习-28 alembic数据迁移报错:Target database is not up to date 报错解决办法
    前言当表结构有变更,数据迁移时,出现报错:Targetdatabaseisnotuptodate遇到的问题执行迁移命令alembicrevision--autogenerate-m"testv4"出现如下报错>alembicrevision--autogenerate-m"testv4"INFO[alembic.runtime.migration]ContextimplMySQLImpl.INF......
  • python logging 禁止日志输出
    1只会禁用特定日志记录器,其他日志记录器仍可以将消息输出到控制台格式:logging.getLogger("某日志记录器").disabled=True例:logging.getLogger("tornado").disabled=True2阻止这些日志记录器将日志消息传播到更高级别的父级记录器,从而不会显示在控制台上;请注意,其他日志......
  • 网络-华为、思科交换机配置TFTP自动备份、NTP时间同步、SYSLOG日志同步
    配置使用TFTP进行交换机配置的自动保存华为设备<Huawei-sw>sys[Huawei-sw]setsave-configurationinterval60delay3cpu-limit60[Huawei-sw]setsave-configurationbackup-to-serverserver<TFTP服务器IP>transport-typetftppath\Huawei-sw.zip[Huawei-sw]quit<H......
  • 在职阿里6年,一个29岁女软件测试工程师的心声
    在职阿里6年,一个29岁女软件测试工程师的心声简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少)其中成功的有4家,另外2家失败的原因在于:1.对于系统知识的了解不够全面,在最后......
  • [转帖]Nginx access log 按日期保存记录
    https://cloud.tencent.com/developer/article/1958304 $time_iso8601  生成格式:2021-09-18T15:16:35+08:00$time_local     生成格式:18/Sep/2021:15:12:13+0800网络流传的nginxaccesslog分割都是写shell脚本然后做定时任务来分割日志,操作中自......
  • PostgreSQL 数据库日志收集功能开启一什么时候写-参数 log_min_messages 等其他参数设
    log_min_messages(enum)控制将哪些消息级别写入服务器日志。可以取值为:DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、LOG、FATAL、PANIC。每个关卡都包含了它之后的所有关卡。级别越高,发送到日志的消息就越少。默认值是WARNING。注意,这里的LOG......
  • PostgreSQL 数据库日志收集功能开启-参数 log_truncate_on_rotation 设置
    log_truncate_on_rotation(boolean)--默认为off,设置为on的话,文件内容覆盖方式:off后面附加,on:清空再加当启用logging_collector时,此参数将导致PostgreSQL截断(覆盖)而不是追加到任何同名的现有日志文件。但是,截断只会在由于基于时间的旋转而打开新文件时发生,而不会在服务......
  • PostgreSQL 数据库日志收集功能开启-参数 syslog_ident 等其他参数设置
    syslog_ident(string)当日志记录到syslog日志时,该参数决定了用于识别syslog日志中PostgreSQL消息的程序名称。默认为postgres。该参数只能在postgresql.conf文件或服务器命令行中设置。syslog_sequence_numbers(boolean)当日志记录到syslog并且开启此选项时(默认设置......
  • PostgreSQL 数据库日志收集功能开启-参数 log_file_mode 设置
    log_file_mode(integer)日志文件权限,默认为0600在Unix系统上,当启用logging_collector时,此参数设置日志文件的权限。(在MicrosoftWindows上,此参数被忽略。)参数值应该是一个数字模式,以chmod和umask系统调用接受的格式指定。(要使用习惯的八进制格式,数字必须以0(零)开头......
  • PostgreSQL 数据库日志收集功能开启-参数 log_rotation_age 设置
    log_rotation_age(integer)--保留单个文件的最大时长,默认是1d,也有1h,1min,1s当启用logging_collector时,该参数决定使用单个日志文件的最大时间,之后将创建一个新的日志文件。如果不指定单位,则以分钟为单位。默认为24小时。设置为0将禁用基于时间的新日志文件创建。该......