Grzegorz Brzęczyszczykiewicz rašė:
yra CLI skriptynas. Panaudojimas ribotas, visi - homebrew ir kol kas
nemanau jog būtų dar kam nors reikalingi. Nors, kol neįdedi į Github'ą -
negali būti užtikrintas.
Absoliuti dauguma naudoja print(), bet kai kurie jų dar papildomai kažką
pasakoja per tą patį logging.{debug|info|warning|error|...}
Tai ir atsiranda noras matyti jų pasakojimus GUI interfeise, tame
pačiame kaip ir print() arba atskirame (jei kitaip nesigauna) lange.
Tai paprasčiau tada, print()'out'as stdout'e dažniausiai (iki kokio
redirect'o), na o logger'is savo ruožtu (stderr'e numatytai, arba
atskiramae faile, bet gali būti įvairiai).
Jei neketini naudoti unifikuoto logger'io savo kode (taisyti visas
vietas, kur kas nors išvedama, kad tai būtų daroma per tavo
objektą/funkciją), tai reikės pasirašyti savo print() wrapper'į, maždaug:
import mylogger
print = mylogger.print
Su logger'iu sudėtingiau, bet veikiausiai išsisuksi pridėjęs savo
handler'į root logger'iui:
log = logging.getLogger()
log.setLevel(logging.DEBUG)
Čia visa esmė: stdout'as/stderr'as netinka, jei vėliau jie gali būti
redirect'inami; tada reikės custom file-like stream objekto, pvz:
io.StringIO(), io.TextIOWrapper()
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -
%(message)s')
handler.setFormatter(formatter)
log.addHandler(handler)
Kaip ir viskas: jei kas nors print()'inama, tai tavo wrapper'is gauna
turinį ir išveda jį kur tau reikia, nepriklausomai nuo to, kur jis
paskui keliauja/redirect'inamas. Panašiai ir su logger'iu: kad ir kas
toliau kode vyktų su logger'ių konfigūracija, bet root logger'is turi
tavo handler'į, kuris rašo, kur tau reikia, nepriklausomai nuo kitų
handler'ių.