Spaces:
Running
Running
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( | |
[ # Random levels | |
logging.INFO, | |
logging.DEBUG, | |
logging.WARNING, | |
logging.ERROR, | |
logging.CRITICAL, | |
] | |
), | |
f"Value {i+1}", # Random values | |
) | |
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() | |