mirror of
https://git.yoctoproject.org/poky
synced 2026-09-19 00:49:33 +02:00
bitbake: toaster: improve logging facilities for toaster
This patch improves the logging facilities for toaster in order to help diagnose bugs that happen on user machines. The logs are stored now under "/tmp/toaster_$$" where $$ is a PID-based unique identifier. On shutdown, toaster will automatically erase all logs unless errors are listed in the log file. On error, Toaster provides suggestions on what to do. This patch includes a minor fix found as a result of logging improvements. (Bitbake rev: 8a8248f7b7e30469f592e2f8adbf6ce21e8685c5) Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
0c89846daf
commit
da8110a86a
@@ -656,18 +656,41 @@ class BuildInfoHelper(object):
|
||||
assert path.startswith("/")
|
||||
assert 'build' in self.internal_state
|
||||
|
||||
def _slkey(layer_version):
|
||||
assert isinstance(layer_version, Layer_Version)
|
||||
return len(layer_version.layer.local_path)
|
||||
if self.brbe is None:
|
||||
def _slkey_interactive(layer_version):
|
||||
assert isinstance(layer_version, Layer_Version)
|
||||
return len(layer_version.layer.local_path)
|
||||
|
||||
# Heuristics: we always match recipe to the deepest layer path that
|
||||
# we can match to the recipe file path
|
||||
for bl in sorted(self.orm_wrapper.layer_version_objects, reverse=True, key=_slkey):
|
||||
if (path.startswith(bl.layer.local_path)):
|
||||
return bl
|
||||
# Heuristics: we always match recipe to the deepest layer path in the discovered layers
|
||||
for lvo in sorted(self.orm_wrapper.layer_version_objects, reverse=True, key=_slkey_interactive):
|
||||
# we can match to the recipe file path
|
||||
if path.startswith(lvo.layer.local_path):
|
||||
return lvo
|
||||
|
||||
#if we get here, we didn't read layers correctly; mockup the new layer
|
||||
unknown_layer, created = Layer.objects.get_or_create(name="unknown", local_path="/", layer_index_url="")
|
||||
else:
|
||||
br_id, be_id = self.brbe.split(":")
|
||||
from bldcontrol.bbcontroller import getBuildEnvironmentController
|
||||
from bldcontrol.models import BuildRequest
|
||||
bc = getBuildEnvironmentController(pk = be_id)
|
||||
|
||||
def _slkey_managed(layer_version):
|
||||
return len(bc.getGitCloneDirectory(layer_version.giturl, layer_version.commit) + layer_version.dirpath)
|
||||
|
||||
# Heuristics: we match the path to where the layers have been checked out
|
||||
for brl in sorted(BuildRequest.objects.get(pk = br_id).brlayer_set.all(), reverse = True, key = _slkey_managed):
|
||||
localdirname = os.path.join(os.path.join(bc.be.sourcedir, bc.getGitCloneDirectory(brl.giturl, brl.commit)), brl.dirpath)
|
||||
if path.startswith(localdirname):
|
||||
#logger.warn("-- managed: matched path %s with layer %s " % (path, localdirname))
|
||||
# we matched the BRLayer, but we need the layer_version that generated this br
|
||||
for lvo in self.orm_wrapper.layer_version_objects:
|
||||
if brl.name == lvo.layer.name:
|
||||
return lvo
|
||||
|
||||
#if we get here, we didn't read layers correctly; dump whatever information we have on the error log
|
||||
logger.error("Could not match layer version for recipe path %s : %s" % (path, self.orm_wrapper.layer_version_objects))
|
||||
|
||||
#mockup the new layer
|
||||
unknown_layer, created = Layer.objects.get_or_create(name="__FIXME__unidentified_layer", local_path="/", layer_index_url="")
|
||||
unknown_layer_version_obj, created = Layer_Version.objects.get_or_create(layer = unknown_layer, build = self.internal_state['build'])
|
||||
|
||||
return unknown_layer_version_obj
|
||||
|
||||
@@ -68,7 +68,7 @@ class Command(NoArgsCommand):
|
||||
task = None
|
||||
bbctrl.build(list(map(lambda x:x.target, br.brtarget_set.all())), task)
|
||||
|
||||
logger.debug("runbuilds: Build launched, exiting")
|
||||
logger.debug("runbuilds: Build launched, exiting. Follow build logs at %s/toaster_ui.log" % bec.be.builddir)
|
||||
# disconnect from the server
|
||||
bbctrl.disconnect()
|
||||
|
||||
|
||||
@@ -3248,7 +3248,7 @@ else:
|
||||
def xhr_build(request, pid):
|
||||
raise Exception("page not available in interactive mode")
|
||||
|
||||
def xhr_projectinfo(request, pid):
|
||||
def xhr_projectinfo(request):
|
||||
raise Exception("page not available in interactive mode")
|
||||
|
||||
def xhr_projectedit(request, pid):
|
||||
|
||||
@@ -344,7 +344,7 @@ LOGGING = {
|
||||
},
|
||||
'formatters': {
|
||||
'datetime': {
|
||||
'format': '%(levelname)s %(asctime)s %(message)s'
|
||||
'format': '%(asctime)s %(levelname)s %(message)s'
|
||||
}
|
||||
},
|
||||
'handlers': {
|
||||
@@ -365,8 +365,8 @@ LOGGING = {
|
||||
'level': 'DEBUG',
|
||||
},
|
||||
'django.request': {
|
||||
'handlers': ['mail_admins'],
|
||||
'level': 'ERROR',
|
||||
'handlers': ['console'],
|
||||
'level': 'WARN',
|
||||
'propagate': True,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -23,6 +23,9 @@ from django.conf.urls import patterns, include, url
|
||||
from django.views.generic import RedirectView
|
||||
from django.views.decorators.cache import never_cache
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger("toaster")
|
||||
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
from django.contrib import admin
|
||||
@@ -47,10 +50,12 @@ import toastermain.settings
|
||||
|
||||
if toastermain.settings.FRESH_ENABLED:
|
||||
urlpatterns.insert(1, url(r'', include('fresh.urls')))
|
||||
logger.info("Enabled django-fresh extension")
|
||||
|
||||
if toastermain.settings.DEBUG_PANEL_ENABLED:
|
||||
import debug_toolbar
|
||||
urlpatterns.insert(1, url(r'', include(debug_toolbar.urls)))
|
||||
logger.info("Enabled django_toolbar extension")
|
||||
|
||||
|
||||
if toastermain.settings.MANAGED:
|
||||
@@ -70,4 +75,15 @@ for t in os.walk(os.path.dirname(currentdir)):
|
||||
|
||||
if "urls.py" in t[2] and t[0] != currentdir:
|
||||
modulename = os.path.basename(t[0])
|
||||
urlpatterns.insert(0, url(r'^' + modulename + '/', include ( modulename + '.urls')))
|
||||
# make sure we don't have this module name in
|
||||
conflict = False
|
||||
for p in urlpatterns:
|
||||
if p.regex.pattern == '^' + modulename + '/':
|
||||
conflict = True
|
||||
if not conflict:
|
||||
urlpatterns.insert(0, url(r'^' + modulename + '/', include ( modulename + '.urls')))
|
||||
else:
|
||||
logger.warn("Module \'%s\' has a regexp conflict, was not added to the urlpatterns" % modulename)
|
||||
|
||||
from pprint import pformat
|
||||
logger.debug("urlpatterns list %s", pformat(urlpatterns))
|
||||
|
||||
Reference in New Issue
Block a user