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
[1;2m[38;5;201m[48;5;0m0[0m [2m[38;5;5m23 [[38;5;4minfo ] [0mStarting [1m[38;5;124m[48;5;255mmain[0m [[38;5;5mmyapp[39m]
[1;2m[38;5;201m[48;5;183mโจ[0m [2m[38;5;5m23 [[38;5;4minfo ] [0mIn [1m[38;5;124m[48;5;255mmain[0m [[38;5;5mmyapp[39m] [1m[38;5;1mfoo=[2m[38;5;5mbar [38;5;1mjson=[0m{[94m"bar"[39m:[90m [39m{[94m"foo"[39m:[90m [94mtrue[39m}}
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
[1m[38;5;11mSimple Test App
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[0m[38;5;5mโ [39mSpawns a thread
[38;5;5mโ [39mLogs
[38;5;5mโ [39mUses Flags
[1m[34mmyapp.py
[0m[32mG [1m[33mgreeted [0m[31mWorld [38;5;245mWho is greeted
[36m-hf [match string][39m: List [1m[36mALL[0m (matching) flags. E.g. -hf or -hf log.
$ python /tmp/myapp.py -hf log_
[1m[38;5;11mSimple Test App
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[0m[38;5;5mโ [39mSpawns a thread
[38;5;5mโ [39mLogs
[38;5;5mโ [39mUses Flags
All supported command line flags [matching [1m[32mlog_[0m]:
[1m[34mabsl.logging
[0m[32m [1m[33mlog_dir [0m[31m''
[38;5;245mdirectory to write logfiles into
[1m[34mstructlogging.sl
[0m[32mlatn [1m[33mlog_add_thread_name [0m[31mFalse
[38;5;245mAdd name of thread
[32mldcnt [1m[33mlog_dev_coljson_no_truecolor [0m[31mFalse
[38;5;245mNOT use true color for styles (e.g. when no terminal support)
[32mldcs [1m[33mlog_dev_coljson_style [0m[31mdark
[38;5;245m 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>
[32mlddnm [1m[33mlog_dev_dimm_no_match [0m[31mFalse
[38;5;245mDimm not matching lines (in colored output only)
[32mldfc [1m[33mlog_dev_fmt_coljson [0m[31mjson,payload
[38;5;245mList of keys to log as json.
[32mldm [1m[33mlog_dev_match [0m[31m''
[38;5;245mRegex to search in loglines - will be highlighted.
[32mlf [1m[33mlog_fmt [0m[31mauto
[38;5;245mForce a log format. 0: off, 1: auto, 2: plain, 3: plain_no_colors, 4: json.
[38;5;241m๐ข 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.
[32mll [1m[33mlog_level [0m[31m20
[38;5;245mLog level (10: debug, 20: info, ...). You may also say log_level=error
[32mlsf [1m[33mlog_stack_filter [0m[31mfn not contains frozen and fn not contains /rx/
[38;5;245mWhen logging error tracebacks this is an optional filter. Keywords:fn: filename, frame: frame nr, line: line nr, name: name of callable
[38;5;241mExample: fn contains project and frame lt 1 (axiros/pycond expression)
[32mlsmf [1m[33mlog_stack_max_frames [0m[31m3
[38;5;245mMaximum Frames Shown in Terminal Stack Traces
[32mltln [1m[33mlog_thread_local_names [0m[31mFalse
[38;5;245mPrefer thread local logger_name, when set
[32mltf [1m[33mlog_time_fmt [0m[31m%m-%d %H:%M:%S
[38;5;245mLog time format. Shortcuts: "ISO", "dt"
[32mlts [1m[33mlog_to_stdout [0m[31mFalse
[38;5;245mDefault: stderr
[39m
$ python /tmp/myapp.py -hf greet
[1m[38;5;11mSimple Test App
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[0m[38;5;5mโ [39mSpawns a thread
[38;5;5mโ [39mLogs
[38;5;5mโ [39mUses Flags
All supported command line flags [matching [1m[32mgreet[0m]:
[1m[34mmymain
[0m[32mg [1m[33mgreeting [0m[31mHi
[38;5;245mGreeting
[1m[34mmyapp.py
[0m[32mG [1m[33mgreeted [0m[31mWorld
[38;5;245mWho is greeted
[39m
$ python /tmp/myapp.py -G=Joe -ll 10 -latn
[1;2m[38;5;201m[48;5;0m0[0m [2m[38;5;5m08-11 17:20:46 [[38;5;4minfo ] [0mStarting main [[38;5;5mmyapp[39m]
[1;2m[38;5;201m[48;5;0m0[0m [2m[38;5;5m08-11 17:20:46 [debug ] [0mHi Joe [[38;5;5mmyapp[39m] [1m[38;5;1mgreeted=[2m[38;5;5mJoe
[0m