Skip to content
Snippets Groups Projects
Commit a057ad05 authored by David Douard's avatar David Douard
Browse files

logger: kill the (now unused) PostresHandler

parent 19b1bece
No related branches found
No related tags found
1 merge request!57setup: extract db and http related parts in dedicated optional 'extras'
......@@ -5,11 +5,7 @@
import datetime
import logging
import os
import socket
import psycopg2
from psycopg2.extras import Json
from systemd.journal import JournalHandler as _JournalHandler, send
try:
......@@ -80,90 +76,6 @@ def stringify(value):
return str(value)
class PostgresHandler(logging.Handler):
"""log handler that store messages in a Postgres DB
See swh-core/swh/core/sql/log-schema.sql for the DB schema.
All logging methods can be used as usual. Additionally, arbitrary metadata
can be passed to logging methods, requesting that they will be stored in
the DB as a single JSONB value. To do so, pass a dictionary to the 'extra'
kwarg of any logging method; all keys in that dictionary that start with
EXTRA_LOGDATA_PREFIX (currently: ``swh_``) will be extracted to form the
JSONB dictionary. The prefix will be stripped and not included in the DB.
Note: the logger name will be used to fill the 'module' DB column.
Sample usage::
logging.basicConfig(level=logging.INFO)
h = PostgresHandler('dbname=softwareheritage-log')
logging.getLogger().addHandler(h)
logger.info('not so important notice',
extra={'swh_type': 'swh_logging_test',
'swh_meditation': 'guru'})
logger.warn('something weird just happened, did you see that?')
"""
def __init__(self, connstring):
"""
Create a Postgres log handler.
Args:
config: configuration dictionary, with a key "log_db" containing a
libpq connection string to the log DB
"""
super().__init__()
self.connstring = connstring
self.fqdn = socket.getfqdn() # cache FQDN value
def _connect(self):
return psycopg2.connect(self.connstring)
def emit(self, record):
msg = self.format(record)
extra_data = get_extra_data(record)
if 'task' in extra_data:
task_args = {
'args': extra_data['task']['args'],
'kwargs': extra_data['task']['kwargs'],
}
try:
json_args = Json(task_args).getquoted()
except TypeError:
task_args = {
'args': ['<failed to convert arguments to JSON>'],
'kwargs': {},
}
else:
json_args_length = len(json_args)
if json_args_length >= 1000:
task_args = {
'args': ['<arguments too long>'],
'kwargs': {},
}
extra_data['task'].update(task_args)
log_entry = (db_level_of_py_level(record.levelno), msg,
Json(extra_data), record.name, self.fqdn,
os.getpid())
db = self._connect()
with db.cursor() as cur:
cur.execute('INSERT INTO log '
'(level, message, data, src_module, src_host, src_pid)'
'VALUES (%s, %s, %s, %s, %s, %s)',
log_entry)
db.commit()
db.close()
class JournalHandler(_JournalHandler):
def emit(self, record):
"""Write `record` as a journal event.
......
# Copyright (C) 2015-2018 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import logging
import os
import pytest
from swh.core.logger import PostgresHandler
from swh.core.tests import SQL_DIR
DUMP_FILE = os.path.join(SQL_DIR, 'log-schema.sql')
@pytest.fixture
def swh_db_logger(postgresql_proc, postgresql):
cursor = postgresql.cursor()
with open(DUMP_FILE) as fobj:
cursor.execute(fobj.read())
postgresql.commit()
modname = 'swh.core.tests.test_logger'
logger = logging.Logger(modname, logging.DEBUG)
dsn = 'postgresql://{user}@{host}:{port}/{dbname}'.format(
host=postgresql_proc.host,
port=postgresql_proc.port,
user='postgres',
dbname='tests')
logger.addHandler(PostgresHandler(dsn))
return logger
@pytest.mark.db
def test_log(swh_db_logger, postgresql):
logger = swh_db_logger
modname = logger.name
logger.info('notice',
extra={'swh_type': 'test entry', 'swh_data': 42})
logger.warning('warning')
with postgresql.cursor() as cur:
cur.execute('SELECT level, message, data, src_module FROM log')
db_log_entries = cur.fetchall()
assert ('info', 'notice', {'type': 'test entry', 'data': 42},
modname) in db_log_entries
assert ('warning', 'warning', {}, modname) in db_log_entries
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment