summaryrefslogtreecommitdiffstats
path: root/keystone/contrib
diff options
context:
space:
mode:
authorDolph Mathews <dolph.mathews@gmail.com>2013-01-29 11:12:35 -0600
committerDolph Mathews <dolph.mathews@gmail.com>2013-01-31 08:16:21 -0600
commit378635224bdc88fef4e150405894be56acfbf0a3 (patch)
tree5750b43ec35f879dd0693a645135fca84ad9b9c9 /keystone/contrib
parent02da3afe4df65b8c469ceb430ca34dab83d6451c (diff)
downloadkeystone-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__.py17
-rw-r--r--keystone/contrib/access/core.py61
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