Do access log using python's logging stuff, just under a separate logger name

This commit is contained in:
David Baker 2015-04-30 16:17:27 +01:00
parent 3c4c229788
commit 054aa0d58c
2 changed files with 39 additions and 14 deletions

View File

@ -35,7 +35,7 @@ from twisted.enterprise import adbapi
from twisted.web.resource import Resource from twisted.web.resource import Resource
from twisted.web.static import File from twisted.web.static import File
from twisted.web.server import Site from twisted.web.server import Site
from twisted.web.http import proxiedLogFormatter from twisted.web.http import proxiedLogFormatter, combinedLogFormatter
from synapse.http.server import JsonResource, RootRedirect from synapse.http.server import JsonResource, RootRedirect
from synapse.rest.media.v0.content_repository import ContentRepoResource from synapse.rest.media.v0.content_repository import ContentRepoResource
from synapse.rest.media.v1.media_repository import MediaRepositoryResource from synapse.rest.media.v1.media_repository import MediaRepositoryResource
@ -226,17 +226,13 @@ class SynapseHomeServer(HomeServer):
def start_listening(self): def start_listening(self):
config = self.get_config() config = self.get_config()
log_formatter = None
if config.captcha_ip_origin_is_x_forwarded:
log_formatter = proxiedLogFormatter
if not config.no_tls and config.bind_port is not None: if not config.no_tls and config.bind_port is not None:
reactor.listenSSL( reactor.listenSSL(
config.bind_port, config.bind_port,
Site( SynapseSite(
"synapse.access.https",
config,
self.root_resource, self.root_resource,
logPath=config.access_log_file,
logFormatter=log_formatter,
), ),
self.tls_context_factory, self.tls_context_factory,
interface=config.bind_host interface=config.bind_host
@ -246,10 +242,10 @@ class SynapseHomeServer(HomeServer):
if config.unsecure_port is not None: if config.unsecure_port is not None:
reactor.listenTCP( reactor.listenTCP(
config.unsecure_port, config.unsecure_port,
Site( SynapseSite(
"synapse.access.http",
config,
self.root_resource, self.root_resource,
logPath=config.access_log_file,
logFormatter=log_formatter,
), ),
interface=config.bind_host interface=config.bind_host
) )
@ -259,10 +255,10 @@ class SynapseHomeServer(HomeServer):
if metrics_resource and config.metrics_port is not None: if metrics_resource and config.metrics_port is not None:
reactor.listenTCP( reactor.listenTCP(
config.metrics_port, config.metrics_port,
Site( SynapseSite(
"synapse.access.metrics",
config,
metrics_resource, metrics_resource,
logPath=config.access_log_file,
logFormatter=log_formatter,
), ),
interface="127.0.0.1", interface="127.0.0.1",
) )
@ -484,6 +480,24 @@ class SynapseService(service.Service):
return self._port.stopListening() return self._port.stopListening()
class SynapseSite(Site):
"""
Subclass of a twisted http Site that does access logging with python's
standard logging
"""
def __init__(self, logger_name, config, resource, *args, **kwargs):
Site.__init__(self, resource, *args, **kwargs)
if config.captcha_ip_origin_is_x_forwarded:
self._log_formatter = proxiedLogFormatter
else:
self._log_formatter = combinedLogFormatter
self.access_logger = logging.getLogger(logger_name)
def log(self, request):
line = self._log_formatter(self._logDateTime, request)
self.access_logger.info(line)
def run(hs): def run(hs):
def in_thread(): def in_thread():

View File

@ -83,6 +83,17 @@ class LoggingConfig(Config):
handler.addFilter(LoggingContextFilter(request="")) handler.addFilter(LoggingContextFilter(request=""))
logger.addHandler(handler) logger.addHandler(handler)
if self.access_log_file:
access_logger = logging.getLogger('synapse.access')
# we log to both files by default
access_logger.propagate = 1
access_log_handler = logging.handlers.RotatingFileHandler(
self.access_log_file, maxBytes=(1000 * 1000 * 100), backupCount=3
)
access_log_formatter = logging.Formatter('%(message)s')
access_log_handler.setFormatter(access_log_formatter)
access_logger.addHandler(access_log_handler)
else: else:
with open(self.log_config, 'r') as f: with open(self.log_config, 'r') as f:
logging.config.dictConfig(yaml.load(f)) logging.config.dictConfig(yaml.load(f))