googleapis / googleapis/google-cloud-python

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

オープン
#17,339 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
api: logging priority: p3 type: bug
主要言語
Python
スター
5.4k
フォーク
1.8k
平均マージ
3日 4時間
マージ済み PR(30日)
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 を短くまとめたダイジェスト。