# `gradio_log`
A Log component for Gradio which can easily show some log file in the interface.
## Installation
```bash
pip install gradio_log
```
## Usage
```python
import logging
from pathlib import Path
import gradio as gr
from gradio_log import Log
class CustomFormatter(logging.Formatter):
green = "\x1b[32;20m"
blue = "\x1b[34;20m"
yellow = "\x1b[33;20m"
red = "\x1b[31;20m"
bold_red = "\x1b[31;1m"
reset = "\x1b[0m"
format = "%(asctime)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
FORMATS = {
logging.DEBUG: blue + format + reset,
logging.INFO: green + format + reset,
logging.WARNING: yellow + format + reset,
logging.ERROR: red + format + reset,
logging.CRITICAL: bold_red + format + reset,
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(log_fmt)
return formatter.format(record)
formatter = CustomFormatter()
log_file = "/tmp/gradio_log.txt"
Path(log_file).touch()
ch = logging.FileHandler(log_file)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger = logging.getLogger("gradio_log")
logger.setLevel(logging.DEBUG)
for handler in logger.handlers:
logger.removeHandler(handler)
logger.addHandler(ch)
logger.info("The logs will be displayed in here.")
def create_log_handler(level):
def l(text):
getattr(logger, level)(text)
return l
with gr.Blocks() as demo:
text = gr.Textbox(label="Enter text to write to log file")
with gr.Row():
for l in ["debug", "info", "warning", "error", "critical"]:
button = gr.Button(f"log as {l}")
button.click(fn=create_log_handler(l), inputs=text)
Log(log_file, dark=True)
if __name__ == "__main__":
demo.launch(ssr_mode=True)
```
## `Log`
### Initialization
name | type | default | description |
---|---|---|---|
log_file |
```python str ``` | None |
the log file path to read from. |
tail |
```python int ``` | 100 |
from the end of the file, the number of lines to start read from. |
dark |
```python bool ``` | False |
if True, will render the component in dark mode. |
height |
```python str | int | None ``` | 240 |
None |
xterm_allow_proposed_api |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_allow_transparency |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_alt_click_moves_cursor |
```python typing.Optional[bool][bool, None] ``` | True |
None |
xterm_convert_eol |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_cursor_blink |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_cursor_inactive_style |
```python "outline" | "block" | "bar" | "underline" | "none" ``` | "outline" |
None |
xterm_cursor_style |
```python "block" | "underline" | "bar" ``` | "block" |
None |
xterm_cursor_width |
```python typing.Optional[int][int, None] ``` | 1 |
None |
xterm_custom_glyphs |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_disable_stdin |
```python typing.Optional[bool][bool, None] ``` | True |
None |
xterm_document_override |
```python typing.Optional[typing.Any][typing.Any, None] ``` | None |
None |
xterm_draw_bold_text_in_bright_colors |
```python typing.Optional[bool][bool, None] ``` | True |
None |
xterm_fast_scroll_modifier |
```python typing.Optional[ typing.Literal["none", "alt", "ctrl", "shift"] ]["none" | "alt" | "ctrl" | "shift", None] ``` | "alt" |
None |
xterm_fast_scroll_sensitivity |
```python typing.Optional[int][int, None] ``` | 1 |
None |
xterm_font_family |
```python typing.Optional[str][str, None] ``` | "courier-new, courier, monospace" |
None |
xterm_font_size |
```python typing.Optional[int][int, None] ``` | 15 |
None |
xterm_font_weight |
```python typing.Optional[ typing.Literal[ "normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900", ] ][ "normal" | "bold" | "100" | "200" | "300" | "400" | "500" | "600" | "700" | "800" | "900", None, ] ``` | "normal" |
None |
xterm_font_weight_bold |
```python typing.Optional[ typing.Literal[ "normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900", ] ][ "normal" | "bold" | "100" | "200" | "300" | "400" | "500" | "600" | "700" | "800" | "900", None, ] ``` | "bold" |
None |
xterm_ignore_bracketed_paste_mode |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_letter_spacing |
```python typing.Optional[float][float, None] ``` | 0 |
None |
xterm_line_height |
```python typing.Optional[float][float, None] ``` | 1.0 |
None |
xterm_log_level |
```python typing.Optional[ typing.Literal[ "trace", "debug", "info", "warn", "error", "off" ] ][ "trace" | "debug" | "info" | "warn" | "error" | "off", None, ] ``` | "info" |
None |
xterm_mac_option_click_forces_selection |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_mac_option_is_meta |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_minimum_contrast_ratio |
```python typing.Optional[int][int, None] ``` | 1 |
None |
xterm_overview_ruler_width |
```python typing.Optional[int][int, None] ``` | 0 |
None |
xterm_rescale_overlapping_glyphs |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_screen_reader_mode |
```python typing.Optional[bool][bool, None] ``` | False |
None |
xterm_scroll_on_user_input |
```python typing.Optional[bool][bool, None] ``` | True |
None |
xterm_scroll_sensitivity |
```python typing.Optional[int][int, None] ``` | 1 |
None |
xterm_scrollback |
```python typing.Optional[int][int, None] ``` | 1000 |
None |
xterm_smooth_scroll_duration |
```python typing.Optional[int][int, None] ``` | 0 |
None |
xterm_tab_stop_width |
```python typing.Optional[int][int, None] ``` | 8 |
None |
xterm_windows_mode |
```python typing.Optional[bool][bool, None] ``` | False |
None |
label |
```python str | None ``` | None |
The label for this component. Appears above the component and is also used as the header if there are a table of examples for this component. If None and used in a `gr.Interface`, the label will be the name of the parameter this component is assigned to. |
info |
```python str | None ``` | None |
additional component description. |
every |
```python float ``` | 0.5 |
New log pulling interval. |
show_label |
```python bool | None ``` | None |
if True, will display label. |
container |
```python bool ``` | True |
If True, will place the component in a container - providing some extra padding around the border. |
scale |
```python int | None ``` | None |
relative size compared to adjacent Components. For example if Components A and B are in a Row, and A has scale=2, and B has scale=1, A will be twice as wide as B. Should be an integer. scale applies in Rows, and to top-level Components in Blocks where fill_height=True. |
min_width |
```python int ``` | 160 |
minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first. |
interactive |
```python bool | None ``` | None |
if True, will be rendered as an editable textbox; if False, editing will be disabled. If not provided, this is inferred based on whether the component is used as an input or output. |
visible |
```python bool ``` | True |
If False, component will be hidden. |
elem_id |
```python str | None ``` | None |
An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles. |
elem_classes |
```python list[str] | str | None ``` | None |
An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles. |
render |
```python bool ``` | True |
If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later. |