Add and use ceilometer own log module
This fixes bug #1004130 Change-Id: I143124ad411d5efefa604e831173dca87548bd7f Signed-off-by: Julien Danjou <julien.danjou@enovance.com>
This commit is contained in:
parent
14c068d2e8
commit
8780157755
@ -23,13 +23,13 @@ eventlet.monkey_patch()
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from nova import flags
|
from nova import flags
|
||||||
from nova import log as logging
|
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
from ceilometer import log
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
flags.parse_args(sys.argv)
|
flags.parse_args(sys.argv)
|
||||||
logging.setup()
|
log.setup()
|
||||||
utils.monkey_patch()
|
utils.monkey_patch()
|
||||||
server = \
|
server = \
|
||||||
service.Service.create(binary='ceilometer-agent',
|
service.Service.create(binary='ceilometer-agent',
|
||||||
|
@ -23,13 +23,13 @@ eventlet.monkey_patch()
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from nova import flags
|
from nova import flags
|
||||||
from nova import log as logging
|
|
||||||
from nova import service
|
from nova import service
|
||||||
from nova import utils
|
from nova import utils
|
||||||
|
from ceilometer import log
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
flags.parse_args(sys.argv)
|
flags.parse_args(sys.argv)
|
||||||
logging.setup()
|
log.setup()
|
||||||
utils.monkey_patch()
|
utils.monkey_patch()
|
||||||
server = \
|
server = \
|
||||||
service.Service.create(binary='ceilometer-collector',
|
service.Service.create(binary='ceilometer-collector',
|
||||||
|
@ -18,18 +18,15 @@
|
|||||||
|
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
|
|
||||||
from nova import log as logging
|
|
||||||
from nova import manager
|
from nova import manager
|
||||||
from nova import rpc
|
from nova import rpc
|
||||||
|
|
||||||
from ceilometer import meter
|
from ceilometer import meter
|
||||||
from ceilometer import cfg
|
from ceilometer import cfg
|
||||||
|
from ceilometer import log
|
||||||
|
|
||||||
|
|
||||||
# FIXME(dhellmann): We need to have the main program set up logging
|
LOG = log.getLogger(__name__)
|
||||||
# correctly so messages from modules outside of the nova package
|
|
||||||
# appear in the output.
|
|
||||||
LOG = logging.getLogger('nova.' + __name__)
|
|
||||||
|
|
||||||
COMPUTE_PLUGIN_NAMESPACE = 'ceilometer.poll.compute'
|
COMPUTE_PLUGIN_NAMESPACE = 'ceilometer.poll.compute'
|
||||||
|
|
||||||
|
@ -21,12 +21,9 @@ and publish the results.
|
|||||||
|
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
|
|
||||||
from nova import log as logging
|
from ceilometer import log
|
||||||
|
|
||||||
# FIXME(dhellmann): We need to have the main program set up logging
|
LOG = log.getLogger(__name__)
|
||||||
# correctly so messages from modules outside of the nova package
|
|
||||||
# appear in the output.
|
|
||||||
LOG = logging.getLogger('nova.' + __name__)
|
|
||||||
|
|
||||||
|
|
||||||
class NotificationDispatcher(object):
|
class NotificationDispatcher(object):
|
||||||
|
@ -18,12 +18,12 @@
|
|||||||
|
|
||||||
from nova import context
|
from nova import context
|
||||||
from nova import flags
|
from nova import flags
|
||||||
from nova import log as logging
|
|
||||||
from nova import manager
|
from nova import manager
|
||||||
from nova import rpc as nova_rpc
|
from nova import rpc as nova_rpc
|
||||||
from nova.rpc import dispatcher as rpc_dispatcher
|
from nova.rpc import dispatcher as rpc_dispatcher
|
||||||
|
|
||||||
from ceilometer import rpc
|
from ceilometer import rpc
|
||||||
|
from ceilometer import log
|
||||||
from ceilometer import meter
|
from ceilometer import meter
|
||||||
from ceilometer import cfg
|
from ceilometer import cfg
|
||||||
from ceilometer.collector import dispatcher
|
from ceilometer.collector import dispatcher
|
||||||
@ -33,10 +33,7 @@ from ceilometer.collector import dispatcher
|
|||||||
import nova.notifier.rabbit_notifier
|
import nova.notifier.rabbit_notifier
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
# FIXME(dhellmann): We need to have the main program set up logging
|
LOG = log.getLogger(__name__)
|
||||||
# correctly so messages from modules outside of the nova package
|
|
||||||
# appear in the output.
|
|
||||||
LOG = logging.getLogger('nova.' + __name__)
|
|
||||||
|
|
||||||
|
|
||||||
COMPUTE_COLLECTOR_NAMESPACE = 'ceilometer.collector.compute'
|
COMPUTE_COLLECTOR_NAMESPACE = 'ceilometer.collector.compute'
|
||||||
|
@ -20,19 +20,15 @@ import datetime
|
|||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
|
|
||||||
from nova import log as logging
|
|
||||||
from nova import flags
|
from nova import flags
|
||||||
import nova.virt.connection
|
import nova.virt.connection
|
||||||
|
|
||||||
from .. import counter
|
from ceilometer import log
|
||||||
from .. import plugin
|
from ceilometer import counter
|
||||||
|
from ceilometer import plugin
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
# FIXME(dhellmann): We need to have the main program set up logging
|
|
||||||
# correctly so messages from modules outside of the nova package
|
|
||||||
# appear in the output.
|
|
||||||
LOG = logging.getLogger('nova.' + __name__)
|
|
||||||
|
|
||||||
MIB = 2 ** 20 # mebibytes
|
MIB = 2 ** 20 # mebibytes
|
||||||
|
|
||||||
@ -57,7 +53,7 @@ def make_counter_from_instance(instance, type, volume):
|
|||||||
|
|
||||||
class DiskIOPollster(plugin.PollsterBase):
|
class DiskIOPollster(plugin.PollsterBase):
|
||||||
|
|
||||||
LOG = logging.getLogger('nova.' + __name__ + '.diskio')
|
LOG = log.getLogger(__name__ + '.diskio')
|
||||||
|
|
||||||
def _get_disks(self, conn, instance):
|
def _get_disks(self, conn, instance):
|
||||||
"""Get disks of an instance, only used to bypass bug#998089."""
|
"""Get disks of an instance, only used to bypass bug#998089."""
|
||||||
@ -98,7 +94,7 @@ class DiskIOPollster(plugin.PollsterBase):
|
|||||||
|
|
||||||
class CPUPollster(plugin.PollsterBase):
|
class CPUPollster(plugin.PollsterBase):
|
||||||
|
|
||||||
LOG = logging.getLogger('nova.' + __name__ + '.cpu')
|
LOG = log.getLogger(__name__ + '.cpu')
|
||||||
|
|
||||||
def get_counters(self, manager, context):
|
def get_counters(self, manager, context):
|
||||||
conn = nova.virt.connection.get_connection(read_only=True)
|
conn = nova.virt.connection.get_connection(read_only=True)
|
||||||
|
@ -16,16 +16,17 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from nova import log as logging
|
|
||||||
from nova import exception
|
from nova import exception
|
||||||
|
|
||||||
|
from ceilometer import log
|
||||||
|
|
||||||
from .. import counter
|
from .. import counter
|
||||||
from .. import plugin
|
from .. import plugin
|
||||||
|
|
||||||
|
|
||||||
class FloatingIPPollster(plugin.PollsterBase):
|
class FloatingIPPollster(plugin.PollsterBase):
|
||||||
|
|
||||||
LOG = logging.getLogger('nova.' + __name__ + '.floatingip')
|
LOG = log.getLogger(__name__ + '.floatingip')
|
||||||
|
|
||||||
def get_counters(self, manager, context):
|
def get_counters(self, manager, context):
|
||||||
try:
|
try:
|
||||||
|
98
ceilometer/log.py
Normal file
98
ceilometer/log.py
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright © 2012 eNovance <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Author: Julien Danjou <julien@danjou.info>
|
||||||
|
#
|
||||||
|
# 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 os
|
||||||
|
import inspect
|
||||||
|
import logging
|
||||||
|
import logging.config
|
||||||
|
import traceback
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from ceilometer import cfg
|
||||||
|
|
||||||
|
cfg.CONF.register_opts([
|
||||||
|
cfg.StrOpt('log_config',
|
||||||
|
help='Log configuration file',
|
||||||
|
),
|
||||||
|
cfg.StrOpt('log_file',
|
||||||
|
help='Log file',
|
||||||
|
),
|
||||||
|
cfg.StrOpt('log_dir',
|
||||||
|
help='Log file directory',
|
||||||
|
),
|
||||||
|
cfg.StrOpt('log_level',
|
||||||
|
default="debug",
|
||||||
|
help='Log level',
|
||||||
|
),
|
||||||
|
cfg.StrOpt('logging_default_format_string',
|
||||||
|
default='%(asctime)s %(levelname)s %(name)s: %(message)s',
|
||||||
|
help='format string to use for log messages'),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def _get_binary_name():
|
||||||
|
return os.path.basename(inspect.stack()[-1][1])
|
||||||
|
|
||||||
|
|
||||||
|
def _get_log_file_path(binary=None):
|
||||||
|
if cfg.CONF.log_file and not cfg.CONF.log_dir:
|
||||||
|
return cfg.CONF.log_file
|
||||||
|
|
||||||
|
if cfg.CONF.log_file and cfg.CONF.log_dir:
|
||||||
|
return os.path.join(cfg.CONF.log_file,
|
||||||
|
cfg.CONF.log_file)
|
||||||
|
|
||||||
|
if cfg.CONF.log_dir:
|
||||||
|
binary = binary or _get_binary_name()
|
||||||
|
return '%s.log' % (os.path.join(cfg.CONF.log_dir, binary),)
|
||||||
|
|
||||||
|
|
||||||
|
def getLogger(name='ceilometer'):
|
||||||
|
return logging.getLogger(name)
|
||||||
|
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
if cfg.CONF.log_config:
|
||||||
|
try:
|
||||||
|
logging.config.fileConfig(cfg.CONF.log_config)
|
||||||
|
except Exception:
|
||||||
|
traceback.print_exc()
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
root = getLogger()
|
||||||
|
for handler in root.handlers:
|
||||||
|
root.removeHandler(handler)
|
||||||
|
logpath = _get_log_file_path()
|
||||||
|
if logpath:
|
||||||
|
filelog = logging.handlers.WatchedFileHandler(logpath)
|
||||||
|
filelog.setFormatter(
|
||||||
|
logging.Formatter(cfg.CONF.logging_default_format_string))
|
||||||
|
root.addHandler(filelog)
|
||||||
|
|
||||||
|
mode = int(FLAGS.logfile_mode, 8)
|
||||||
|
st = os.stat(logpath)
|
||||||
|
if st.st_mode != (stat.S_IFREG | mode):
|
||||||
|
os.chmod(logpath, mode)
|
||||||
|
else:
|
||||||
|
streamlog = logging.StreamHandler(sys.stdout)
|
||||||
|
streamlog.setFormatter(
|
||||||
|
logging.Formatter(cfg.CONF.logging_default_format_string))
|
||||||
|
root.addHandler(streamlog)
|
||||||
|
|
||||||
|
if cfg.CONF.log_level:
|
||||||
|
root.setLevel(logging.getLevelName(cfg.CONF.log_level.upper()))
|
64
tests/test_log.py
Normal file
64
tests/test_log.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright © 2012 eNovance <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Author: Julien Danjou <julien@danjou.info>
|
||||||
|
#
|
||||||
|
# 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 unittest
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from ceilometer import log
|
||||||
|
from ceilometer import cfg
|
||||||
|
|
||||||
|
class LoggerTestCase(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(LoggerTestCase, self).setUp()
|
||||||
|
self.log = log.getLogger()
|
||||||
|
|
||||||
|
def test_log_level(self):
|
||||||
|
cfg.CONF.log_level = "info"
|
||||||
|
log.setup()
|
||||||
|
self.assertEqual(logging.INFO, self.log.getEffectiveLevel())
|
||||||
|
|
||||||
|
def test_child_log_level(self):
|
||||||
|
cfg.CONF.log_level = "info"
|
||||||
|
log.setup()
|
||||||
|
self.assertEqual(logging.INFO, log.getLogger('ceilometer.foobar').getEffectiveLevel())
|
||||||
|
|
||||||
|
|
||||||
|
class LogfilePathTestCase(unittest.TestCase):
|
||||||
|
def test_log_path_logdir(self):
|
||||||
|
cfg.CONF.log_dir = '/some/path'
|
||||||
|
cfg.CONF.log_file = None
|
||||||
|
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
|
||||||
|
'/some/path/foo-bar.log')
|
||||||
|
|
||||||
|
def test_log_path_logfile(self):
|
||||||
|
cfg.CONF.log_file = '/some/path/foo-bar.log'
|
||||||
|
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
|
||||||
|
'/some/path/foo-bar.log')
|
||||||
|
|
||||||
|
def test_log_path_none(self):
|
||||||
|
cfg.CONF.log_dir = None
|
||||||
|
cfg.CONF.log_file = None
|
||||||
|
self.assertTrue(log._get_log_file_path(binary='foo-bar') is None)
|
||||||
|
|
||||||
|
def test_log_path_logfile_overrides_logdir(self):
|
||||||
|
cfg.CONF.log_dir = '/some/other/path'
|
||||||
|
cfg.CONF.log_file = '/some/path/foo-bar.log'
|
||||||
|
self.assertEquals(log._get_log_file_path(binary='foo-bar'),
|
||||||
|
'/some/path/foo-bar.log')
|
||||||
|
|
Loading…
Reference in New Issue
Block a user