googleapis / googleapis/google-cloud-python

Logging the literal string "None" is silently dropped (payload becomes empty)

未关闭
#17,339 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
api: logging priority: p3 type: bug
主要语言
Python
星标
5.4k
派生
1.8k
平均合并
3 天 4 小时
30 天内合并 PR
122

描述

- [x] I determined this is the correct repository in which to report this bug.

## Summary of the issue

**Context**
Using `CloudLoggingHandler` / `StructuredLogHandler` via the Python standard logging module, I logged the string `"None"` (e.g. `logging.getLogger().info("None")`).

**Expected Behavior:**
The log entry payload should contain the text `"None"`, just like any other string.

**Actual Behavior:**
The message is silently dropped: the parsed payload becomes `None` (empty), so the log content disappears.

## API client name and version

google-cloud-logging v3.15.0 (also present on current `main`)

## Reproduction steps: code

```python
import logging
from google.cloud.logging_v2.handlers import handlers as H

class FakeHandler(logging.Handler):
pass

h = FakeHandler()
h.setFormatter(logging.Formatter())

def rec(msg):
return logging.LogRecord("n", logging.INFO, "p", 1, msg, (), None)

for msg in ["None", "hello", ""]:
print(repr(msg), "->", repr(H._format_and_parse_message(rec(msg), h)))
```

## Reproduction steps: actual results

```
'None' -> None # the user's message is dropped
'hello' -> 'hello'
'' -> ''
```

## Reproduction steps: expected results

```
'None' -> 'None' # the literal string should be preserved
'hello' -> 'hello'
'' -> ''
```

## OS & version + platform

Any (logic bug, platform-independent)

## Python environment

Python 3.12

## Additional context

Root cause in `google/cloud/logging_v2/handlers/handlers.py` (`_format_and_parse_message`):

```python
if message != "None":
passed_json_fields["message"] = message
...
return message if message != "None" else None
```

The intent appears to be detecting a record whose `msg` is the Python object `None` (which `logging.Formatter` renders as the string `"None"`). But comparing the *formatted string* against `"None"` also matches a legitimate user message of the literal text `"None"`, dropping it. Detecting emptiness from `record.msg is None` (before formatting) rather than from the formatted output would avoid the false positive.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。