diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd810de..9d3b8d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,9 @@ You can find our backwards-compatibility policy [here](https://github.com/hynek/
 - `structlog.processors.LogfmtRenderer` now escapes newlines.
   [#592](https://github.com/hynek/structlog/pull/592)
 
+- `structlog.processors.LogfmtRenderer` now escapes backslashes and double quotes.
+  [#594](https://github.com/hynek/structlog/pull/594)
+
 
 ## [24.1.0](https://github.com/hynek/structlog/compare/23.3.0...24.1.0) - 2024-01-08
 
diff --git a/src/structlog/processors.py b/src/structlog/processors.py
index ba87eb3..e597eae 100644
--- a/src/structlog/processors.py
+++ b/src/structlog/processors.py
@@ -170,9 +170,16 @@ class LogfmtRenderer:
                     continue
                 value = "true" if value else "false"
 
-            value = f"{value}".replace('"', '\\"').replace("\n", "\\n")
+            value = str(value)
+            backslashes_need_escaping = (
+                " " in value or "=" in value or '"' in value
+            )
+            if backslashes_need_escaping and "\\" in value:
+                value = value.replace("\\", "\\\\")
+
+            value = value.replace('"', '\\"').replace("\n", "\\n")
 
-            if " " in value or "=" in value:
+            if backslashes_need_escaping:
                 value = f'"{value}"'
 
             elements.append(f"{key}={value}")

diff --git a/tests/processors/test_renderers.py b/tests/processors/test_renderers.py
index b3d6e51..8f225c8 100644
--- a/tests/processors/test_renderers.py
+++ b/tests/processors/test_renderers.py
@@ -275,6 +275,33 @@ class TestLogfmtRenderer:
 
         assert r"with_newline=some\nvalue" == rv
 
+    @pytest.mark.parametrize(
+        ("raw", "escaped"),
+        [
+            # Slash by itself does not need to be escaped.
+            (r"a\slash", r"a\slash"),
+            # A quote requires quoting, and escaping the quote.
+            ('a"quote', r'"a\"quote"'),
+            # If anything triggers quoting of the string, then the slash must
+            # be escaped.
+            (
+                r'a\slash with space or a"quote',
+                r'"a\\slash with space or a\"quote"',
+            ),
+            (
+                r"I want to render this \"string\" with logfmtrenderer",
+                r'"I want to render this \\\"string\\\" with logfmtrenderer"',
+            ),
+        ],
+    )
+    def test_escaping(self, raw, escaped):
+        """
+        Backslashes and quotes are escaped.
+        """
+        rv = LogfmtRenderer()(None, None, {"key": raw})
+
+        assert f"key={escaped}" == rv
+
 
 class TestJSONRenderer:
     def test_renders_json(self, event_dict):

LogfmtRenderer  has a bug with escaped double quotes
In the code of LogFmtRenderer there is:

`value = f"{value}".replace('"', '\\"')`

However if you are trying to render an escaped double quote like
`"I want to render this \"string\" with logfmtrenderer"`

it ends up rendering it as
`\"I want to render this \\"string\\" with logfmtrenderer\"`

`\\"` is wrong and won't be parsed correctly by a logfmtparser.

tests/processors/test_renderers.py::TestLogfmtRenderer::test_escaping[a"quote-"a\\"quote"] tests/processors/test_renderers.py::TestLogfmtRenderer::test_escaping[a\\slash tests/processors/test_renderers.py::TestLogfmtRenderer::test_escaping[I
tests/processors/test_renderers.py::TestKeyValueRenderer::test_sort_keys tests/processors/test_renderers.py::TestKeyValueRenderer::test_order_complete tests/processors/test_renderers.py::TestKeyValueRenderer::test_order_missing tests/processors/test_renderers.py::TestKeyValueRenderer::test_order_missing_dropped tests/processors/test_renderers.py::TestKeyValueRenderer::test_order_extra tests/processors/test_renderers.py::TestKeyValueRenderer::test_order_sorted_missing_dropped tests/processors/test_renderers.py::TestKeyValueRenderer::test_random_order tests/processors/test_renderers.py::TestKeyValueRenderer::test_repr_native_str[True] tests/processors/test_renderers.py::TestKeyValueRenderer::test_repr_native_str[False] tests/processors/test_renderers.py::TestLogfmtRenderer::test_sort_keys tests/processors/test_renderers.py::TestLogfmtRenderer::test_order_complete tests/processors/test_renderers.py::TestLogfmtRenderer::test_order_missing tests/processors/test_renderers.py::TestLogfmtRenderer::test_order_missing_dropped tests/processors/test_renderers.py::TestLogfmtRenderer::test_order_extra tests/processors/test_renderers.py::TestLogfmtRenderer::test_order_sorted_missing_dropped tests/processors/test_renderers.py::TestLogfmtRenderer::test_random_order tests/processors/test_renderers.py::TestLogfmtRenderer::test_empty_event_dict tests/processors/test_renderers.py::TestLogfmtRenderer::test_bool_as_flag tests/processors/test_renderers.py::TestLogfmtRenderer::test_reference_format tests/processors/test_renderers.py::TestLogfmtRenderer::test_equal_sign_or_space_in_value tests/processors/test_renderers.py::TestLogfmtRenderer::test_invalid_key tests/processors/test_renderers.py::TestLogfmtRenderer::test_newline_in_value tests/processors/test_renderers.py::TestLogfmtRenderer::test_escaping[a\\slash-a\\slash] tests/processors/test_renderers.py::TestJSONRenderer::test_renders_json tests/processors/test_renderers.py::TestJSONRenderer::test_FallbackEncoder_handles_ThreadLocalDictWrapped_dicts tests/processors/test_renderers.py::TestJSONRenderer::test_FallbackEncoder_falls_back tests/processors/test_renderers.py::TestJSONRenderer::test_serializer tests/processors/test_renderers.py::TestJSONRenderer::test_custom_fallback tests/processors/test_renderers.py::TestJSONRenderer::test_simplejson tests/processors/test_renderers.py::TestTimeStamper::test_disallows_non_utc_unix_timestamps tests/processors/test_renderers.py::TestTimeStamper::test_inserts_utc_unix_timestamp_by_default tests/processors/test_renderers.py::TestTimeStamper::test_local tests/processors/test_renderers.py::TestTimeStamper::test_formats tests/processors/test_renderers.py::TestTimeStamper::test_adds_Z_to_iso tests/processors/test_renderers.py::TestTimeStamper::test_key_can_be_specified tests/processors/test_renderers.py::TestTimeStamper::test_pickle[0-None-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[0-None-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[0-None-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[0-other-key-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[0-other-key-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[0-other-key-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[1-None-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[1-None-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[1-None-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[1-other-key-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[1-other-key-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[1-other-key-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[2-None-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[2-None-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[2-None-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[2-other-key-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[2-other-key-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[2-other-key-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[3-None-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[3-None-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[3-None-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[3-other-key-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[3-other-key-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[3-other-key-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[4-None-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[4-None-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[4-None-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[4-other-key-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[4-other-key-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[4-other-key-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[5-None-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[5-None-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[5-None-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[5-other-key-True-None] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[5-other-key-True-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_pickle[5-other-key-False-%Y] tests/processors/test_renderers.py::TestTimeStamper::test_apply_freezegun_after_instantiation tests/processors/test_renderers.py::TestMaybeTimeStamper::test_overwrite tests/processors/test_renderers.py::TestMaybeTimeStamper::test_none tests/processors/test_renderers.py::TestFormatExcInfo::test_custom_formatter tests/processors/test_renderers.py::TestFormatExcInfo::test_nop[False] tests/processors/test_renderers.py::TestFormatExcInfo::test_nop[None] tests/processors/test_renderers.py::TestFormatExcInfo::test_nop[] tests/processors/test_renderers.py::TestFormatExcInfo::test_nop_missing tests/processors/test_renderers.py::TestFormatExcInfo::test_formats_tuple tests/processors/test_renderers.py::TestFormatExcInfo::test_gets_exc_info_on_bool tests/processors/test_renderers.py::TestFormatExcInfo::test_exception tests/processors/test_renderers.py::TestFormatExcInfo::test_exception_without_traceback tests/processors/test_renderers.py::TestFormatExcInfo::test_format_exception tests/processors/test_renderers.py::TestFormatExcInfo::test_no_exception[True] tests/processors/test_renderers.py::TestFormatExcInfo::test_no_exception[ei1]