Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rework logging for additional context and to include sanic logs #353

Merged
merged 1 commit into from
Jan 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion synse_server/api/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
from sanic import Blueprint
from sanic.request import Request
from sanic.response import HTTPResponse, StreamingHTTPResponse, stream
from structlog import get_logger

from synse_server import cmd, errors, utils
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()

# Blueprint for the Synse core (version-less) routes.
core = Blueprint('core-http')
Expand Down
4 changes: 3 additions & 1 deletion synse_server/api/websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@
from sanic import Blueprint
from sanic.request import Request
from sanic.websocket import ConnectionClosed, WebSocketCommonProtocol
from structlog import get_logger

from synse_server import cmd, errors, utils
from synse_server.i18n import _
from synse_server.log import logger
from synse_server.metrics import Monitor

logger = get_logger()

# Blueprint for the Synse v3 WebSocket API.
v3 = Blueprint('v3-websocket')

Expand Down
4 changes: 3 additions & 1 deletion synse_server/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
import aiocache
import grpc
import synse_grpc.utils
from structlog import get_logger
from synse_grpc import api

from synse_server import config, plugin
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()

# The in-memory cache implementation stores data in a class member variable,
# so all instance of the in memory cache will reference that data structure.
Expand Down
5 changes: 4 additions & 1 deletion synse_server/cmd/config.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@

from typing import Any, Dict

from structlog import get_logger

from synse_server.config import options
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def config() -> Dict[str, Any]:
Expand Down
4 changes: 3 additions & 1 deletion synse_server/cmd/info.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@

from typing import Any, Dict

from structlog import get_logger
from synse_grpc import utils

from synse_server import cache, errors
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def info(device_id: str) -> Dict[str, Any]:
Expand Down
4 changes: 3 additions & 1 deletion synse_server/cmd/plugin.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@

from typing import Any, Dict, List

from structlog import get_logger
from synse_grpc import api, utils

import synse_server.utils
from synse_server import errors
from synse_server.i18n import _
from synse_server.log import logger
from synse_server.plugin import manager

logger = get_logger()


async def plugin(plugin_id: str) -> Dict[str, Any]:
"""Generate the plugin response data.
Expand Down
4 changes: 3 additions & 1 deletion synse_server/cmd/read.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

import synse_grpc.utils
import websockets
from structlog import get_logger
from synse_grpc import api

from synse_server import cache, errors, plugin
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


def reading_to_dict(reading: api.V3Reading) -> Dict[str, Any]:
Expand Down
4 changes: 3 additions & 1 deletion synse_server/cmd/scan.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@

from typing import Any, Dict, List

from structlog import get_logger
from synse_grpc import utils

from synse_server import cache, errors
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def scan(
Expand Down
5 changes: 4 additions & 1 deletion synse_server/cmd/tags.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@

from typing import List

from structlog import get_logger

from synse_server import cache
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def tags(namespaces: List[str], with_id_tags: bool = False) -> List[str]:
Expand Down
5 changes: 4 additions & 1 deletion synse_server/cmd/test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@

from typing import Dict

from structlog import get_logger

from synse_server import utils
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def test() -> Dict[str, str]:
Expand Down
4 changes: 3 additions & 1 deletion synse_server/cmd/transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
from typing import Any, Dict, List

import synse_grpc.utils
from structlog import get_logger

from synse_server import cache, errors, plugin
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def transaction(transaction_id: str) -> Dict[str, Any]:
Expand Down
5 changes: 4 additions & 1 deletion synse_server/cmd/version.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@

from typing import Dict

from structlog import get_logger

import synse_server
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def version() -> Dict[str, str]:
Expand Down
4 changes: 3 additions & 1 deletion synse_server/cmd/write.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@

from typing import Any, Dict, List, Union

from structlog import get_logger
from synse_grpc import utils

from synse_server import cache, errors
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


async def write_async(device_id: str, payload: Union[Dict, List[Dict]]) -> List[Dict[str, Any]]:
Expand Down
4 changes: 3 additions & 1 deletion synse_server/discovery/kubernetes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

import kubernetes.client
import kubernetes.config
from structlog import get_logger

from synse_server import config
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


def discover() -> List[str]:
Expand Down
64 changes: 55 additions & 9 deletions synse_server/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,66 @@
import sys

import structlog
from sanic import app, asgi, handlers, request, server

from synse_server import config

logging.config.dictConfig({
logging_config = {
'version': 1,
'disable_existing_loggers': False,
'loggers': {
'root': {
'level': 'INFO',
'handlers': ['default']
'handlers': ['default'],
},
'synse-server': {
'synse_server': {
'level': 'INFO',
'handlers': ['default']
'handlers': ['default'],
'propagate': True,
},
'sanic.root': {
'level': 'INFO',
'handlers': ['default'],
},
'sanic.error': {
'level': 'INFO',
'handlers': ['error'],
'propagate': True,
'qualname': 'sanic.error',
},
'sanic.access': {
'level': 'INFO',
'handlers': ['default'],
'propagate': True,
'qualname': 'sanic.access',
},
},
'handlers': {
'default': {
'class': 'logging.StreamHandler',
'stream': sys.stdout
'stream': sys.stdout,
},
'error': {
'class': 'logging.StreamHandler',
'stream': sys.stderr,
},
},
})
}

logging.config.dictConfig(logging_config)

structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.TimeStamper(fmt='iso'),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.processors.UnicodeDecoder(),
structlog.processors.KeyValueRenderer(
key_order=['timestamp', 'level', 'event']
key_order=['timestamp', 'logger', 'level', 'event']
),
],
context_class=dict,
Expand All @@ -48,10 +73,31 @@
cache_logger_on_first_use=True,
)

logger = structlog.get_logger('synse-server')

def override_sanic_loggers():
# Override Sanic loggers with structlog loggers. Unfortunately
# there isn't a great way of doing this because the Sanic modules
# already hold a reference to the logging.Logger at import load,
# so we are stuck with just replacing those references in their
# respective modules.
root = structlog.get_logger('sanic.root')
access = structlog.get_logger('sanic.access')
error = structlog.get_logger('sanic.error')

app.error_logger = error
app.logger = root
asgi.logger = root
handlers.logger = root
request.logger = root
request.error_logger = error
server.logger = root
server.access_logger = access


override_sanic_loggers()


def setup_logger() -> None:
"""Configure the Synse Server logger."""
level = logging.getLevelName(config.options.get('logging', 'info').upper())
logger.setLevel(level)
structlog.get_logger('synse_server').setLevel(level)
4 changes: 3 additions & 1 deletion synse_server/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
import time
from typing import List, Tuple, Union

from structlog import get_logger
from synse_grpc import client, utils

from synse_server import config
from synse_server.discovery import kubernetes
from synse_server.i18n import _
from synse_server.log import logger
from synse_server.metrics import MetricsInterceptor

logger = get_logger()


class PluginManager:
"""A manager for plugins registered with the Synse Server instance.
Expand Down
7 changes: 5 additions & 2 deletions synse_server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@
import os
import sys

from structlog import get_logger

import synse_server
from synse_server import app, config, metrics, plugin, tasks
from synse_server.i18n import _
from synse_server.log import logger, setup_logger
from synse_server.log import setup_logger

logger = get_logger()


class Synse:
Expand Down Expand Up @@ -143,7 +147,6 @@ def run(self) -> None:
self.app.run(
host=self.host,
port=self.port,
access_log=False,
ssl=ssl_context,
)

Expand Down
4 changes: 3 additions & 1 deletion synse_server/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import asyncio

import sanic
from structlog import get_logger

from synse_server import config, plugin
from synse_server.cache import update_device_cache
from synse_server.i18n import _
from synse_server.log import logger

logger = get_logger()


def register_with_app(app: sanic.Sanic) -> None:
Expand Down
6 changes: 4 additions & 2 deletions tests/unit/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
# @pytest.mark.usefixtures(<FIXTURE NAME>)


@pytest.fixture(autouse=True)
@pytest.fixture(scope='module', autouse=True)
def disable_loggers():
"""Fixture to disable loggers for the tests."""

logging.getLogger('synse-server').disabled = True
logging.getLogger('synse_server').setLevel(logging.CRITICAL)

logging.getLogger('synse_server').disabled = True
logging.getLogger('root').disabled = True
logging.getLogger('sanic.access').disabled = True
logging.getLogger('sanic.error').disabled = True
Expand Down
Loading