diff options
author | Dolph Mathews <dolph.mathews@gmail.com> | 2013-01-29 11:12:35 -0600 |
---|---|---|
committer | Dolph Mathews <dolph.mathews@gmail.com> | 2013-01-31 08:16:21 -0600 |
commit | 378635224bdc88fef4e150405894be56acfbf0a3 (patch) | |
tree | 5750b43ec35f879dd0693a645135fca84ad9b9c9 /keystone/contrib | |
parent | 02da3afe4df65b8c469ceb430ca34dab83d6451c (diff) | |
download | keystone-378635224bdc88fef4e150405894be56acfbf0a3.tar.gz keystone-378635224bdc88fef4e150405894be56acfbf0a3.tar.xz keystone-378635224bdc88fef4e150405894be56acfbf0a3.zip |
Generate apache-style common access logs
Taking advantage of this middleware either requires enabling
verbose/debug or utilizing an external logging.conf which configures an
'access' logger.
Example output:
127.0.0.1 - - [2013-01-29T17:15:02.752214] "GET http://localhost:5000/v3/projects HTTP/1.0" 200 16
This patch also revises etc/logging.conf.sample with some more practical
defaults (e.g. supporting externally-managed log rotations) in addition
to illustrating how to generate an 'access.log' file.
DocImpact
Change-Id: I2a6048fa5fbf8661a6859d9e3a259d4cfa5fc589
Diffstat (limited to 'keystone/contrib')
-rw-r--r-- | keystone/contrib/access/__init__.py | 17 | ||||
-rw-r--r-- | keystone/contrib/access/core.py | 61 |
2 files changed, 78 insertions, 0 deletions
diff --git a/keystone/contrib/access/__init__.py b/keystone/contrib/access/__init__.py new file mode 100644 index 00000000..4b782183 --- /dev/null +++ b/keystone/contrib/access/__init__.py @@ -0,0 +1,17 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2013 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from keystone.contrib.access.core import * diff --git a/keystone/contrib/access/core.py b/keystone/contrib/access/core.py new file mode 100644 index 00000000..f0221200 --- /dev/null +++ b/keystone/contrib/access/core.py @@ -0,0 +1,61 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2013 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import webob +import webob.dec + +from keystone.common import logging +from keystone.common import wsgi +from keystone import config +from keystone.openstack.common import timeutils + + +CONF = config.CONF +LOG = logging.getLogger('access') +APACHE_TIME_FORMAT = '%d/%b/%Y:%H:%M:%S' +APACHE_LOG_FORMAT = ( + '%(remote_addr)s - %(remote_user)s [%(datetime)s] "%(method)s %(url)s ' + '%(http_version)s" %(status)s %(content_length)s') + + +class AccessLogMiddleware(wsgi.Middleware): + """Writes an access log to INFO.""" + + @webob.dec.wsgify + def __call__(self, request): + data = { + 'remote_addr': request.remote_addr, + 'remote_user': request.remote_user or '-', + 'method': request.method, + 'url': request.url, + 'http_version': request.http_version, + 'status': 500, + 'content_length': '-'} + + try: + response = request.get_response(self.application) + data['status'] = response.status_int + data['content_length'] = len(response.body) or '-' + finally: + # must be calculated *after* the application has been called + now = timeutils.utcnow() + + # timeutils may not return UTC, so we can't hardcode +0000 + data['datetime'] = '%s %s' % (now.strftime(APACHE_TIME_FORMAT), + now.strftime('%z') or '+0000') + + LOG.info(APACHE_LOG_FORMAT % data) + return response |