log_documentation.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from nicegui import ui
  2. from . import doc
  3. @doc.demo(ui.log)
  4. def main_demo() -> None:
  5. from datetime import datetime
  6. log = ui.log(max_lines=10).classes('w-full h-20')
  7. ui.button('Log time', on_click=lambda: log.push(datetime.now().strftime('%X.%f')[:-5]))
  8. @doc.demo('Attach to a logger', '''
  9. You can attach a `ui.log` element to a Python logger object so that log messages are pushed to the log element.
  10. When used inside a page function, it is important to remove the handler when the client disconnects.
  11. Otherwise, the handler will keep a reference to the log element and the latter will not be garbage collected.
  12. ''')
  13. def logger_handler():
  14. import logging
  15. from datetime import datetime
  16. logger = logging.getLogger()
  17. class LogElementHandler(logging.Handler):
  18. """A logging handler that emits messages to a log element."""
  19. def __init__(self, element: ui.log, level: int = logging.NOTSET) -> None:
  20. self.element = element
  21. super().__init__(level)
  22. def emit(self, record: logging.LogRecord) -> None:
  23. try:
  24. msg = self.format(record)
  25. self.element.push(msg)
  26. except Exception:
  27. self.handleError(record)
  28. # @ui.page('/')
  29. def page():
  30. log = ui.log(max_lines=10).classes('w-full')
  31. handler = LogElementHandler(log)
  32. logger.addHandler(handler)
  33. ui.context.client.on_disconnect(lambda: logger.removeHandler(handler))
  34. ui.button('Log time', on_click=lambda: logger.warning(datetime.now().strftime('%X.%f')[:-5]))
  35. page() # HIDE
  36. @doc.demo('Styling lines', '''
  37. On the basis that individual lines in `ui.log` are `ui.label` instances,
  38. it is possible to style the inserted lines via `classes`, `style` and `props`.
  39. One notable use would be colored logs.
  40. Note that if applied, this would clear any existing
  41. [classes](element#default_classes),
  42. [style](element#default_style), and
  43. [props](element#default_props)
  44. currently set as default on `ui.label`.
  45. *Added in version 2.18.0*
  46. ''')
  47. def styling_lines_demo():
  48. log = ui.log(max_lines=10).classes('w-full h-40')
  49. with ui.row():
  50. ui.button('Normal', on_click=lambda: log.push('Text'))
  51. ui.button('Debug', on_click=lambda: log.push('Debug', classes='text-grey'))
  52. ui.button('Info', on_click=lambda: log.push('Info', classes='text-blue'))
  53. ui.button('Warning', on_click=lambda: log.push('Warning', classes='text-orange'))
  54. ui.button('Error', on_click=lambda: log.push('Error', classes='text-red'))
  55. doc.reference(ui.log)