@@ -189,6 +189,11 @@ def message_hello(message, say):
189
189
self ._verification_token : Optional [str ] = verification_token or os .environ .get (
190
190
"SLACK_VERIFICATION_TOKEN" , None
191
191
)
192
+ # If a logger is explicitly passed when initializing, the logger works as the base logger.
193
+ # The base logger's logging settings will be propagated to all the loggers created by bolt-python.
194
+ self ._base_logger = logger
195
+ # The framework logger is supposed to be used for the internal logging.
196
+ # Also, it's accessible via `app.logger` as the app's singleton logger.
192
197
self ._framework_logger = logger or get_bolt_logger (App )
193
198
self ._raise_error_for_unhandled_request = raise_error_for_unhandled_request
194
199
@@ -356,10 +361,15 @@ def _init_middleware_list(
356
361
return
357
362
if ssl_check_enabled is True :
358
363
self ._middleware_list .append (
359
- SslCheck (verification_token = self ._verification_token )
364
+ SslCheck (
365
+ verification_token = self ._verification_token ,
366
+ base_logger = self ._base_logger ,
367
+ )
360
368
)
361
369
if request_verification_enabled is True :
362
- self ._middleware_list .append (RequestVerification (self ._signing_secret ))
370
+ self ._middleware_list .append (
371
+ RequestVerification (self ._signing_secret , base_logger = self ._base_logger )
372
+ )
363
373
364
374
# As authorize is required for making a Bolt app function, we don't offer the flag to disable this
365
375
if self ._oauth_flow is None :
@@ -370,24 +380,33 @@ def _init_middleware_list(
370
380
# This API call is for eagerly validating the token
371
381
auth_test_result = self ._client .auth_test (token = self ._token )
372
382
self ._middleware_list .append (
373
- SingleTeamAuthorization (auth_test_result = auth_test_result )
383
+ SingleTeamAuthorization (
384
+ auth_test_result = auth_test_result ,
385
+ base_logger = self ._base_logger ,
386
+ )
374
387
)
375
388
except SlackApiError as err :
376
389
raise BoltError (error_auth_test_failure (err .response ))
377
390
elif self ._authorize is not None :
378
391
self ._middleware_list .append (
379
- MultiTeamsAuthorization (authorize = self ._authorize )
392
+ MultiTeamsAuthorization (
393
+ authorize = self ._authorize , base_logger = self ._base_logger
394
+ )
380
395
)
381
396
else :
382
397
raise BoltError (error_token_required ())
383
398
else :
384
399
self ._middleware_list .append (
385
- MultiTeamsAuthorization (authorize = self ._authorize )
400
+ MultiTeamsAuthorization (
401
+ authorize = self ._authorize , base_logger = self ._base_logger
402
+ )
386
403
)
387
404
if ignoring_self_events_enabled is True :
388
- self ._middleware_list .append (IgnoringSelfEvents ())
405
+ self ._middleware_list .append (
406
+ IgnoringSelfEvents (base_logger = self ._base_logger )
407
+ )
389
408
if url_verification_enabled is True :
390
- self ._middleware_list .append (UrlVerification ())
409
+ self ._middleware_list .append (UrlVerification (base_logger = self . _base_logger ))
391
410
self ._init_middleware_list_done = True
392
411
393
412
# -------------------------
@@ -616,7 +635,11 @@ def middleware_func(logger, body, next):
616
635
self ._middleware_list .append (middleware )
617
636
elif isinstance (middleware_or_callable , Callable ):
618
637
self ._middleware_list .append (
619
- CustomMiddleware (app_name = self .name , func = middleware_or_callable )
638
+ CustomMiddleware (
639
+ app_name = self .name ,
640
+ func = middleware_or_callable ,
641
+ base_logger = self ._base_logger ,
642
+ )
620
643
)
621
644
return middleware_or_callable
622
645
else :
@@ -677,9 +700,10 @@ def step(
677
700
edit = edit ,
678
701
save = save ,
679
702
execute = execute ,
703
+ base_logger = self ._base_logger ,
680
704
)
681
705
elif isinstance (step , WorkflowStepBuilder ):
682
- step = step .build ()
706
+ step = step .build (base_logger = self . _base_logger )
683
707
elif not isinstance (step , WorkflowStep ):
684
708
raise BoltError (f"Invalid step object ({ type (step )} )" )
685
709
@@ -759,7 +783,9 @@ def ask_for_introduction(event, say):
759
783
760
784
def __call__ (* args , ** kwargs ):
761
785
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
762
- primary_matcher = builtin_matchers .event (event )
786
+ primary_matcher = builtin_matchers .event (
787
+ event , base_logger = self ._base_logger
788
+ )
763
789
return self ._register_listener (
764
790
list (functions ), primary_matcher , matchers , middleware , True
765
791
)
@@ -814,7 +840,7 @@ def __call__(*args, **kwargs):
814
840
),
815
841
}
816
842
primary_matcher = builtin_matchers .message_event (
817
- keyword = keyword , constraints = constraints
843
+ keyword = keyword , constraints = constraints , base_logger = self . _base_logger
818
844
)
819
845
middleware .insert (0 , MessageListenerMatches (keyword ))
820
846
return self ._register_listener (
@@ -859,7 +885,9 @@ def repeat_text(ack, say, command):
859
885
860
886
def __call__ (* args , ** kwargs ):
861
887
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
862
- primary_matcher = builtin_matchers .command (command )
888
+ primary_matcher = builtin_matchers .command (
889
+ command , base_logger = self ._base_logger
890
+ )
863
891
return self ._register_listener (
864
892
list (functions ), primary_matcher , matchers , middleware
865
893
)
@@ -908,7 +936,9 @@ def open_modal(ack, body, client):
908
936
909
937
def __call__ (* args , ** kwargs ):
910
938
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
911
- primary_matcher = builtin_matchers .shortcut (constraints )
939
+ primary_matcher = builtin_matchers .shortcut (
940
+ constraints , base_logger = self ._base_logger
941
+ )
912
942
return self ._register_listener (
913
943
list (functions ), primary_matcher , matchers , middleware
914
944
)
@@ -925,7 +955,9 @@ def global_shortcut(
925
955
926
956
def __call__ (* args , ** kwargs ):
927
957
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
928
- primary_matcher = builtin_matchers .global_shortcut (callback_id )
958
+ primary_matcher = builtin_matchers .global_shortcut (
959
+ callback_id , base_logger = self ._base_logger
960
+ )
929
961
return self ._register_listener (
930
962
list (functions ), primary_matcher , matchers , middleware
931
963
)
@@ -942,7 +974,9 @@ def message_shortcut(
942
974
943
975
def __call__ (* args , ** kwargs ):
944
976
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
945
- primary_matcher = builtin_matchers .message_shortcut (callback_id )
977
+ primary_matcher = builtin_matchers .message_shortcut (
978
+ callback_id , base_logger = self ._base_logger
979
+ )
946
980
return self ._register_listener (
947
981
list (functions ), primary_matcher , matchers , middleware
948
982
)
@@ -984,7 +1018,9 @@ def update_message(ack):
984
1018
985
1019
def __call__ (* args , ** kwargs ):
986
1020
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
987
- primary_matcher = builtin_matchers .action (constraints )
1021
+ primary_matcher = builtin_matchers .action (
1022
+ constraints , base_logger = self ._base_logger
1023
+ )
988
1024
return self ._register_listener (
989
1025
list (functions ), primary_matcher , matchers , middleware
990
1026
)
@@ -1003,7 +1039,9 @@ def block_action(
1003
1039
1004
1040
def __call__ (* args , ** kwargs ):
1005
1041
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1006
- primary_matcher = builtin_matchers .block_action (constraints )
1042
+ primary_matcher = builtin_matchers .block_action (
1043
+ constraints , base_logger = self ._base_logger
1044
+ )
1007
1045
return self ._register_listener (
1008
1046
list (functions ), primary_matcher , matchers , middleware
1009
1047
)
@@ -1021,7 +1059,9 @@ def attachment_action(
1021
1059
1022
1060
def __call__ (* args , ** kwargs ):
1023
1061
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1024
- primary_matcher = builtin_matchers .attachment_action (callback_id )
1062
+ primary_matcher = builtin_matchers .attachment_action (
1063
+ callback_id , base_logger = self ._base_logger
1064
+ )
1025
1065
return self ._register_listener (
1026
1066
list (functions ), primary_matcher , matchers , middleware
1027
1067
)
@@ -1039,7 +1079,9 @@ def dialog_submission(
1039
1079
1040
1080
def __call__ (* args , ** kwargs ):
1041
1081
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1042
- primary_matcher = builtin_matchers .dialog_submission (callback_id )
1082
+ primary_matcher = builtin_matchers .dialog_submission (
1083
+ callback_id , base_logger = self ._base_logger
1084
+ )
1043
1085
return self ._register_listener (
1044
1086
list (functions ), primary_matcher , matchers , middleware
1045
1087
)
@@ -1057,7 +1099,9 @@ def dialog_cancellation(
1057
1099
1058
1100
def __call__ (* args , ** kwargs ):
1059
1101
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1060
- primary_matcher = builtin_matchers .dialog_cancellation (callback_id )
1102
+ primary_matcher = builtin_matchers .dialog_cancellation (
1103
+ callback_id , base_logger = self ._base_logger
1104
+ )
1061
1105
return self ._register_listener (
1062
1106
list (functions ), primary_matcher , matchers , middleware
1063
1107
)
@@ -1110,7 +1154,9 @@ def handle_submission(ack, body, client, view):
1110
1154
1111
1155
def __call__ (* args , ** kwargs ):
1112
1156
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1113
- primary_matcher = builtin_matchers .view (constraints )
1157
+ primary_matcher = builtin_matchers .view (
1158
+ constraints , base_logger = self ._base_logger
1159
+ )
1114
1160
return self ._register_listener (
1115
1161
list (functions ), primary_matcher , matchers , middleware
1116
1162
)
@@ -1128,7 +1174,9 @@ def view_submission(
1128
1174
1129
1175
def __call__ (* args , ** kwargs ):
1130
1176
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1131
- primary_matcher = builtin_matchers .view_submission (constraints )
1177
+ primary_matcher = builtin_matchers .view_submission (
1178
+ constraints , base_logger = self ._base_logger
1179
+ )
1132
1180
return self ._register_listener (
1133
1181
list (functions ), primary_matcher , matchers , middleware
1134
1182
)
@@ -1146,7 +1194,9 @@ def view_closed(
1146
1194
1147
1195
def __call__ (* args , ** kwargs ):
1148
1196
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1149
- primary_matcher = builtin_matchers .view_closed (constraints )
1197
+ primary_matcher = builtin_matchers .view_closed (
1198
+ constraints , base_logger = self ._base_logger
1199
+ )
1150
1200
return self ._register_listener (
1151
1201
list (functions ), primary_matcher , matchers , middleware
1152
1202
)
@@ -1199,7 +1249,9 @@ def show_menu_options(ack):
1199
1249
1200
1250
def __call__ (* args , ** kwargs ):
1201
1251
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1202
- primary_matcher = builtin_matchers .options (constraints )
1252
+ primary_matcher = builtin_matchers .options (
1253
+ constraints , base_logger = self ._base_logger
1254
+ )
1203
1255
return self ._register_listener (
1204
1256
list (functions ), primary_matcher , matchers , middleware
1205
1257
)
@@ -1216,7 +1268,9 @@ def block_suggestion(
1216
1268
1217
1269
def __call__ (* args , ** kwargs ):
1218
1270
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1219
- primary_matcher = builtin_matchers .block_suggestion (action_id )
1271
+ primary_matcher = builtin_matchers .block_suggestion (
1272
+ action_id , base_logger = self ._base_logger
1273
+ )
1220
1274
return self ._register_listener (
1221
1275
list (functions ), primary_matcher , matchers , middleware
1222
1276
)
@@ -1234,7 +1288,9 @@ def dialog_suggestion(
1234
1288
1235
1289
def __call__ (* args , ** kwargs ):
1236
1290
functions = self ._to_listener_functions (kwargs ) if kwargs else list (args )
1237
- primary_matcher = builtin_matchers .dialog_suggestion (callback_id )
1291
+ primary_matcher = builtin_matchers .dialog_suggestion (
1292
+ callback_id , base_logger = self ._base_logger
1293
+ )
1238
1294
return self ._register_listener (
1239
1295
list (functions ), primary_matcher , matchers , middleware
1240
1296
)
@@ -1265,7 +1321,9 @@ def enable_token_revocation_listeners(self) -> None:
1265
1321
# -------------------------
1266
1322
1267
1323
def _init_context (self , req : BoltRequest ):
1268
- req .context ["logger" ] = get_bolt_app_logger (self .name )
1324
+ req .context ["logger" ] = get_bolt_app_logger (
1325
+ app_name = self .name , base_logger = self ._base_logger
1326
+ )
1269
1327
req .context ["token" ] = self ._token
1270
1328
if self ._token is not None :
1271
1329
# This WebClient instance can be safely singleton
@@ -1311,15 +1369,22 @@ def _register_listener(
1311
1369
value_to_return = functions [0 ]
1312
1370
1313
1371
listener_matchers = [
1314
- CustomListenerMatcher (app_name = self .name , func = f ) for f in (matchers or [])
1372
+ CustomListenerMatcher (
1373
+ app_name = self .name , func = f , base_logger = self ._base_logger
1374
+ )
1375
+ for f in (matchers or [])
1315
1376
]
1316
1377
listener_matchers .insert (0 , primary_matcher )
1317
1378
listener_middleware = []
1318
1379
for m in middleware or []:
1319
1380
if isinstance (m , Middleware ):
1320
1381
listener_middleware .append (m )
1321
1382
elif isinstance (m , Callable ):
1322
- listener_middleware .append (CustomMiddleware (app_name = self .name , func = m ))
1383
+ listener_middleware .append (
1384
+ CustomMiddleware (
1385
+ app_name = self .name , func = m , base_logger = self ._base_logger
1386
+ )
1387
+ )
1323
1388
else :
1324
1389
raise ValueError (error_unexpected_listener_middleware (type (m )))
1325
1390
@@ -1331,6 +1396,7 @@ def _register_listener(
1331
1396
matchers = listener_matchers ,
1332
1397
middleware = listener_middleware ,
1333
1398
auto_acknowledgement = auto_acknowledgement ,
1399
+ base_logger = self ._base_logger ,
1334
1400
)
1335
1401
)
1336
1402
return value_to_return
0 commit comments