38
38
# Initialize category levels with default level
39
39
_category_levels : dict [str , int ] = dict .fromkeys (CATEGORIES , DEFAULT_LOG_LEVEL )
40
40
41
+ # telemetry is enabled only when explicitly added to the env list
42
+ _telemetry_enabled = False
43
+
41
44
42
45
def config_to_category_levels (category : str , level : str ):
43
46
"""
@@ -99,6 +102,8 @@ def parse_environment_config(env_config: str) -> dict[str, int]:
99
102
Returns:
100
103
Dict[str, int]: A dictionary mapping categories to their log levels.
101
104
"""
105
+ global _telemetry_enabled
106
+
102
107
category_levels = {}
103
108
delimiter = ","
104
109
for pair in env_config .split (delimiter ):
@@ -109,6 +114,15 @@ def parse_environment_config(env_config: str) -> dict[str, int]:
109
114
category , level = pair .split ("=" , 1 )
110
115
category = category .strip ().lower ()
111
116
level = level .strip ().upper () # Convert to uppercase for logging._nameToLevel
117
+
118
+ if category == "telemetry" :
119
+ # check if telemetry was passed in, if so we should disable the filter below
120
+ level_value = logging ._nameToLevel .get (level )
121
+ if level_value is not None :
122
+ _telemetry_enabled = True
123
+ logging .info (f"Telemetry logging enabled at level '{ level } '." )
124
+ else :
125
+ logging .warning (f"Unknown telemetry log level '{ level } '. Telemetry logging will remain disabled." )
112
126
category_levels .update (config_to_category_levels (category = category , level = level ))
113
127
114
128
except ValueError :
@@ -171,6 +185,23 @@ def filter(self, record):
171
185
record .category = "uncategorized" # Default to 'uncategorized' if no category found
172
186
return True
173
187
188
+ class TelemetryBlockFilter (logging .Filter ):
189
+ """Block all telemetry logs when telemetry is not enabled."""
190
+
191
+ def __init__ (self , telemetry_enabled = False ):
192
+ super ().__init__ ()
193
+ self .telemetry_enabled = telemetry_enabled
194
+
195
+ def filter (self , record ):
196
+ # If telemetry is not enabled, block all telemetry logs
197
+ if not self .telemetry_enabled :
198
+ # Check if this is a telemetry log by logger name or category
199
+ if (hasattr (record , "name" ) and record .name .startswith ("telemetry" )) or (
200
+ hasattr (record , "category" ) and record .category == "telemetry"
201
+ ):
202
+ return False # Block this log
203
+ return True # Allow all other logs
204
+
174
205
# Determine the root logger's level (default to WARNING if not specified)
175
206
root_level = category_levels .get ("root" , logging .WARNING )
176
207
@@ -182,7 +213,7 @@ def filter(self, record):
182
213
"show_time" : False ,
183
214
"show_path" : False ,
184
215
"markup" : True ,
185
- "filters" : ["category_filter" ],
216
+ "filters" : ["category_filter" , "telemetry_block_filter" ],
186
217
}
187
218
}
188
219
@@ -193,6 +224,16 @@ def filter(self, record):
193
224
"filename" : log_file ,
194
225
"mode" : "a" ,
195
226
"encoding" : "utf-8" ,
227
+ "filters" : ["category_filter" , "telemetry_block_filter" ],
228
+ }
229
+
230
+ # Build loggers configuration step by step
231
+ loggers_config = {}
232
+ for category in CATEGORIES :
233
+ loggers_config [category ] = {
234
+ "handlers" : list (handlers .keys ()), # Apply all handlers
235
+ "level" : category_levels .get (category , DEFAULT_LOG_LEVEL ),
236
+ "propagate" : False , # Disable propagation to root logger
196
237
}
197
238
198
239
logging_config = {
@@ -208,21 +249,19 @@ def filter(self, record):
208
249
"filters" : {
209
250
"category_filter" : {
210
251
"()" : CategoryFilter ,
211
- }
212
- },
213
- "loggers" : {
214
- category : {
215
- "handlers" : list (handlers .keys ()), # Apply all handlers
216
- "level" : category_levels .get (category , DEFAULT_LOG_LEVEL ),
217
- "propagate" : False , # Disable propagation to root logger
218
- }
219
- for category in CATEGORIES
252
+ },
253
+ "telemetry_block_filter" : {
254
+ "()" : TelemetryBlockFilter ,
255
+ "telemetry_enabled" : _telemetry_enabled ,
256
+ },
220
257
},
258
+ "loggers" : loggers_config ,
221
259
"root" : {
222
260
"handlers" : list (handlers .keys ()),
223
261
"level" : root_level , # Set root logger's level dynamically
224
262
},
225
263
}
264
+
226
265
dictConfig (logging_config )
227
266
228
267
# Ensure third-party libraries follow the root log level
@@ -237,6 +276,7 @@ def get_logger(
237
276
"""
238
277
Returns a logger with the specified name and category.
239
278
If no category is provided, defaults to 'uncategorized'.
279
+ Note: telemetry category is only available when explicitly enabled via LLAMA_STACK_LOGGING=telemetry=LEVEL
240
280
241
281
Parameters:
242
282
name (str): The name of the logger (e.g., module or filename).
0 commit comments