Skip to content

Commit

Permalink
Merge writestostderr-booyah-7903: Make legacy logging events from wri…
Browse files Browse the repository at this point in the history
…ting to stderr set isError correctly

Authors: exarkun, hawkowl
Reviewers: exarkun, wsanchez, glyph
Fixes: twisted#7903

git-svn-id: svn://svn.twistedmatrix.com/svn/Twisted/trunk@44879 bbbe8e31-12d6-0310-92fd-ac37d47ddeeb
  • Loading branch information
hawkowl committed May 20, 2015
1 parent 7d55d2d commit c0b7f71
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 7 deletions.
12 changes: 9 additions & 3 deletions twisted/logger/_legacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,10 @@ def __call__(self, event):
if "why" not in event:
event["why"] = formatEvent(event)
elif "isError" not in event:
event["isError"] = 0
if event["log_level"] in (LogLevel.error, LogLevel.critical):
event["isError"] = 1
else:
event["isError"] = 0

self.legacyObserver(event)

Expand Down Expand Up @@ -131,8 +134,11 @@ def publishToNewObserver(observer, eventDict, textFromEventDict):
level = fromStdlibLogLevelMapping[eventDict["logLevel"]]
except KeyError:
level = None
elif eventDict["isError"]:
level = LogLevel.critical
elif "isError" in eventDict:
if eventDict["isError"]:
level = LogLevel.critical
else:
level = LogLevel.info
else:
level = LogLevel.info

Expand Down
19 changes: 17 additions & 2 deletions twisted/logger/test/test_legacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ def forwardAndVerify(self, event):
# Make sure keys that are expected by the logging system are present
event.setdefault("log_time", time())
event.setdefault("log_system", "-")
event.setdefault("log_level", LogLevel.info)

# Send a copy: don't mutate me, bro
observed = self.observe(dict(event))
Expand Down Expand Up @@ -155,12 +156,24 @@ def test_noSystem(self):
If the new-style C{"log_system"} key is absent, the old-style
C{"system"} key is set to C{"-"}.
"""
# Don't use forwardAndVerify(), since that's sets log_system.
event = dict(log_time=time())
# Don't use forwardAndVerify(), since that sets log_system.
event = dict(log_time=time(), log_level=LogLevel.info)
observed = self.observe(dict(event))
self.assertEqual(observed["system"], "-")


def test_levelNotChange(self):
"""
If explicitly set, the C{isError} key will be preserved when forwarding
from a new-style logging emitter to a legacy logging observer,
regardless of log level.
"""
self.forwardAndVerify(dict(log_level=LogLevel.info, isError=1))
self.forwardAndVerify(dict(log_level=LogLevel.warn, isError=1))
self.forwardAndVerify(dict(log_level=LogLevel.error, isError=0))
self.forwardAndVerify(dict(log_level=LogLevel.critical, isError=0))


def test_pythonLogLevelNotSet(self):
"""
The new-style C{"log_level"} key is not translated to the old-style
Expand Down Expand Up @@ -327,6 +340,8 @@ def legacyEvent(self, *message, **values):
event.update(values)
event["message"] = message
event["time"] = time()
if "isError" not in event:
event["isError"] = 0
return event


Expand Down
5 changes: 3 additions & 2 deletions twisted/python/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,7 @@ def __call__(eventDict):


context.setDefault(ILogContext,
{"isError": 0,
"system": "-"})
{"system": "-"})


def callWithContext(ctx, func, *args, **kw):
Expand Down Expand Up @@ -277,6 +276,8 @@ def msg(self, *message, **kw):
actualEventDict.update(kw)
actualEventDict['message'] = message
actualEventDict['time'] = time.time()
if "isError" not in actualEventDict:
actualEventDict["isError"] = 0

_publishNew(self._publishPublisher, actualEventDict, textFromEventDict)

Expand Down
18 changes: 18 additions & 0 deletions twisted/test/test_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,24 @@ def _startLoggingCleanup(self):
self.addCleanup(setattr, sys, 'stderr', sys.stderr)


def test_printToStderrSetsIsError(self):
"""
startLogging()'s overridden sys.stderr should consider everything
written to it an error.
"""
self._startLoggingCleanup()
fakeFile = StringIO()
log.startLogging(fakeFile)

def observe(event):
observed.append(event)
observed = []
log.addObserver(observe)

print("Hello, world.", file=sys.stderr)
self.assertEqual(observed[0]["isError"], 1)


def test_startLogging(self):
"""
startLogging() installs FileLogObserver and overrides sys.stdout and
Expand Down
1 change: 1 addition & 0 deletions twisted/topfiles/7903.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
twisted.logger now marks the `isError` key correctly on legacy events generated by writes to stderr.

0 comments on commit c0b7f71

Please sign in to comment.