@@ -29,7 +29,6 @@ def __init__(self, *streams):
2929 self .streams = streams
3030
3131 def write (self , data ):
32- print (data )
3332 for s in self .streams :
3433 s .write (data )
3534
@@ -246,26 +245,6 @@ def setLevel(self, level):
246245 self ._logger .setLevel (level )
247246
248247
249- def define_log_renderer (fmt , fpath , quiet ):
250- """
251- the final log processor that structlog requires to render.
252- """
253- # it must accept a logger, method_name and event_dict (just like processors)
254- # but must return the rendered string, not a dictionary.
255- # TODO tty logic
256-
257- if fmt :
258- return structlog .processors .JSONRenderer ()
259-
260- if fpath is not None :
261- return structlog .processors .JSONRenderer ()
262-
263- if sys .stderr .isatty () and not quiet :
264- return structlog .dev .ConsoleRenderer ()
265-
266- return structlog .processors .JSONRenderer ()
267-
268-
269248def _structlog_default_keys_processor (logger_class , log_method , event ):
270249 """ Add unique id, type and hostname """
271250 global HOSTNAME
@@ -379,68 +358,45 @@ def define_log_processors():
379358 ]
380359
381360
382- def _configure_logger (
383- fmt , quiet , level , fpath , pre_hooks , post_hooks , metric_grouping_interval
384- ):
361+ def _configure_logger (fmt , quiet , level , fpath , processors , metric_grouping_interval ):
385362 """
386363 configures a logger when required write to stderr or a file
387364 """
388365
389366 # NOTE not thread safe. Multiple BaseScripts cannot be instantiated concurrently.
390- level = getattr (logging , level .upper ())
391367
392368 global _GLOBAL_LOG_CONFIGURED
393369 if _GLOBAL_LOG_CONFIGURED :
394370 return
395371
396- # since the hooks need to run through structlog, need to wrap them like processors
397- def wrap_hook (fn ):
398- @wraps (fn )
399- def processor (logger , method_name , event_dict ):
400- fn (event_dict )
401- return event_dict
402-
403- return processor
372+ assert fmt in ["json" , "pretty" ]
404373
405- processors = define_log_processors ()
406- processors . extend ([ wrap_hook ( h ) for h in pre_hooks ])
374+ _processors = define_log_processors ()
375+ _processors += processors or []
407376 if metric_grouping_interval :
408- processors .append (metrics_grouping_processor )
377+ _processors .append (metrics_grouping_processor )
409378
410- log_renderer = define_log_renderer (fmt , fpath , quiet )
411- stderr_required = not quiet
412- pretty_to_stderr = stderr_required and (
413- fmt == "pretty" or (fmt is None and sys .stderr .isatty ())
414- )
415-
416- should_inject_pretty_renderer = pretty_to_stderr and not isinstance (
417- log_renderer , structlog .dev .ConsoleRenderer
418- )
419- if should_inject_pretty_renderer :
420- stderr_required = False
421- processors .append (StderrConsoleRenderer ())
379+ streams = []
422380
423- processors . append ( log_renderer )
424- processors . extend ([ wrap_hook ( h ) for h in post_hooks ] )
381+ if fpath :
382+ streams . append ( open ( fpath , "a" ) )
425383
426- streams = []
427- # we need to use a stream if we are writing to both file and stderr, and both are json
428- if stderr_required :
384+ if fmt == "json" and not quiet :
429385 streams .append (sys .stderr )
430386
431- if fpath is not None :
432- # TODO handle creating a directory for this log file ?
433- # TODO set mode and encoding appropriately
434- streams .append (open (fpath , "a" ))
387+ if fmt == "pretty" and not quiet :
388+ _processors .append (StderrConsoleRenderer ())
435389
436- assert len (streams ) != 0 , "cannot configure logger for 0 streams"
390+ _processors .append (structlog .processors .JSONRenderer ())
391+
392+ # a global level struct log config unless otherwise specified.
393+ level = getattr (logging , level .upper ())
437394
438395 stream = streams [0 ] if len (streams ) == 1 else Stream (* streams )
439396 atexit .register (stream .close )
440397
441- # a global level struct log config unless otherwise specified.
442398 structlog .configure (
443- processors = processors ,
399+ processors = _processors ,
444400 context_class = dict ,
445401 logger_factory = LevelLoggerFactory (stream , level = level ),
446402 wrapper_class = BoundLevelLogger ,
@@ -460,10 +416,12 @@ def init_logger(
460416 quiet = False ,
461417 level = "INFO" ,
462418 fpath = None ,
463- pre_hooks = [],
464- post_hooks = [],
419+ processors = None ,
465420 metric_grouping_interval = None ,
466421):
422+ """
423+ fmt=pretty/json controls only stderr; file always gets json.
424+ """
467425
468426 global LOG
469427 if LOG is not None :
@@ -473,14 +431,12 @@ def init_logger(
473431 # no need for a log - return a dummy
474432 return Dummy ()
475433
476- _configure_logger (
477- fmt , quiet , level , fpath , pre_hooks , post_hooks , metric_grouping_interval
478- )
434+ if not fmt and not quiet :
435+ fmt = "pretty" if sys .stderr .isatty () else "json"
479436
480- log = structlog .get_logger ()
481- level = getattr (logging , level .upper ())
482- log .setLevel (level )
437+ _configure_logger (fmt , quiet , level , fpath , processors , metric_grouping_interval )
483438
439+ log = structlog .get_logger ()
484440 log ._force_flush_q = queue .Queue (maxsize = FORCE_FLUSH_Q_SIZE )
485441
486442 if metric_grouping_interval :
0 commit comments