mirror of
https://github.com/sd-webui/stable-diffusion-webui.git
synced 2024-12-14 06:35:14 +03:00
5853f3e1a1
# Adds the bridge code which when enabled turns the webui into a headless [Stable Horde](https://stablehorde.net) instance It adds a few new command-line args to be able to pass variables to the bridge, as well as the possibility to set it via a variables files `bridgeData.py`. To start the bridge, one needs to add the `--bridge` argument to their relauncher.py as well as any horde vars they want to specify. On top of that this adds the loguru module as well as my tuned loguru config. This provides a much nicer logging output and provides the capability to save output to files for issue reports etc. For now only the bridge is utilizing the nice format, but once it's merged, you can start replacing `print()` with `logger.xxx()` where appropriate To make the bridge work, I've had to add defaults to txt2img but this should not affect anything. # Checklist: - [ x ] I have changed the base branch to `dev` - [ x ] I have performed a self-review of my own code - [ x ] I have commented my code in hard-to-understand areas - [ x ] I have made corresponding changes to the documentation Co-authored-by: hlky <106811348+hlky@users.noreply.github.com> Co-authored-by: Thomas Mello <work.mello@gmail.com> Co-authored-by: Joshua Kimsey <jkimsey95@gmail.com> Co-authored-by: ZeroCool <ZeroCool940711@users.noreply.github.com>
100 lines
4.0 KiB
Python
100 lines
4.0 KiB
Python
import sys
|
|
from functools import partialmethod
|
|
from loguru import logger
|
|
|
|
STDOUT_LEVELS = ["GENERATION", "PROMPT"]
|
|
INIT_LEVELS = ["INIT", "INIT_OK", "INIT_WARN", "INIT_ERR"]
|
|
MESSAGE_LEVELS = ["MESSAGE"]
|
|
# By default we're at error level or higher
|
|
verbosity = 20
|
|
quiet = 0
|
|
|
|
def set_logger_verbosity(count):
|
|
global verbosity
|
|
# The count comes reversed. So count = 0 means minimum verbosity
|
|
# While count 5 means maximum verbosity
|
|
# So the more count we have, the lowe we drop the versbosity maximum
|
|
verbosity = 20 - (count * 10)
|
|
|
|
def quiesce_logger(count):
|
|
global quiet
|
|
# The bigger the count, the more silent we want our logger
|
|
quiet = count * 10
|
|
|
|
def is_stdout_log(record):
|
|
if record["level"].name not in STDOUT_LEVELS:
|
|
return(False)
|
|
if record["level"].no < verbosity + quiet:
|
|
return(False)
|
|
return(True)
|
|
|
|
def is_init_log(record):
|
|
if record["level"].name not in INIT_LEVELS:
|
|
return(False)
|
|
if record["level"].no < verbosity + quiet:
|
|
return(False)
|
|
return(True)
|
|
|
|
def is_msg_log(record):
|
|
if record["level"].name not in MESSAGE_LEVELS:
|
|
return(False)
|
|
if record["level"].no < verbosity + quiet:
|
|
return(False)
|
|
return(True)
|
|
|
|
def is_stderr_log(record):
|
|
if record["level"].name in STDOUT_LEVELS + INIT_LEVELS + MESSAGE_LEVELS:
|
|
return(False)
|
|
if record["level"].no < verbosity + quiet:
|
|
return(False)
|
|
return(True)
|
|
|
|
def test_logger():
|
|
logger.generation("This is a generation message\nIt is typically multiline\nThee Lines".encode("unicode_escape").decode("utf-8"))
|
|
logger.prompt("This is a prompt message")
|
|
logger.debug("Debug Message")
|
|
logger.info("Info Message")
|
|
logger.warning("Info Warning")
|
|
logger.error("Error Message")
|
|
logger.critical("Critical Message")
|
|
logger.init("This is an init message", status="Starting")
|
|
logger.init_ok("This is an init message", status="OK")
|
|
logger.init_warn("This is an init message", status="Warning")
|
|
logger.init_err("This is an init message", status="Error")
|
|
logger.message("This is user message")
|
|
sys.exit()
|
|
|
|
|
|
logfmt = "<level>{level: <10}</level> @ <green>{time:YYYY-MM-DD HH:mm:ss}</green> | <green>{name}</green>:<green>{function}</green>:<green>{line}</green> - <level>{message}</level>"
|
|
genfmt = "<level>{level: <10}</level> @ <green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{message}</level>"
|
|
initfmt = "<magenta>INIT </magenta> | <level>{extra[status]: <10}</level> | <magenta>{message}</magenta>"
|
|
msgfmt = "<level>{level: <10}</level> | <level>{message}</level>"
|
|
|
|
logger.level("GENERATION", no=24, color="<cyan>")
|
|
logger.level("PROMPT", no=23, color="<yellow>")
|
|
logger.level("INIT", no=31, color="<white>")
|
|
logger.level("INIT_OK", no=31, color="<green>")
|
|
logger.level("INIT_WARN", no=31, color="<yellow>")
|
|
logger.level("INIT_ERR", no=31, color="<red>")
|
|
# Messages contain important information without which this application might not be able to be used
|
|
# As such, they have the highest priority
|
|
logger.level("MESSAGE", no=61, color="<green>")
|
|
|
|
logger.__class__.generation = partialmethod(logger.__class__.log, "GENERATION")
|
|
logger.__class__.prompt = partialmethod(logger.__class__.log, "PROMPT")
|
|
logger.__class__.init = partialmethod(logger.__class__.log, "INIT")
|
|
logger.__class__.init_ok = partialmethod(logger.__class__.log, "INIT_OK")
|
|
logger.__class__.init_warn = partialmethod(logger.__class__.log, "INIT_WARN")
|
|
logger.__class__.init_err = partialmethod(logger.__class__.log, "INIT_ERR")
|
|
logger.__class__.message = partialmethod(logger.__class__.log, "MESSAGE")
|
|
|
|
config = {
|
|
"handlers": [
|
|
{"sink": sys.stderr, "format": logfmt, "colorize":True, "filter": is_stderr_log},
|
|
{"sink": sys.stdout, "format": genfmt, "level": "PROMPT", "colorize":True, "filter": is_stdout_log},
|
|
{"sink": sys.stdout, "format": initfmt, "level": "INIT", "colorize":True, "filter": is_init_log},
|
|
{"sink": sys.stdout, "format": msgfmt, "level": "MESSAGE", "colorize":True, "filter": is_msg_log}
|
|
],
|
|
}
|
|
logger.configure(**config)
|