Skip to content

Commit

Permalink
update logging and temp file handling
Browse files Browse the repository at this point in the history
  • Loading branch information
vladmandic committed May 25, 2023
1 parent 9e66d88 commit 9e22d91
Show file tree
Hide file tree
Showing 10 changed files with 56 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ body:
- type: markdown
attributes:
value: |
If issue is setup, installation or startup related, please check `setup.log` before reporting
If issue is setup, installation or startup related, please check `webui.log` before reporting
And when posting console logs, please use code blocks ( \`\`\` ) to format them insead of uploading screenshots
- type: markdown
attributes:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/extension_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ body:
- type: markdown
attributes:
value: |
If issue is extension installation or startup related, please check `setup.log` before reporting
If issue is extension installation or startup related, please check `webui.log` before reporting
And when posting console logs, please use code blocks ( \`\`\` ) to format them insead of uploading screenshots
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# defaults
__pycache__
setup.log
/cache.json
/config.json
/params.txt
Expand All @@ -17,6 +16,7 @@ package-lock.json
venv

# all models and temp files
*.log
*.bak
*.ckpt
*.safetensors
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Individual features are not listed here, instead check [Changelog](CHANGELOG.md)

*Note*: **nVidia/CUDA** and **AMD/ROCm** are auto-detected is present and available, but for any other use case specify required parameter explicitly or wrong packages may be installed as installer will assume CPU-only environment

Full startup sequence is logged in `setup.log`, so if you encounter any issues, please check it first
Full startup sequence is logged in `webui.log`, so if you encounter any issues, please check it first

Below is partial list of all available parameters, run `webui --help` for the full list:

Expand Down
19 changes: 13 additions & 6 deletions cli/train.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,19 @@

# globals
args = None
log = logging.getLogger(__name__)
log = logging.getLogger('train')
valid_steps = ['original', 'face', 'body', 'blur', 'range', 'upscale', 'restore', 'interrogate', 'resize', 'square', 'segment']
log_file = os.path.join(os.path.dirname(__file__), 'train.log')

# methods

def setup_logging(clean=False):
try:
if clean and os.path.isfile('setup.log'):
os.remove('setup.log')
if clean and os.path.isfile(log_file):
os.remove(log_file)
time.sleep(0.1) # prevent race condition
except:
pass
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(pathname)s | %(message)s', filename='setup.log', filemode='a', encoding='utf-8', force=True)
from rich.theme import Theme
from rich.logging import RichHandler
from rich.console import Console
Expand All @@ -56,10 +56,17 @@ def setup_logging(clean=False):
"traceback.border.syntax_error": "black",
"inspect.value.border": "black",
}))
# logging.getLogger("urllib3").setLevel(logging.ERROR)
# logging.getLogger("httpx").setLevel(logging.ERROR)
level = logging.DEBUG if args.debug else logging.INFO
logging.basicConfig(level=logging.ERROR, format='%(asctime)s | %(name)s | %(levelname)s | %(module)s | %(message)s', filename=log_file, filemode='a', encoding='utf-8', force=True)
log.setLevel(logging.DEBUG) # log to file is always at level debug for facility `sd`
pretty_install(console=console)
traceback_install(console=console, extra_lines=1, width=console.width, word_wrap=False, indent_guides=False, suppress=[])
rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=logging.DEBUG if args.debug else logging.INFO, console=console)
rh.set_name(logging.DEBUG if args.debug else logging.INFO)
rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=level, console=console)
rh.set_name(level)
while log.hasHandlers() and len(log.handlers) > 0:
log.removeHandler(log.handlers[0])
log.addHandler(rh)


Expand Down
30 changes: 17 additions & 13 deletions installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Dot(dict): # dot notation access to dictionary attributes


log = logging.getLogger("sd")
log_file = os.path.join(os.path.dirname(__file__), 'webui.log')
quick_allowed = True
errors = 0
opts = {}
Expand Down Expand Up @@ -48,12 +49,11 @@ class Dot(dict): # dot notation access to dictionary attributes
# setup console and file logging
def setup_logging(clean=False):
try:
if clean and os.path.isfile('setup.log'):
os.remove('setup.log')
if clean and os.path.isfile(log_file):
os.remove(log_file)
time.sleep(0.1) # prevent race condition
except:
pass
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(pathname)s | %(message)s', filename='setup.log', filemode='a', encoding='utf-8', force=True)
from rich.theme import Theme
from rich.logging import RichHandler
from rich.console import Console
Expand All @@ -64,10 +64,15 @@ def setup_logging(clean=False):
"traceback.border.syntax_error": "black",
"inspect.value.border": "black",
}))
# logging.getLogger("urllib3").setLevel(logging.ERROR)
# logging.getLogger("httpx").setLevel(logging.ERROR)
level = logging.DEBUG if args.debug else logging.INFO
logging.basicConfig(level=logging.ERROR, format='%(asctime)s | %(name)s | %(levelname)s | %(module)s | %(message)s', filename=log_file, filemode='a', encoding='utf-8', force=True)
log.setLevel(logging.DEBUG) # log to file is always at level debug for facility `sd`
pretty_install(console=console)
traceback_install(console=console, extra_lines=1, width=console.width, word_wrap=False, indent_guides=False, suppress=[])
rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=logging.DEBUG if args.debug else logging.INFO, console=console)
rh.set_name(logging.DEBUG if args.debug else logging.INFO)
rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=level, console=console)
rh.set_name(level)
while log.hasHandlers() and len(log.handlers) > 0:
log.removeHandler(log.handlers[0])
log.addHandler(rh)
Expand Down Expand Up @@ -152,7 +157,7 @@ def git(arg: str, folder: str = None, ignore: bool = False):
errors += 1
log.error(f'Error running git: {folder} / {arg}')
if 'or stash them' in txt:
log.error('Local changes detected: check setup.log for details')
log.error(f'Local changes detected: check log for details: {log_file}')
log.debug(f'Git output: {txt}')
return txt

Expand Down Expand Up @@ -528,7 +533,6 @@ def check_version(offline=False, reset=True): # pylint: disable=unused-argument
import requests
except ImportError:
return
logging.getLogger("urllib3").setLevel(logging.ERROR)
commits = None
try:
commits = requests.get('https://api.github.com/repos/vladmandic/automatic/branches/master', timeout=10).json()
Expand Down Expand Up @@ -569,13 +573,13 @@ def update_wiki():

# check if we can run setup in quick mode
def check_timestamp():
if not quick_allowed or not os.path.isfile('setup.log'):
if not quick_allowed or not os.path.isfile(log_file):
return False
if args.skip_git:
return True
ok = True
setup_time = -1
with open('setup.log', 'r', encoding='utf8') as f:
with open(log_file, 'r', encoding='utf8') as f:
lines = f.readlines()
for line in lines:
if 'Setup complete without errors' in line:
Expand Down Expand Up @@ -633,8 +637,8 @@ def parse_args():
def extensions_preload(force = False):
setup_time = 0
if not force:
if os.path.isfile('setup.log'):
with open('setup.log', 'r', encoding='utf8') as f:
if os.path.isfile(log_file):
with open(log_file, 'r', encoding='utf8') as f:
lines = f.readlines()
for line in lines:
if 'Setup complete without errors' in line:
Expand Down Expand Up @@ -672,7 +676,7 @@ def read_options():

# entry method when used as module
def run_setup():
setup_logging(args.upgrade)
# setup_logging(args.upgrade)
log.info('Starting SD.Next')
read_options()
check_python()
Expand Down Expand Up @@ -700,7 +704,7 @@ def run_setup():
log.debug(f'Setup complete without errors: {round(time.time())}')
else:
log.warning(f'Setup complete with errors: {errors}')
log.warning('See log file for more details: setup.log')
log.warning(f'See log file for more details: {log_file}')


if __name__ == "__main__":
Expand Down
2 changes: 1 addition & 1 deletion javascript/black-orange.css
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ svg.feather.feather-image, .feather .feather-image { display: none }
#txt2img_seed_row { padding: 0; margin-top: 8px; }
#txt2img_settings { min-width: var(--left-column); max-width: var(--left-column); background-color: #111111; padding-top: 16px; }
#txt2img_subseed_row { padding: 0; margin-top: 16px; }
#txt2img_subseed_show { min-width: 74px; padding: 8px 0 0 0 }
#txt2img_subseed_show, #img2img_subseed_show { display: None }
#txt2img_subseed_strength { margin-top: 0; }
#txt2img_tools, #img2img_tools { margin-top: 54px; scale: 120%; margin-left: 26px; }
#txtimg_hr_finalres { max-width: 200px; }
Expand Down
3 changes: 1 addition & 2 deletions launch.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@

import installer
installer.ensure_base_requirements()
installer.setup_logging(False)
installer.add_args()
installer.parse_args()
installer.setup_logging(False)
installer.extensions_preload(force=False)

import modules.cmd_args
Expand Down Expand Up @@ -130,7 +130,6 @@ def start_server(immediate=True, server=None):
if __name__ == "__main__":
if args.version:
installer.add_args()
installer.setup_logging(clean=False)
installer.log.info('SD.Next version information')
installer.check_python()
installer.check_version()
Expand Down
27 changes: 19 additions & 8 deletions modules/ui_tempdir.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,28 +35,39 @@ def check_tmp_file(gradio, filename):
return ok


def save_pil_to_file(pil_image, dir=None): # pylint: disable=redefined-builtin
already_saved_as = getattr(pil_image, 'already_saved_as', None)
def pil_to_temp_file(self, img, dir: str, format="png") -> str: # pylint: disable=redefined-builtin,unused-argument
"""
# original gradio implementation
bytes_data = gr.processing_utils.encode_pil_to_bytes(img, format)
temp_dir = Path(dir) / self.hash_bytes(bytes_data)
temp_dir.mkdir(exist_ok=True, parents=True)
filename = str(temp_dir / f"image.{format}")
img.save(filename, pnginfo=gr.processing_utils.get_pil_metadata(img))
"""
already_saved_as = getattr(img, 'already_saved_as', None)
if already_saved_as and os.path.isfile(already_saved_as):
register_tmp_file(shared.demo, already_saved_as)
file_obj = Savedfile(already_saved_as)
return file_obj
name = file_obj.name
return name
if shared.opts.temp_dir != "":
dir = shared.opts.temp_dir
use_metadata = False
metadata = PngImagePlugin.PngInfo()
for key, value in pil_image.info.items():
for key, value in img.info.items():
if isinstance(key, str) and isinstance(value, str):
metadata.add_text(key, value)
use_metadata = True
file_obj = tempfile.NamedTemporaryFile(delete=False, suffix=".png", dir=dir)
pil_image.save(file_obj, pnginfo=(metadata if use_metadata else None))
return file_obj
img.save(file_obj, pnginfo=(metadata if use_metadata else None))
name = file_obj.name
shared.log.debug(f'Saving temp image: {name}')
return name


# override save to file function so that it also writes PNG info
gr.processing_utils.save_pil_to_file = save_pil_to_file

# gr.processing_utils.save_pil_to_file = save_pil_to_file # gradio <=3.31.0
gr.components.IOComponent.pil_to_temp_file = pil_to_temp_file # gradio >=3.32.0

def on_tmpdir_changed():
if shared.opts.temp_dir == "":
Expand Down

0 comments on commit 9e22d91

Please sign in to comment.