diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_logging_format/G004.py b/crates/ruff_linter/resources/test/fixtures/flake8_logging_format/G004.py index ffc9ed7dd2c03..e339006435013 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_logging_format/G004.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_logging_format/G004.py @@ -7,6 +7,9 @@ _LOGGER = logging.getLogger() _LOGGER.info(f"{__name__}") +logging.getLogger().info(f"{name}") + from logging import info + info(f"{name}") info(f"{__name__}") diff --git a/crates/ruff_linter/src/rules/flake8_logging_format/snapshots/ruff_linter__rules__flake8_logging_format__tests__G004.py.snap b/crates/ruff_linter/src/rules/flake8_logging_format/snapshots/ruff_linter__rules__flake8_logging_format__tests__G004.py.snap index 5594145d4fc34..b0b7f2b82378a 100644 --- a/crates/ruff_linter/src/rules/flake8_logging_format/snapshots/ruff_linter__rules__flake8_logging_format__tests__G004.py.snap +++ b/crates/ruff_linter/src/rules/flake8_logging_format/snapshots/ruff_linter__rules__flake8_logging_format__tests__G004.py.snap @@ -25,23 +25,31 @@ G004.py:8:14: G004 Logging statement uses f-string 8 | _LOGGER.info(f"{__name__}") | ^^^^^^^^^^^^^ G004 9 | -10 | from logging import info +10 | logging.getLogger().info(f"{name}") | -G004.py:11:6: G004 Logging statement uses f-string +G004.py:10:26: G004 Logging statement uses f-string | -10 | from logging import info -11 | info(f"{name}") + 8 | _LOGGER.info(f"{__name__}") + 9 | +10 | logging.getLogger().info(f"{name}") + | ^^^^^^^^^ G004 +11 | +12 | from logging import info + | + +G004.py:14:6: G004 Logging statement uses f-string + | +12 | from logging import info +13 | +14 | info(f"{name}") | ^^^^^^^^^ G004 -12 | info(f"{__name__}") +15 | info(f"{__name__}") | -G004.py:12:6: G004 Logging statement uses f-string +G004.py:15:6: G004 Logging statement uses f-string | -10 | from logging import info -11 | info(f"{name}") -12 | info(f"{__name__}") +14 | info(f"{name}") +15 | info(f"{__name__}") | ^^^^^^^^^^^^^ G004 | - - diff --git a/crates/ruff_python_semantic/src/analyze/logging.rs b/crates/ruff_python_semantic/src/analyze/logging.rs index d72b46d4e9ec8..7dd9d53d80ea1 100644 --- a/crates/ruff_python_semantic/src/analyze/logging.rs +++ b/crates/ruff_python_semantic/src/analyze/logging.rs @@ -25,6 +25,18 @@ pub fn is_logger_candidate( return false; }; + // If the attribute is an inline instantiation, match against known constructors. + if let Expr::Call(ast::ExprCall { func, .. }) = &**value { + return semantic + .resolve_qualified_name(func) + .is_some_and(|qualified_name| { + matches!( + qualified_name.segments(), + ["logging", "getLogger" | "Logger"] + ) + }); + } + // If the symbol was imported from another module, ensure that it's either a user-specified // logger object, the `logging` module itself, or `flask.current_app.logger`. if let Some(qualified_name) = semantic.resolve_qualified_name(value) {