diff --git a/src/structlog/dev.py b/src/structlog/dev.py
index 0160650..372f7fc 100644
--- a/src/structlog/dev.py
+++ b/src/structlog/dev.py
@@ -8,7 +8,7 @@ Helpers that make development with ``structlog`` more pleasant.
 
 from __future__ import absolute_import, division, print_function
 
-from six import StringIO
+from six import PY2, StringIO, string_types
 
 
 try:
@@ -213,7 +213,11 @@ class ConsoleRenderer(object):
                 + "] "
             )
 
+        # force event to str for compatibility with standard library
         event = event_dict.pop("event")
+        if not PY2 or not isinstance(event, string_types):
+            event = str(event)
+
         if event_dict:
             event = _pad(event, self._pad_event) + self._styles.reset + " "
         else:

diff --git a/tests/test_dev.py b/tests/test_dev.py
index ee048a4..11690ba 100644
--- a/tests/test_dev.py
+++ b/tests/test_dev.py
@@ -81,6 +81,27 @@ class TestConsoleRenderer(object):
 
         assert (styles.timestamp + "42" + styles.reset + " " + unpadded) == rv
 
+    def test_event_stringified(self, cr, styles, unpadded):
+        """
+        Event is cast to string.
+        """
+        not_a_string = Exception("test")
+
+        rv = cr(None, None, {"event": not_a_string})
+
+        assert unpadded == rv
+
+    @pytest.mark.skipif(not six.PY2, reason="Problem only exists on Python 2.")
+    @pytest.mark.parametrize("s", [u"\xc3\xa4".encode("utf-8"), u"ä", "ä"])
+    def test_event_py2_only_stringify_non_strings(self, cr, s, styles):
+        """
+        If event is a string type already, leave it be on Python 2. Running
+        str() on unicode strings with non-ascii characters raises an error.
+        """
+        rv = cr(None, None, {"event": s})
+
+        assert styles.bright + s + styles.reset == rv
+
     def test_level(self, cr, styles, padded):
         """
         Levels are rendered aligned, in square brackets, and color coded.

ConsoleRender accepts only string as input
Hello :)

First of all I would like to thank you for this very handy package. 

I have observed the following:

```python
import structlog

structlog.configure(
    processors=[
        structlog.stdlib.add_logger_name,
        structlog.stdlib.add_log_level,
        structlog.stdlib.PositionalArgumentsFormatter(),
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.StackInfoRenderer(),
        structlog.processors.format_exc_info,
        structlog.dev.ConsoleRenderer()
    ],
    context_class=dict,
    logger_factory=structlog.stdlib.LoggerFactory(),
    wrapper_class=structlog.stdlib.BoundLogger,
    cache_logger_on_first_use=True,
)

mylogger = structlog.get_logger('foo').new()

mylogger.info('bar')
>> 2018-11-08T10:49:46.903028Z [info  ] bar              [foo]

mylogger.info({'value': 'bar'})
>> Raises TypeError: unsupported operand type(s) for +: 'dict' and 'str'
```

After checking the code for ConsoleRender, it seems that it has been implemented to accept only str as value to log. On the other hand when using JSONRenderer, it logs without any problem a single dictionary as log message. Is this by design ? Am I missing something ?
tests/test_dev.py::TestConsoleRenderer::test_event_stringified
tests/test_dev.py::TestPad::test_normal tests/test_dev.py::TestPad::test_negative tests/test_dev.py::TestConsoleRenderer::test_missing_colorama tests/test_dev.py::TestConsoleRenderer::test_plain tests/test_dev.py::TestConsoleRenderer::test_timestamp tests/test_dev.py::TestConsoleRenderer::test_level tests/test_dev.py::TestConsoleRenderer::test_init_accepts_overriding_levels tests/test_dev.py::TestConsoleRenderer::test_logger_name tests/test_dev.py::TestConsoleRenderer::test_key_values tests/test_dev.py::TestConsoleRenderer::test_exception tests/test_dev.py::TestConsoleRenderer::test_stack_info tests/test_dev.py::TestConsoleRenderer::test_pad_event_param tests/test_dev.py::TestConsoleRenderer::test_everything tests/test_dev.py::TestConsoleRenderer::test_colorama_colors_false tests/test_dev.py::TestConsoleRenderer::test_colorama_force_colors tests/test_dev.py::TestConsoleRenderer::test_repr_native_str[True] tests/test_dev.py::TestConsoleRenderer::test_repr_native_str[False] tests/test_dev.py::TestConsoleRenderer::test_pickle[0-True-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[0-True-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[0-False-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[0-False-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[1-True-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[1-True-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[1-False-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[1-False-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[2-True-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[2-True-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[2-False-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[2-False-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[3-True-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[3-True-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[3-False-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[3-False-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[4-True-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[4-True-False] tests/test_dev.py::TestConsoleRenderer::test_pickle[4-False-True] tests/test_dev.py::TestConsoleRenderer::test_pickle[4-False-False] tests/test_dev.py::TestSetExcInfo::test_wrong_name tests/test_dev.py::TestSetExcInfo::test_already_set[False] tests/test_dev.py::TestSetExcInfo::test_already_set[None] tests/test_dev.py::TestSetExcInfo::test_already_set[ei2] tests/test_dev.py::TestSetExcInfo::test_set_it