Skip to content

Commit 296635c

Browse files
committed
Fix possible exception while formatting non-string message (#331)
1 parent b77f4fd commit 296635c

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed

CHANGELOG.rst

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
`Unreleased`_
2+
=============
3+
4+
- Fix possible exception during formatting of non-string messages (`#331 <https://github.com/Delgan/loguru/issues/331>`_).
5+
6+
17
`0.5.2`_ (2020-09-06)
28
=====================
39

loguru/_logger.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1914,7 +1914,7 @@ def _log(self, level_id, static_level_no, from_decorator, options, message, args
19141914
"function": code.co_name,
19151915
"level": RecordLevel(level_name, level_no, level_icon),
19161916
"line": frame.f_lineno,
1917-
"message": message,
1917+
"message": str(message),
19181918
"module": splitext(file_name)[0],
19191919
"name": name,
19201920
"process": RecordProcess(process.ident, process.name),
@@ -1941,7 +1941,7 @@ def _log(self, level_id, static_level_no, from_decorator, options, message, args
19411941
if args or kwargs:
19421942
colored_message = Colorizer.prepare_message(message, args, kwargs)
19431943
else:
1944-
colored_message = Colorizer.prepare_simple_message(message)
1944+
colored_message = Colorizer.prepare_simple_message(str(message))
19451945
log_record["message"] = colored_message.stripped
19461946
elif args or kwargs:
19471947
colored_message = None

tests/test_formatting.py

+58
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,64 @@ def sink(message):
164164
]
165165

166166

167+
def test_non_string_message(writer):
168+
logger.add(writer, format="{message}")
169+
170+
logger.info(1)
171+
logger.info({})
172+
logger.info(b"test")
173+
174+
assert writer.read() == "1\n{}\nb'test'\n"
175+
176+
177+
@pytest.mark.parametrize("colors", [True, False])
178+
def test_non_string_message_is_str_in_record(writer, colors):
179+
output = ""
180+
181+
def sink(message):
182+
nonlocal output
183+
assert isinstance(message.record["message"], str)
184+
output += message
185+
186+
def format(record):
187+
assert isinstance(record["message"], str)
188+
return "[{message}]\n"
189+
190+
logger.add(sink, format=format, catch=False)
191+
logger.opt(colors=colors).info(123)
192+
assert output == "[123]\n"
193+
194+
195+
@pytest.mark.parametrize("colors", [True, False])
196+
def test_missing_positional_field_during_formatting(writer, colors):
197+
logger.add(writer)
198+
199+
with pytest.raises(IndexError):
200+
logger.opt(colors=colors).info("Foo {} {}", 123)
201+
202+
203+
@pytest.mark.parametrize("colors", [True, False])
204+
def test_missing_named_field_during_formatting(writer, colors):
205+
logger.add(writer)
206+
207+
with pytest.raises(KeyError):
208+
logger.opt(colors=colors).info("Foo {bar}", baz=123)
209+
210+
211+
def test_not_formattable_message(writer):
212+
logger.add(writer)
213+
214+
with pytest.raises(AttributeError):
215+
logger.info(123, baz=456)
216+
217+
218+
def test_not_formattable_message_with_colors(writer):
219+
logger.add(writer)
220+
221+
with pytest.raises(TypeError):
222+
logger.opt(colors=True).info(123, baz=456)
223+
224+
167225
def test_invalid_color_markup(writer):
168226
with pytest.raises(ValueError):
169227
logger.add(writer, format="<red>Not closed tag", colorize=True)

0 commit comments

Comments
 (0)