mirror of
https://github.com/fastapi-practices/fastapi-best-architecture.git
synced 2026-09-21 21:15:13 +00:00
Update loguru and deploy log config (#517)
* Update loguru config * Update config * fix log level * Update deploy log config
This commit is contained in:
@@ -19,11 +19,9 @@ RUN apt-get update \
|
||||
|
||||
ENV TZ="Asia/Shanghai"
|
||||
|
||||
RUN mkdir -p /var/log/fastapi_server \
|
||||
&& mkdir -p /var/log/supervisor \
|
||||
&& mkdir -p /etc/supervisor/conf.d
|
||||
RUN mkdir -p /var/log/fastapi_server
|
||||
|
||||
COPY deploy/backend/supervisor.conf /etc/supervisor/supervisord.conf
|
||||
COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf
|
||||
|
||||
COPY deploy/backend/fastapi_server.conf /etc/supervisor/conf.d/
|
||||
|
||||
|
||||
@@ -19,11 +19,9 @@ RUN apt-get update \
|
||||
|
||||
ENV TZ="Asia/Shanghai"
|
||||
|
||||
RUN mkdir -p /var/log/celery \
|
||||
&& mkdir -p /var/log/supervisor \
|
||||
&& mkdir -p /etc/supervisor/conf.d
|
||||
RUN mkdir -p /var/log/celery
|
||||
|
||||
COPY deploy/backend/supervisor.conf /etc/supervisor/supervisord.conf
|
||||
COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf
|
||||
|
||||
COPY deploy/backend/celery.conf /etc/supervisor/conf.d/
|
||||
|
||||
|
||||
+31
-37
@@ -3,8 +3,7 @@
|
||||
import inspect
|
||||
import logging
|
||||
import os
|
||||
|
||||
from sys import stderr, stdout
|
||||
import sys
|
||||
|
||||
from asgi_correlation_id import correlation_id
|
||||
from loguru import logger
|
||||
@@ -37,12 +36,12 @@ class InterceptHandler(logging.Handler):
|
||||
|
||||
def setup_logging():
|
||||
"""
|
||||
From https://pawamoy.github.io/posts/unify-logging-for-a-gunicorn-uvicorn-app/
|
||||
From https://github.com/benoitc/gunicorn/issues/1572#issuecomment-638391953
|
||||
https://github.com/pawamoy/pawamoy.github.io/issues/17
|
||||
"""
|
||||
# Intercept everything at the root logger
|
||||
# Set the logging handler and level
|
||||
logging.root.handlers = [InterceptHandler()]
|
||||
logging.root.setLevel(settings.LOG_ROOT_LEVEL)
|
||||
logging.root.setLevel('NOTSET')
|
||||
|
||||
# Remove all log handlers and propagate to root logger
|
||||
for name in logging.root.manager.loggerDict.keys():
|
||||
@@ -55,70 +54,65 @@ def setup_logging():
|
||||
# Debug log handlers
|
||||
# logging.debug(f'{logging.getLogger(name)}, {logging.getLogger(name).propagate}')
|
||||
|
||||
# Remove every other logger's handlers
|
||||
logger.remove()
|
||||
|
||||
# Define the correlation_id filter function
|
||||
# https://github.com/snok/asgi-correlation-id?tab=readme-ov-file#configure-logging
|
||||
# Define the correlation_id default filter function
|
||||
# https://github.com/snok/asgi-correlation-id/issues/7
|
||||
def correlation_id_filter(record) -> bool:
|
||||
def correlation_id_filter(record):
|
||||
cid = correlation_id.get(settings.LOG_CID_DEFAULT_VALUE)
|
||||
record['correlation_id'] = cid[: settings.LOG_CID_UUID_LENGTH]
|
||||
return True
|
||||
return record
|
||||
|
||||
# Configure loguru logger before starts logging
|
||||
# Remove default loguru logger
|
||||
logger.remove()
|
||||
|
||||
# Set the loguru default handlers
|
||||
logger.configure(
|
||||
handlers=[
|
||||
{
|
||||
'sink': stdout,
|
||||
'level': settings.LOG_STDOUT_LEVEL,
|
||||
'filter': lambda record: correlation_id_filter(record) and record['level'].no <= 25,
|
||||
'sink': sys.stdout,
|
||||
'filter': lambda record: correlation_id_filter(record),
|
||||
'format': settings.LOG_STD_FORMAT,
|
||||
},
|
||||
{
|
||||
'sink': stderr,
|
||||
'level': settings.LOG_STDERR_LEVEL,
|
||||
'filter': lambda record: correlation_id_filter(record) and record['level'].no >= 30,
|
||||
'format': settings.LOG_STD_FORMAT,
|
||||
},
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def set_customize_logfile():
|
||||
def set_custom_logfile():
|
||||
log_path = path_conf.LOG_DIR
|
||||
if not os.path.exists(log_path):
|
||||
os.mkdir(log_path)
|
||||
|
||||
# log files
|
||||
log_stdout_file = os.path.join(log_path, settings.LOG_STDOUT_FILENAME)
|
||||
log_stderr_file = os.path.join(log_path, settings.LOG_STDERR_FILENAME)
|
||||
log_access_file = os.path.join(log_path, settings.LOG_ACCESS_FILENAME)
|
||||
log_error_file = os.path.join(log_path, settings.LOG_ERROR_FILENAME)
|
||||
|
||||
# loguru logger: https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add
|
||||
# set loguru logger default config
|
||||
# https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add
|
||||
log_config = {
|
||||
'rotation': '10 MB',
|
||||
'retention': '15 days',
|
||||
'compression': 'tar.gz',
|
||||
'enqueue': True,
|
||||
'format': settings.LOG_FILE_FORMAT,
|
||||
'enqueue': True,
|
||||
'rotation': '5 MB',
|
||||
'retention': '7 days',
|
||||
'compression': 'tar.gz',
|
||||
}
|
||||
|
||||
# stdout file
|
||||
logger.add(
|
||||
str(log_stdout_file),
|
||||
level=settings.LOG_STDOUT_LEVEL,
|
||||
**log_config,
|
||||
str(log_access_file),
|
||||
level=settings.LOG_ACCESS_LEVEL,
|
||||
filter=lambda record: record['level'].no <= 25,
|
||||
backtrace=False,
|
||||
diagnose=False,
|
||||
**log_config,
|
||||
)
|
||||
|
||||
# stderr file
|
||||
logger.add(
|
||||
str(log_stderr_file),
|
||||
level=settings.LOG_STDERR_LEVEL,
|
||||
**log_config,
|
||||
str(log_error_file),
|
||||
level=settings.LOG_ERROR_LEVEL,
|
||||
filter=lambda record: record['level'].no >= 30,
|
||||
backtrace=True,
|
||||
diagnose=True,
|
||||
**log_config,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -94,7 +94,6 @@ class Settings(BaseSettings):
|
||||
COOKIE_REFRESH_TOKEN_EXPIRE_SECONDS: int = TOKEN_REFRESH_EXPIRE_SECONDS
|
||||
|
||||
# Log
|
||||
LOG_ROOT_LEVEL: str = 'NOTSET'
|
||||
LOG_STD_FORMAT: str = (
|
||||
'<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</> | <lvl>{level: <8}</> | '
|
||||
'<cyan> {correlation_id} </> | <lvl>{message}</>'
|
||||
@@ -105,10 +104,10 @@ class Settings(BaseSettings):
|
||||
)
|
||||
LOG_CID_DEFAULT_VALUE: str = '-'
|
||||
LOG_CID_UUID_LENGTH: int = 32 # must <= 32
|
||||
LOG_STDOUT_LEVEL: str = 'INFO'
|
||||
LOG_STDERR_LEVEL: str = 'ERROR'
|
||||
LOG_STDOUT_FILENAME: str = 'fba_access.log'
|
||||
LOG_STDERR_FILENAME: str = 'fba_error.log'
|
||||
LOG_ACCESS_LEVEL: str = 'INFO'
|
||||
LOG_ERROR_LEVEL: str = 'ERROR'
|
||||
LOG_ACCESS_FILENAME: str = 'fba_access.log'
|
||||
LOG_ERROR_FILENAME: str = 'fba_error.log'
|
||||
|
||||
# Middleware
|
||||
MIDDLEWARE_CORS: bool = True
|
||||
|
||||
@@ -14,7 +14,7 @@ from starlette.middleware.authentication import AuthenticationMiddleware
|
||||
from starlette.staticfiles import StaticFiles
|
||||
|
||||
from backend.common.exception.exception_handler import register_exception
|
||||
from backend.common.log import set_customize_logfile, setup_logging
|
||||
from backend.common.log import set_custom_logfile, setup_logging
|
||||
from backend.core.conf import settings
|
||||
from backend.core.path_conf import STATIC_DIR, UPLOAD_DIR
|
||||
from backend.database.db import create_table
|
||||
@@ -99,7 +99,7 @@ def register_logger() -> None:
|
||||
:return:
|
||||
"""
|
||||
setup_logging()
|
||||
set_customize_logfile()
|
||||
set_custom_logfile()
|
||||
|
||||
|
||||
def register_static_file(app: FastAPI):
|
||||
|
||||
Reference in New Issue
Block a user