@@ -237,6 +237,42 @@ module Stdlib {
237237 }
238238 }
239239 }
240+
241+ // ---------------------------------------------------------------------------
242+ // logging
243+ // ---------------------------------------------------------------------------
244+ /**
245+ * Provides models for the `logging.Logger` class and subclasses.
246+ *
247+ * See https://docs.python.org/3.9/library/logging.html#logging.Logger.
248+ */
249+ module Logger {
250+ /**
251+ * An instance of `logging.Logger`. Extend this class to model new instances.
252+ * Most major frameworks will provide a logger instance as a class attribute.
253+ */
254+ abstract class LoggerInstance extends API:: Node {
255+ override string toString ( ) { result = "logger" }
256+ }
257+
258+ /** Gets a reference to the `logging.Logger` class or any subclass. */
259+ API:: Node subclassRef ( ) {
260+ result = API:: moduleImport ( "logging" ) .getMember ( "Logger" ) .getASubclass * ( )
261+ }
262+
263+ /** Gets a reference to an instance of `logging.Logger` or any subclass. */
264+ API:: Node instance ( ) {
265+ result instanceof LoggerInstance
266+ or
267+ result = subclassRef ( ) .getReturn ( )
268+ or
269+ result = API:: moduleImport ( "logging" )
270+ or
271+ result = API:: moduleImport ( "logging" ) .getMember ( "root" )
272+ or
273+ result = API:: moduleImport ( "logging" ) .getMember ( "getLogger" ) .getReturn ( )
274+ }
275+ }
240276}
241277
242278/**
@@ -2642,27 +2678,6 @@ private module StdlibPrivate {
26422678 // ---------------------------------------------------------------------------
26432679 // logging
26442680 // ---------------------------------------------------------------------------
2645- /**
2646- * Provides models for the `logging.Logger` class and subclasses.
2647- *
2648- * See https://docs.python.org/3.9/library/logging.html#logging.Logger.
2649- */
2650- module Logger {
2651- /** Gets a reference to the `logging.Logger` class or any subclass. */
2652- API:: Node subclassRef ( ) {
2653- result = API:: moduleImport ( "logging" ) .getMember ( "Logger" ) .getASubclass * ( )
2654- }
2655-
2656- /** Gets a reference to an instance of `logging.Logger` or any subclass. */
2657- API:: Node instance ( ) {
2658- result = subclassRef ( ) .getReturn ( )
2659- or
2660- result = API:: moduleImport ( "logging" ) .getMember ( "root" )
2661- or
2662- result = API:: moduleImport ( "logging" ) .getMember ( "getLogger" ) .getReturn ( )
2663- }
2664- }
2665-
26662681 /**
26672682 * A call to one of the logging methods from `logging` or on a `logging.Logger`
26682683 * subclass.
@@ -2683,14 +2698,12 @@ private module StdlibPrivate {
26832698 method = "log" and
26842699 msgIndex = 1
26852700 |
2686- this = Logger:: instance ( ) .getMember ( method ) .getACall ( )
2687- or
2688- this = API:: moduleImport ( "logging" ) .getMember ( method ) .getACall ( )
2701+ this = Stdlib:: Logger:: instance ( ) .getMember ( method ) .getACall ( )
26892702 )
26902703 }
26912704
26922705 override DataFlow:: Node getAnInput ( ) {
2693- result = this .getArgByName ( "msg" )
2706+ result = this .getArgByName ( [ "msg" , "extra" ] )
26942707 or
26952708 result = this .getArg ( any ( int i | i >= msgIndex ) )
26962709 }
0 commit comments