|
import logging |
|
import random |
|
import time |
|
|
|
import gradio as gr |
|
|
|
from gradio_logsview import LogsView |
|
|
|
|
|
def random_values(failing: bool = False): |
|
for i in range(10): |
|
logging.log( |
|
random.choice( |
|
[ |
|
logging.INFO, |
|
logging.DEBUG, |
|
logging.WARNING, |
|
logging.ERROR, |
|
logging.CRITICAL, |
|
] |
|
), |
|
f"Value {i+1}", |
|
) |
|
time.sleep(random.uniform(0, 1)) |
|
if failing and i == 5: |
|
raise ValueError("Failing!!") |
|
|
|
|
|
def fn_process_success(): |
|
yield from LogsView.run_process(["python", "-u", "demo/script.py"]) |
|
|
|
|
|
def fn_process_failing(): |
|
yield from LogsView.run_process(["python", "-u", "demo/script.py", "--failing"]) |
|
|
|
|
|
def fn_thread_success(): |
|
yield from LogsView.run_thread(random_values, log_level=logging.INFO, failing=False) |
|
|
|
|
|
def fn_thread_failing(): |
|
yield from LogsView.run_thread(random_values, log_level=logging.INFO, failing=True) |
|
|
|
|
|
markdown_top = """ |
|
# LogsView Demo |
|
|
|
This demo shows how to use the `LogsView` component to display logs from a process or a thread in real-time. |
|
|
|
Click on any button to launch a process or a thread and see the logs displayed in real-time. |
|
In the thread example, logs are generated randomly with different log levels. |
|
In the process example, logs are generated by a Python script but any command can be executed. |
|
""" |
|
|
|
|
|
markdown_bottom = """ |
|
## How to run in a thread? |
|
|
|
With `LogsView.run_thread`, you can run a function in a separate thread and capture logs in real-time. |
|
You can configure which logs to capture (log level and logger name). |
|
|
|
```py |
|
from gradio_logsview import LogsView |
|
|
|
def fn_thread(): |
|
# Run `my_function` in a separate thread |
|
# All logs above `INFO` level will be captured and displayed in real-time. |
|
yield from LogsView.run_thread(my_function, log_level=logging.INFO, arg1="value1") |
|
|
|
with gr.Blocks() as demo: |
|
logs = LogsView() |
|
btn = gr.Button("Run thread") |
|
btn.click(fn_thread, outputs=logs) |
|
``` |
|
|
|
## How to run in a process? |
|
|
|
With `LogsView.run_process`, you can run a command in a separate process and capture logs from the process in real-time. |
|
|
|
```py |
|
from gradio_logsview import LogsView |
|
|
|
def fn_process(): |
|
# Run a process and capture all logs from the process |
|
yield from LogsView.run_process( |
|
cmd=["mergekit-yaml", "config.yaml", "merge", "--copy-", "--cuda", "--low-cpu-memory"] |
|
) |
|
|
|
with gr.Blocks() as demo: |
|
logs = LogsView() |
|
btn = gr.Button("Run process") |
|
btn.click(fn_process, outputs=logs) |
|
``` |
|
""" |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown(markdown_top) |
|
|
|
with gr.Row(): |
|
btn_thread_success = gr.Button("Run thread (success)") |
|
btn_thread_failing = gr.Button("Run thread (failing)") |
|
with gr.Row(): |
|
btn_process_success = gr.Button("Run process (success)") |
|
btn_process_failing = gr.Button("Run process (failing)") |
|
logs = LogsView() |
|
|
|
gr.Markdown(markdown_bottom) |
|
|
|
btn_thread_failing.click(fn_thread_failing, outputs=logs) |
|
btn_thread_success.click(fn_thread_success, outputs=logs) |
|
btn_process_failing.click(fn_process_failing, outputs=logs) |
|
btn_process_success.click(fn_process_success, outputs=logs) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|