Allow logging.conf to be configured via attributes

deprecated the ['logging']['ignore']
Allow custom logger, handler and formatter sections

Change-Id: Icda718b18aecc0f6caefe6fd56599a720b24f4d0
Implements: blueprint allow-custom-logging-handlers
This commit is contained in:
Mark Vanderwiel 2014-07-17 12:59:44 -05:00
parent aa2b638a8f
commit 50d11569ad
6 changed files with 306 additions and 118 deletions

View File

@ -5,6 +5,7 @@ This file is used to list changes made in each version of cookbook-openstack-com
## 9.7.0
* Add new network_uuid cli library method for obtaining ID from various neutron resources
* fix fauxhai version for suse
* Allow custom logging attributes for loggers, formatters and handlers
## 9.6.1
* Add python_packages attribute for sqlite

View File

@ -234,6 +234,7 @@ License and Author
| **Author** | Ionut Artarisi (<iartarisi@suse.cz>) |
| **Author** | Chen Zhiwei (<zhiwchen@cn.ibm.com>) |
| **Author** | Brett Campbell (<brett.campbell@rackspace.com>) |
| **Author** | Mark Vanderwiel (<vanderwl@us.ibm.com>) |
| | |
| **Copyright** | Copyright (c) 2012-2013, AT&T Services, Inc. |
| **Copyright** | Copyright (c) 2013, Opscode, Inc. |

View File

@ -417,8 +417,149 @@ default['openstack']['region'] = 'RegionOne'
default['openstack']['api']['auth']['version'] = 'v2.0'
# logging.conf list keypairs module_name => log level to write
default['openstack']['logging']['ignore'] = { 'nova.api.openstack.wsgi' => 'WARNING',
'nova.osapi_compute.wsgi.server' => 'WARNING' }
# DEPRECATED, use new loggers attributes below.
# TODO(MRV) remove in Juno
# The old defaults have been incorporated below:
# { 'nova.api.openstack.wsgi' => 'WARNING',
# 'nova.osapi_compute.wsgi.server' => 'WARNING' }
default['openstack']['logging']['ignore'] = {}
# Allow configured loggers in logging.conf
default['openstack']['logging']['loggers'] = {
'root' => {
'level' => 'NOTSET',
'handlers' => 'devel'
},
'ceilometer' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'ceilometer'
},
'cinder' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'cinder'
},
'glance' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'glance'
},
'horizon' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'horizon'
},
'keystone' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'keystone'
},
'nova' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'nova'
},
'neutron' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'neutron'
},
'swift' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'swift'
},
'trove' => {
'level' => 'DEBUG',
'handlers' => 'prod,debug',
'qualname' => 'trove'
},
'amqplib' => {
'level' => 'WARNING',
'handlers' => 'stderr',
'qualname' => 'amqplib'
},
'sqlalchemy' => {
'level' => 'WARNING',
# "level' => 'INFO" logs SQL queries.
# "level' => 'DEBUG" logs SQL queries and results.
# "level' => 'WARNING" logs neither. (Recommended for production systems.)
'handlers' => 'stderr',
'qualname' => 'sqlalchemy'
},
'boto' => {
'level' => 'WARNING',
'handlers' => 'stderr',
'qualname' => 'boto'
},
'suds' => {
'level' => 'INFO',
'handlers' => 'stderr',
'qualname' => 'suds'
},
'eventletwsgi' => {
'level' => 'WARNING',
'handlers' => 'stderr',
'qualname' => 'eventlet.wsgi.server'
},
'nova_api_openstack_wsgi' => {
'level' => 'WARNING',
'handlers' => 'prod,debug',
'qualname' => 'nova.api.openstack.wsgi'
},
'nova_osapi_compute_wsgi_server' => {
'level' => 'WARNING',
'handlers' => 'prod,debug',
'qualname' => 'nova.osapi_compute.wsgi.server'
}
}
# Allow configured formatters in logging.conf
default['openstack']['logging']['formatters'] = {
'normal' => {
'format' => '%(asctime)s %(levelname)s %(message)s'
},
'normal_with_name' => {
'format' => '[%(name)s]: %(asctime)s %(levelname)s %(message)s'
},
'debug' => {
'format' => '[%(name)s]: %(asctime)s %(levelname)s %(module)s.%(funcName)s %(message)s'
},
'syslog_with_name' => {
'format' => '%(name)s: %(levelname)s %(message)s'
},
'syslog_debug' => {
'format' => '%(name)s: %(levelname)s %(module)s.%(funcName)s %(message)s'
}
}
# Allow configured logging handlers in logging.conf
default['openstack']['logging']['handlers'] = {
'stderr' => {
'args' => '(sys.stderr,)',
'class' => 'StreamHandler',
'formatter' => 'debug'
},
'devel' => {
'args' => '(sys.stdout,)',
'class' => 'StreamHandler',
'formatter' => 'debug',
'level' => 'NOTSET'
},
'prod' => {
'args' => '((\'/dev/log\'), handlers.SysLogHandler.LOG_LOCAL0)',
'class' => 'handlers.SysLogHandler',
'formatter' => 'syslog_with_name',
'level' => 'INFO'
},
'debug' => {
'args' => '((\'/dev/log\'), handlers.SysLogHandler.LOG_LOCAL1)',
'class' => 'handlers.SysLogHandler',
'formatter' => 'syslog_debug',
'level' => 'DEBUG'
}
}
default['openstack']['memcached_servers'] = nil

View File

@ -58,14 +58,143 @@ describe 'openstack-common::logging' do
node.set['openstack']['logging']['ignore'] = {
'test.nova.api.openstack.wsgi' => 'WARNING'
}
content = [
'[logger_test_nova_api_openstack_wsgi]',
'level = WARNING',
'handlers = prod,debug',
'qualname = test.nova.api.openstack.wsgi'
]
expect(chef_run).to render_file(file.name).with_content(build_section(content))
end
end
context 'loggers' do
it 'adds default loggers' do
[
/^\[logger_test_nova_api_openstack_wsgi\]$/,
/^level = WARNING$/,
/^handlers = prod,debug$/,
/^qualname = test.nova.api.openstack.wsgi$/
['[loggers]',
'keys=root,ceilometer,cinder,glance,horizon,keystone,nova,'\
'neutron,swift,trove,amqplib,sqlalchemy,boto,suds,eventletwsgi,'\
'nova_api_openstack_wsgi,nova_osapi_compute_wsgi_server,'],
['[logger_root]',
'level=NOTSET',
'handlers=devel'],
['[logger_ceilometer]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=ceilometer'],
['[logger_cinder]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=cinder'],
['[logger_glance]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=glance'],
['[logger_horizon]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=horizon'],
['[logger_keystone]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=keystone'],
['[logger_nova]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=nova'],
['[logger_neutron]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=neutron'],
['[logger_swift]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=swift'],
['[logger_trove]',
'level=DEBUG',
'handlers=prod,debug',
'qualname=trove'],
['[logger_amqplib]',
'level=WARNING',
'handlers=stderr',
'qualname=amqplib'],
['[logger_sqlalchemy]',
'level=WARNING',
'handlers=stderr',
'qualname=sqlalchemy'],
['[logger_boto]',
'level=WARNING',
'handlers=stderr',
'qualname=boto'],
['[logger_suds]',
'level=INFO',
'handlers=stderr',
'qualname=suds'],
['[logger_eventletwsgi]',
'level=WARNING',
'handlers=stderr',
'qualname=eventlet.wsgi.server'],
['[logger_nova_api_openstack_wsgi]',
'level=WARNING',
'handlers=prod,debug',
'qualname=nova.api.openstack.wsgi'],
['[logger_nova_osapi_compute_wsgi_server]',
'level=WARNING',
'handlers=prod,debug',
'qualname=nova.osapi_compute.wsgi.server']
].each do |content|
expect(chef_run).to render_file(file.name).with_content(content)
expect(chef_run).to render_file(file.name).with_content(build_section(content))
end
end
end
context 'formatters' do
it 'adds default formatters' do
[
['[formatters]',
'keys=normal,normal_with_name,debug,syslog_with_name,syslog_debug'],
['[formatter_normal]',
'format=%(asctime)s %(levelname)s %(message)s'],
['[formatter_normal_with_name]',
'format=[%(name)s]: %(asctime)s %(levelname)s %(message)s'],
['[formatter_debug]',
'format=[%(name)s]: %(asctime)s %(levelname)s %(module)s.%(funcName)s %(message)s'],
['[formatter_syslog_with_name]',
'format=%(name)s: %(levelname)s %(message)s'],
['[formatter_syslog_debug]',
'format=%(name)s: %(levelname)s %(module)s.%(funcName)s %(message)s']
].each do |content|
expect(chef_run).to render_file(file.name).with_content(build_section(content))
end
end
end
context 'handlers' do
it 'adds default handlers' do
[
['[handlers]',
'keys=stderr,devel,prod,debug'],
['[handler_stderr]',
'args=(sys.stderr,)',
'class=StreamHandler',
'formatter=debug'],
['[handler_devel]',
'args=(sys.stdout,)',
'class=StreamHandler',
'formatter=debug',
'level=NOTSET'],
['[handler_prod]',
"args=(('/dev/log'), handlers.SysLogHandler.LOG_LOCAL0)",
'class=handlers.SysLogHandler',
'formatter=syslog_with_name',
'level=INFO'],
['[handler_debug]',
"args=(('/dev/log'), handlers.SysLogHandler.LOG_LOCAL1)",
'class=handlers.SysLogHandler',
'formatter=syslog_debug',
'level=DEBUG']
].each do |content|
expect(chef_run).to render_file(file.name).with_content(build_section(content))
end
end
end

View File

@ -23,6 +23,12 @@ SUSE_OPTS = {
# We set a default platform for non-platform specific test cases
CHEFSPEC_OPTS = UBUNTU_OPTS
# Build a regex for a section of lines
def build_section(lines)
lines.map! { |line| Regexp.quote(line) }
/^#{lines.join('\n')}/
end
shared_context 'library-stubs' do
before do
subject.stub(:node).and_return(chef_run.node)

View File

@ -1,53 +1,31 @@
[loggers]
keys=root,ceilometer,cinder,glance,horizon,keystone,nova,neutron,swift,amqplib,sqlalchemy,boto,suds,eventletwsgi,<%= node["openstack"]["logging"]["ignore"].map{|k,v| k.gsub(/\W/, '_')}.join(',') %>
keys=<%= node["openstack"]["logging"]['loggers'].keys.join(',') %>,<%= node["openstack"]["logging"]["ignore"].map{|k,v| k.gsub(/\W/, '_')}.join(',') %>
[formatters]
keys=normal,normal_with_name,debug,syslog_with_name,syslog_debug
keys=<%= node["openstack"]["logging"]['formatters'].keys.join(',') %>
[handlers]
keys=stderr,devel,prod,debug
keys=<%= node["openstack"]["logging"]['handlers'].keys.join(',') %>
## FORMATTERS ##
[formatter_debug]
format=[%(name)s]: %(asctime)s %(levelname)s %(module)s.%(funcName)s %(message)s
<% node["openstack"]["logging"]['formatters'].each do |section, options| %>
[formatter_<%= section %>]
<% options.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
[formatter_normal]
format=%(asctime)s %(levelname)s %(message)s
[formatter_normal_with_name]
format=[%(name)s]: %(asctime)s %(levelname)s %(message)s
[formatter_syslog_with_name]
format=%(name)s: %(levelname)s %(message)s
[formatter_syslog_debug]
format=%(name)s: %(levelname)s %(module)s.%(funcName)s %(message)s
<% end %>
## LOGGERS ##
[logger_amqplib]
level = WARNING
handlers = stderr
qualname = amqplib
<% node["openstack"]["logging"]['loggers'].each do |section, options| %>
[logger_<%= section %>]
<% options.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
[logger_sqlalchemy]
level = WARNING
handlers = stderr
qualname = sqlalchemy
# "level = INFO" logs SQL queries.
# "level = DEBUG" logs SQL queries and results.
# "level = WARNING" logs neither. (Recommended for production systems.)
[logger_boto]
level = WARNING
handlers = stderr
qualname = boto
[logger_suds]
level = INFO
handlers = stderr
qualname = suds
<% end %>
<% node["openstack"]["logging"]["ignore"].each do |k,v| %>
[logger_<%= k.gsub(/\W/, '_') %>]
@ -56,81 +34,13 @@ handlers = prod,debug
qualname = <%= k %>
<% end %>
[logger_eventletwsgi]
level = WARNING
handlers = stderr
qualname = eventlet.wsgi.server
[logger_root]
level=NOTSET
handlers=devel
[logger_ceilometer]
level=DEBUG
handlers=prod,debug
qualname=ceilometer
[logger_cinder]
level=DEBUG
handlers=prod,debug
qualname=cinder
[logger_glance]
level=DEBUG
handlers=prod,debug
qualname=glance
[logger_horizon]
level=DEBUG
handlers=prod,debug
qualname=horizon
[logger_keystone]
level=DEBUG
handlers=prod,debug
qualname=keystone
[logger_nova]
level=DEBUG
handlers=prod,debug
qualname=nova
[logger_neutron]
level=DEBUG
handlers=prod,debug
qualname=neutron
[logger_swift]
level=DEBUG
handlers=prod,debug
qualname=swift
## HANDLERS ##
[handler_stderr]
class = StreamHandler
args = (sys.stderr,)
formatter = debug
<% node["openstack"]["logging"]['handlers'].each do |section, options| %>
[handler_<%= section %>]
<% options.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
[handler_devel]
class=StreamHandler
level=NOTSET
formatter=debug
args=(sys.stdout,)
[handler_file]
class=FileHandler
formatter=debug
args=('/var/log/openstack/openstack.log', 'w')
[handler_prod]
level=INFO
class=handlers.SysLogHandler
formatter=syslog_with_name
args=(('/dev/log'), handlers.SysLogHandler.LOG_LOCAL0)
[handler_debug]
level=DEBUG
class=handlers.SysLogHandler
formatter=syslog_debug
args=(('/dev/log'), handlers.SysLogHandler.LOG_LOCAL1)
<% end %>