bpo-31080: Allowed logging.config.fileConfig() to accept both args and kwargs. (GH-2979)

diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index d692514..b3f4e28 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -143,9 +143,11 @@
             klass = eval(klass, vars(logging))
         except (AttributeError, NameError):
             klass = _resolve(klass)
-        args = section["args"]
+        args = section.get("args", '()')
         args = eval(args, vars(logging))
-        h = klass(*args)
+        kwargs = section.get("kwargs", '{}')
+        kwargs = eval(kwargs, vars(logging))
+        h = klass(*args, **kwargs)
         if "level" in section:
             level = section["level"]
             h.setLevel(level)
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 36ea072..a91cfd4 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -1273,7 +1273,7 @@
     datefmt=
     """
 
-    # config7 adds a compiler logger.
+    # config7 adds a compiler logger, and uses kwargs instead of args.
     config7 = """
     [loggers]
     keys=root,parser,compiler
@@ -1304,7 +1304,7 @@
     class=StreamHandler
     level=NOTSET
     formatter=form1
-    args=(sys.stdout,)
+    kwargs={'stream': sys.stdout,}
 
     [formatter_form1]
     format=%(levelname)s ++ %(message)s