Merge lp:~gmb/maas/oo-logging-sexy into lp:~maas-committers/maas/trunk

Proposed by Graham Binns
Status: Merged
Approved by: Graham Binns
Approved revision: no longer in the source branch.
Merged at revision: 2614
Proposed branch: lp:~gmb/maas/oo-logging-sexy
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 143 lines (+66/-16)
4 files modified
src/maasfascist.py (+1/-1)
src/provisioningserver/import_images/tests/test_boot_resources.py (+1/-1)
src/provisioningserver/logger/log.py (+29/-7)
src/provisioningserver/logger/tests/test_logger.py (+35/-7)
To merge this branch: bzr merge lp:~gmb/maas/oo-logging-sexy
Reviewer Review Type Date Requested Status
Julian Edwards (community) Approve
Review via email: mp+228686@code.launchpad.net

Commit message

Put the maaslogger inside a get_maas_logger() function for the sake of sanity and customisation.

To post a comment you must log in.
Revision history for this message
Julian Edwards (julian-edwards) wrote :

Nice work - just the stuff inline as discussed in person.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasfascist.py'
--- src/maasfascist.py 2014-07-21 20:12:28 +0000
+++ src/maasfascist.py 2014-07-29 14:38:06 +0000
@@ -33,7 +33,7 @@
33from inspect import (33from inspect import (
34 getmodule,34 getmodule,
35 getsourcefile,35 getsourcefile,
36)36 )
37from sys import (37from sys import (
38 _getframe as getframe,38 _getframe as getframe,
39 meta_path,39 meta_path,
4040
=== modified file 'src/provisioningserver/import_images/tests/test_boot_resources.py'
--- src/provisioningserver/import_images/tests/test_boot_resources.py 2014-07-25 13:47:09 +0000
+++ src/provisioningserver/import_images/tests/test_boot_resources.py 2014-07-29 14:38:06 +0000
@@ -14,11 +14,11 @@
14__metaclass__ = type14__metaclass__ = type
15__all__ = []15__all__ = []
1616
17import errno
18from datetime import (17from datetime import (
19 datetime,18 datetime,
20 timedelta,19 timedelta,
21 )20 )
21import errno
22import hashlib22import hashlib
23import json23import json
24import os24import os
2525
=== modified file 'src/provisioningserver/logger/log.py'
--- src/provisioningserver/logger/log.py 2014-07-29 09:36:01 +0000
+++ src/provisioningserver/logger/log.py 2014-07-29 14:38:06 +0000
@@ -13,16 +13,38 @@
1313
14__metaclass__ = type14__metaclass__ = type
15__all__ = [15__all__ = [
16 "maaslog",16 "get_maas_logger",
17 ]17 ]
1818
1919
20import logging20import logging
21from logging.handlers import SysLogHandler21from logging.handlers import SysLogHandler
2222
23maaslog = logging.getLogger("maas")23
24maaslog.setLevel(logging.DEBUG)24def get_maas_logger(syslog_tag=None):
25handler = SysLogHandler("/dev/log")25 """Return a MAAS logger that will log to syslog.
26maaslog.addHandler(handler)26
27formatter = logging.Formatter(fmt="maas: %(message)s")27 :param syslog_tag: A string that will be used to prefix the message
28handler.setFormatter(formatter)28 in syslog. Will be appended to "maas" in the form
29 "maas.<syslog_tag>". If None, the syslog tag will simply be
30 "maas". syslog_tag is also used to name the logger with the
31 Python logging module; loggers will be named "maas.<syslog_tag>"
32 unless syslog_tag is None.
33 """
34 if syslog_tag is None:
35 logger_name = "maas"
36 else:
37 logger_name = "maas.%s" % syslog_tag
38 maaslog = logging.getLogger(logger_name)
39 # If the logger already has handlers, it's already been
40 # instantiated, so we don't need to go through the setup dance
41 # again.
42 if len(maaslog.handlers) > 0:
43 return maaslog
44
45 maaslog.setLevel(logging.DEBUG)
46 handler = SysLogHandler("/dev/log")
47 maaslog.addHandler(handler)
48 formatter = logging.Formatter(fmt=maaslog.name + ": %(message)s")
49 handler.setFormatter(formatter)
50 return maaslog
2951
=== modified file 'src/provisioningserver/logger/tests/test_logger.py'
--- src/provisioningserver/logger/tests/test_logger.py 2014-07-29 09:36:01 +0000
+++ src/provisioningserver/logger/tests/test_logger.py 2014-07-29 14:38:06 +0000
@@ -14,24 +14,52 @@
14__metaclass__ = type14__metaclass__ = type
15__all__ = []15__all__ = []
1616
17import logging.handlers17import logging
18
18from maastesting.factory import factory19from maastesting.factory import factory
19from maastesting.matchers import MockCalledOnceWith20from maastesting.matchers import MockCalledOnceWith
21from provisioningserver.logger import log
22from provisioningserver.logger.log import get_maas_logger
20from provisioningserver.testing.testcase import PservTestCase23from provisioningserver.testing.testcase import PservTestCase
2124
2225
23class TestMAASLog(PservTestCase):26class TestGetMAASLogger(PservTestCase):
2427
25 def test_logs_to_syslog(self):28 def test_logger_logs_to_syslog(self):
26 handler = self.patch(logging.handlers, 'SysLogHandler')29 handler = self.patch(log, 'SysLogHandler')
27 from provisioningserver.logger.log import maaslog30 self.patch(logging, 'Formatter')
28 from provisioningserver.logger import log31 maaslog = get_maas_logger()
29 random_log_text = factory.make_string()32 random_log_text = factory.make_string()
30 maaslog.warn(random_log_text)33 maaslog.warn(random_log_text)
31 self.assertThat(34 self.assertThat(
32 handler.return_value.setFormatter,35 handler.return_value.setFormatter,
33 MockCalledOnceWith(log.formatter))36 MockCalledOnceWith(logging.Formatter.return_value))
34 self.assertThat(37 self.assertThat(
35 handler, MockCalledOnceWith("/dev/log"))38 handler, MockCalledOnceWith("/dev/log"))
36 # For future hackers, handler.emit should be getting called here39 # For future hackers, handler.emit should be getting called here
37 # but it's not. NFI why. HALP.40 # but it's not. NFI why. HALP.
41
42 def test_adds_custom_formatting(self):
43 self.patch(log, 'SysLogHandler')
44 formatter = self.patch(logging, 'Formatter')
45 extra_formatting = factory.make_string()
46 get_maas_logger(extra_formatting)
47 self.assertThat(
48 formatter,
49 MockCalledOnceWith(
50 fmt=("maas.%s:" % extra_formatting) + " %(message)s"))
51
52 def test_sets_logger_name(self):
53 self.patch(log, 'SysLogHandler')
54 self.patch(logging, 'Formatter')
55 name = factory.make_string()
56 maaslog = get_maas_logger(name)
57 self.assertEqual("maas.%s" % name, maaslog.name)
58
59 def test_returns_same_logger_if_called_twice(self):
60 self.patch(log, 'SysLogHandler')
61 self.patch(logging, 'Formatter')
62 name = factory.make_string()
63 maaslog = get_maas_logger(name)
64 maaslog_2 = get_maas_logger(name)
65 self.assertIs(maaslog, maaslog_2)