Skip to content

Quickstartยค

Advanced Logging Featuresยค

We added a few processors and console rendering features to the awesome structlog.

Example usage:

$ cat /tmp/myapp.py
from threading import Thread
from devapp.app import init_app

# log time deltas in millis, highlight 'main' strings, add unique symbol for threads
app = init_app(log_time_fmt='dt', log_dev_match='main', log_add_thread_name=True)

# by default kw 'json' and 'payload' will be colorized using pygments' json lexer:
main = lambda: app.info('In main', foo='bar', json={'bar': {'foo': True}})

if __name__ == '__main__':
    app.info('Starting main')
    t = Thread(target=main, daemon=True).start()

$ python /tmp/myapp.py
0 23 [info     ] Starting main                  [myapp]
โ”จ 23 [info     ] In main                        [myapp] foo=bar json={"bar": {"foo": true}}

Flagsยค

Via nested classes, devapps allows to define absl flags:

$ cat /tmp/mymain.py
from devapp.app import app, FLG
from devapp.tools import define_flags

class Flags:
  autoshort = '' # prefix for short flag keys, built with collision avoidance 
  class greeting:
    d = 'Hi'
  # more.., incl. action flags and complex types

define_flags(Flags)

main = lambda: app.debug(f'{FLG.greeting} {FLG.greeted}', greeted=FLG.greeted)
$ cat /tmp/myapp.py
#!/usr/bin/env python
"""
# Simple Test App
- Spawns a thread
- Logs
- Uses Flags
"""
from devapp.app import init_app
import sys
sys.path.append('.')
from mymain import main # flags found anywhere imported

class AppFlags:
  autoshort = ''
  class greeted:
    '''Who is greeted'''
    s = 'G' # explicit short. See help output below
    d = 'World'


if __name__ == '__main__':
    init_app(flags=AppFlags).info('Starting main')
    main()

$ python /tmp/myapp.py -h

Simple Test App
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ– Spawns a thread
โ– Logs
โ– Uses Flags


myapp.py
G     greeted         World       Who is greeted

-hf [match string]: List ALL (matching) flags. E.g. -hf or -hf log.
$ python /tmp/myapp.py -hf log_

Simple Test App
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ– Spawns a thread
โ– Logs
โ– Uses Flags


All supported command line flags [matching log_]:
absl.logging
        log_dir                  ''
directory to write logfiles into 
structlogging.sl
latn    log_add_thread_name      False
Add name of thread 
ldcnt   log_dev_coljson_no_truecolor False
NOT use true color for styles (e.g. when no terminal support) 
ldcs    log_dev_coljson_style    dark
 Pygments style for colorized json. To use the 16 base colors and leave it to the terminal palette how to render: Choose light or dark <abap|algol|algol_nu|arduino|autumn|ax|borland|bw|coffee|colorful|dark|default|dracula|emacs|friendly|friendly_grayscale|fruity|github-dark|gruvbox-dark|gruvbox-light|igor|inkpot|light|lightbulb|lilypond|lovelace|manni|material|monokai|murphy|native|nord|nord-darker|one-dark|paraiso-dark|paraiso-light|pastie|perldoc|rainbow_dash|rrt|sas|solarized-dark|solarized-light|staroffice|stata-dark|stata-light|tango|trac|vim|vs|xcode|zenburn>
lddnm   log_dev_dimm_no_match    False
Dimm not matching lines (in colored output only) 
ldfc    log_dev_fmt_coljson      json,payload
List of keys to log as json. 
ldm     log_dev_match            ''
Regex to search in loglines - will be highlighted. 
lf      log_fmt                  auto
Force a log format. 0: off, 1: auto, 2: plain, 3: plain_no_colors, 4: json.   
๐ŸŸข Json logging has far better performance then the colored console dev log.
You can pipe e.g. journalctl output into "ops log_view -fn -" to get dev logging from json.

This value can be set away from auto via export log_fmt as well.
ll      log_level                20
Log level (10: debug, 20: info, ...). You may also say log_level=error 
lsf     log_stack_filter         fn not contains frozen and fn not contains /rx/
When logging error tracebacks this is an optional filter. Keywords:fn: filename, frame: frame nr, line: line nr, name: name of callable  
Example: fn contains project and frame lt 1 (axiros/pycond expression)
lsmf    log_stack_max_frames     3
Maximum Frames Shown in Terminal Stack Traces 
ltln    log_thread_local_names   False
Prefer thread local logger_name, when set 
ltf     log_time_fmt             %m-%d %H:%M:%S
Log time format. Shortcuts: "ISO", "dt" 
lts     log_to_stdout            False
Default: stderr



$ python /tmp/myapp.py -hf greet

Simple Test App
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ– Spawns a thread
โ– Logs
โ– Uses Flags


All supported command line flags [matching greet]:
mymain
g       greeting                 Hi
Greeting 
myapp.py
G       greeted                  World
Who is greeted



$ python /tmp/myapp.py -G=Joe -ll 10 -latn
0 08-11 17:20:46 [info     ] Starting main                  [myapp]
0 08-11 17:20:46 [debug    ] Hi Joe                         [myapp] greeted=Joe