Skip to content

Commit fa4c94c

Browse files
authored
Merge pull request #94 from deep-compute/bugfix-initlogger-only-stderr
references #93, fixed the issue
2 parents 9a6d109 + fad8298 commit fa4c94c

3 files changed

Lines changed: 27 additions & 71 deletions

File tree

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ deploy:
1919
- basescript/utils.py
2020
- examples/adder.py
2121
- examples/helloworld.py
22-
name: basescript-0.3.1
23-
tag_name: 0.3.1
22+
name: basescript-0.3.2
23+
tag_name: 0.3.2
2424
true:
2525
repo: deep-compute/basescript
2626
- provider: pypi

basescript/log.py

Lines changed: 24 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
269248
def _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:

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def get_long_description():
2525

2626
long_description = get_long_description()
2727

28-
version = "0.3.1"
28+
version = "0.3.2"
2929
setup(
3030
name="basescript",
3131
version=version,

0 commit comments

Comments
 (0)