fix(fastapi): centralize logging initialization

With this change, we provide a wrapper to `logging.getLogger`
in the `aurweb.logging` module. Modules wishing to log using
logging.conf should get their module-local loggers by calling
`aurweb.logging.getLogger(__name__)`, similar to `logging.getLogger`,
this way initialization with logging.conf is guaranteed.

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-10-21 10:08:45 -07:00
parent 5ae9d09e98
commit a06f4ec19c
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
10 changed files with 46 additions and 23 deletions

View file

@ -8,4 +8,14 @@ aurwebdir = aurweb.config.get("options", "aurwebdir")
config_path = os.path.join(aurwebdir, "logging.conf") config_path = os.path.join(aurwebdir, "logging.conf")
logging.config.fileConfig(config_path, disable_existing_loggers=False) logging.config.fileConfig(config_path, disable_existing_loggers=False)
logger = logging.getLogger(__name__)
def get_logger(name: str) -> logging.Logger:
""" A logging.getLogger wrapper. Importing this function and
using it to get a module-local logger ensures that logging.conf
initialization is performed wherever loggers are used.
:param name: Logger name; typically `__name__`
:returns: name's logging.Logger
"""
return logging.getLogger(name)

View file

@ -1,12 +1,12 @@
import logging
import fakeredis import fakeredis
from redis import ConnectionPool, Redis from redis import ConnectionPool, Redis
import aurweb.config import aurweb.config
logger = logging.getLogger(__name__) from aurweb import logging
logger = logging.get_logger(__name__)
pool = None pool = None

View file

@ -1,5 +1,4 @@
import copy import copy
import logging
import typing import typing
from datetime import datetime from datetime import datetime
@ -11,7 +10,7 @@ from sqlalchemy import and_, func, or_
import aurweb.config import aurweb.config
from aurweb import db, l10n, models, time, util from aurweb import db, l10n, logging, models, time, util
from aurweb.auth import account_type_required, auth_required from aurweb.auth import account_type_required, auth_required
from aurweb.captcha import get_captcha_answer, get_captcha_salts, get_captcha_token from aurweb.captcha import get_captcha_answer, get_captcha_salts, get_captcha_token
from aurweb.l10n import get_translator_for_request from aurweb.l10n import get_translator_for_request
@ -21,7 +20,7 @@ from aurweb.scripts.notify import ResetKeyNotification, WelcomeNotification
from aurweb.templates import make_context, make_variable_context, render_template from aurweb.templates import make_context, make_variable_context, render_template
router = APIRouter() router = APIRouter()
logger = logging.getLogger(__name__) logger = logging.get_logger(__name__)
@router.get("/passreset", response_class=HTMLResponse) @router.get("/passreset", response_class=HTMLResponse)

View file

@ -1,5 +1,4 @@
import html import html
import logging
import re import re
import typing import typing
@ -10,13 +9,13 @@ from fastapi import APIRouter, Form, HTTPException, Request
from fastapi.responses import RedirectResponse, Response from fastapi.responses import RedirectResponse, Response
from sqlalchemy import and_, or_ from sqlalchemy import and_, or_
from aurweb import db, l10n, models from aurweb import db, l10n, logging, models
from aurweb.auth import account_type_required, auth_required from aurweb.auth import account_type_required, auth_required
from aurweb.models.account_type import DEVELOPER, TRUSTED_USER, TRUSTED_USER_AND_DEV from aurweb.models.account_type import DEVELOPER, TRUSTED_USER, TRUSTED_USER_AND_DEV
from aurweb.templates import make_context, make_variable_context, render_template from aurweb.templates import make_context, make_variable_context, render_template
router = APIRouter() router = APIRouter()
logger = logging.getLogger(__name__) logger = logging.get_logger(__name__)
# Some TU route specific constants. # Some TU route specific constants.
ITEMS_PER_PAGE = 10 # Paged table size. ITEMS_PER_PAGE = 10 # Paged table size.

View file

@ -1,6 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import logging
import sys import sys
import bleach import bleach
@ -10,7 +9,9 @@ import pygit2
import aurweb.config import aurweb.config
import aurweb.db import aurweb.db
logger = logging.getLogger(__name__) from aurweb import logging
logger = logging.get_logger(__name__)
repo_path = aurweb.config.get('serve', 'repo-path') repo_path = aurweb.config.get('serve', 'repo-path')
commit_uri = aurweb.config.get('options', 'commit_uri') commit_uri = aurweb.config.get('options', 'commit_uri')

View file

@ -1,6 +1,5 @@
import base64 import base64
import copy import copy
import logging
import math import math
import random import random
import re import re
@ -20,7 +19,9 @@ from jinja2 import pass_context
import aurweb.config import aurweb.config
logger = logging.getLogger(__name__) from aurweb import logging
logger = logging.get_logger(__name__)
def make_random_string(length): def make_random_string(length):

View file

@ -15,13 +15,13 @@ handlers=simpleHandler
level=DEBUG level=DEBUG
handlers=detailedHandler handlers=detailedHandler
qualname=aurweb qualname=aurweb
propagate=0 propagate=1
[logger_test] [logger_test]
level=DEBUG level=DEBUG
handlers=detailedHandler handlers=detailedHandler
qualname=test qualname=test
propagate=0 propagate=1
[logger_uvicorn] [logger_uvicorn]
level=DEBUG level=DEBUG

View file

@ -1,4 +1,3 @@
import logging
import re import re
import tempfile import tempfile
@ -11,7 +10,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import captcha, db from aurweb import captcha, db, logging
from aurweb.asgi import app from aurweb.asgi import app
from aurweb.db import create, query from aurweb.db import create, query
from aurweb.models.accepted_term import AcceptedTerm from aurweb.models.accepted_term import AcceptedTerm
@ -32,7 +31,7 @@ TEST_EMAIL = "test@example.org"
client = TestClient(app) client = TestClient(app)
user = None user = None
logger = logging.getLogger(__name__) logger = logging.get_logger(__name__)
def make_ssh_pubkey(): def make_ssh_pubkey():

16
test/test_logging.py Normal file
View file

@ -0,0 +1,16 @@
from aurweb import logging
logger = logging.get_logger(__name__)
def test_logging(caplog):
logger.info("Test log.")
# Test that we logged once.
assert len(caplog.records) == 1
# Test that our log record was of INFO level.
assert caplog.records[0].levelname == "INFO"
# Test that our message got logged.
assert "Test log." in caplog.text

View file

@ -1,5 +1,3 @@
import logging
from datetime import datetime from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
@ -8,7 +6,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import db from aurweb import db, logging
from aurweb.asgi import app from aurweb.asgi import app
from aurweb.models.account_type import AccountType from aurweb.models.account_type import AccountType
from aurweb.models.package import Package from aurweb.models.package import Package
@ -16,7 +14,7 @@ from aurweb.models.package_base import PackageBase
from aurweb.models.user import User from aurweb.models.user import User
from aurweb.testing import setup_test_db from aurweb.testing import setup_test_db
logger = logging.getLogger(__name__) logger = logging.get_logger(__name__)
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)