file logging can be turned completely off
and various changes to log levels and messages everywhere
This commit is contained in:
parent
e8a7b18293
commit
4a310ffb28
|
@ -423,7 +423,14 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass):
|
||||||
for attr, widget in self._trackedWidgets.items():
|
for attr, widget in self._trackedWidgets.items():
|
||||||
key = attr if attr not in self._presetNames \
|
key = attr if attr not in self._presetNames \
|
||||||
else self._presetNames[attr]
|
else self._presetNames[attr]
|
||||||
val = presetDict[key]
|
try:
|
||||||
|
val = presetDict[key]
|
||||||
|
except KeyError as e:
|
||||||
|
log.info(
|
||||||
|
'%s missing value %s. Outdated preset?',
|
||||||
|
self.currentPreset, str(e)
|
||||||
|
)
|
||||||
|
val = getattr(self, key)
|
||||||
|
|
||||||
if attr in self._colorWidgets:
|
if attr in self._colorWidgets:
|
||||||
widget.setText('%s,%s,%s' % val)
|
widget.setText('%s,%s,%s' % val)
|
||||||
|
@ -580,7 +587,7 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass):
|
||||||
'colorWidgets',
|
'colorWidgets',
|
||||||
'relativeWidgets',
|
'relativeWidgets',
|
||||||
):
|
):
|
||||||
setattr(self, '_%s' % kwarg, kwargs[kwarg])
|
setattr(self, '_{}'.format(kwarg), kwargs[kwarg])
|
||||||
else:
|
else:
|
||||||
raise ComponentError(
|
raise ComponentError(
|
||||||
self, 'Nonsensical keywords to trackWidgets.')
|
self, 'Nonsensical keywords to trackWidgets.')
|
||||||
|
@ -613,6 +620,10 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass):
|
||||||
self._relativeMaximums[attr] = \
|
self._relativeMaximums[attr] = \
|
||||||
self._trackedWidgets[attr].maximum()
|
self._trackedWidgets[attr].maximum()
|
||||||
self.updateRelativeWidgetMaximum(attr)
|
self.updateRelativeWidgetMaximum(attr)
|
||||||
|
setattr(
|
||||||
|
self, attr, getWidgetValue(self._trackedWidgets[attr])
|
||||||
|
)
|
||||||
|
|
||||||
self._preUpdate()
|
self._preUpdate()
|
||||||
self._autoUpdate()
|
self._autoUpdate()
|
||||||
|
|
||||||
|
@ -732,13 +743,12 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass):
|
||||||
can make determining the 'previous' value tricky.
|
can make determining the 'previous' value tricky.
|
||||||
'''
|
'''
|
||||||
if self.oldAttrs is not None:
|
if self.oldAttrs is not None:
|
||||||
log.verbose('Using nonstandard oldAttr for %s', attr)
|
|
||||||
return self.oldAttrs[attr]
|
return self.oldAttrs[attr]
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
return getattr(self, attr)
|
return getattr(self, attr)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
log.info('Using visible values instead of attrs')
|
log.error('Using visible values instead of oldAttrs')
|
||||||
return self._trackedWidgets[attr].value()
|
return self._trackedWidgets[attr].value()
|
||||||
|
|
||||||
def updateRelativeWidget(self, attr):
|
def updateRelativeWidget(self, attr):
|
||||||
|
@ -893,7 +903,7 @@ class ComponentUpdate(QtWidgets.QUndoCommand):
|
||||||
|
|
||||||
def redo(self):
|
def redo(self):
|
||||||
if self.undone:
|
if self.undone:
|
||||||
log.debug('Redoing component update')
|
log.info('Redoing component update')
|
||||||
self.parent.oldAttrs = self.relativeWidgetValsAfterUndo
|
self.parent.oldAttrs = self.relativeWidgetValsAfterUndo
|
||||||
self.setWidgetValues(self.modifiedVals)
|
self.setWidgetValues(self.modifiedVals)
|
||||||
self.parent.update(auto=True)
|
self.parent.update(auto=True)
|
||||||
|
@ -906,7 +916,7 @@ class ComponentUpdate(QtWidgets.QUndoCommand):
|
||||||
self.parent._sendUpdateSignal()
|
self.parent._sendUpdateSignal()
|
||||||
|
|
||||||
def undo(self):
|
def undo(self):
|
||||||
log.debug('Undoing component update')
|
log.info('Undoing component update')
|
||||||
self.undone = True
|
self.undone = True
|
||||||
self.parent.oldAttrs = self.relativeWidgetValsAfterRedo
|
self.parent.oldAttrs = self.relativeWidgetValsAfterRedo
|
||||||
self.setWidgetValues(self.oldWidgetVals)
|
self.setWidgetValues(self.oldWidgetVals)
|
||||||
|
|
|
@ -148,15 +148,22 @@ class Component(Component):
|
||||||
'-codec:v', 'rawvideo', '-',
|
'-codec:v', 'rawvideo', '-',
|
||||||
'-frames:v', '1',
|
'-frames:v', '1',
|
||||||
])
|
])
|
||||||
logFilename = os.path.join(
|
|
||||||
self.core.logDir, 'preview_%s.log' % str(self.compPos))
|
if self.core.logEnabled:
|
||||||
log.debug('Creating ffmpeg process (log at %s)' % logFilename)
|
logFilename = os.path.join(
|
||||||
with open(logFilename, 'w') as logf:
|
self.core.logDir, 'preview_%s.log' % str(self.compPos))
|
||||||
logf.write(" ".join(command) + '\n\n')
|
log.debug('Creating ffmpeg process (log at %s)' % logFilename)
|
||||||
with open(logFilename, 'a') as logf:
|
with open(logFilename, 'w') as logf:
|
||||||
|
logf.write(" ".join(command) + '\n\n')
|
||||||
|
with open(logFilename, 'a') as logf:
|
||||||
|
self.previewPipe = openPipe(
|
||||||
|
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
|
stderr=logf, bufsize=10**8
|
||||||
|
)
|
||||||
|
else:
|
||||||
self.previewPipe = openPipe(
|
self.previewPipe = openPipe(
|
||||||
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
stderr=logf, bufsize=10**8
|
stderr=subprocess.DEVNULL, bufsize=10**8
|
||||||
)
|
)
|
||||||
byteFrame = self.previewPipe.stdout.read(self.chunkSize)
|
byteFrame = self.previewPipe.stdout.read(self.chunkSize)
|
||||||
closePipe(self.previewPipe)
|
closePipe(self.previewPipe)
|
||||||
|
|
|
@ -139,16 +139,23 @@ class Component(Component):
|
||||||
'-frames:v', '1',
|
'-frames:v', '1',
|
||||||
])
|
])
|
||||||
|
|
||||||
logFilename = os.path.join(
|
if self.core.logEnabled:
|
||||||
self.core.logDir, 'preview_%s.log' % str(self.compPos))
|
logFilename = os.path.join(
|
||||||
log.debug('Creating ffmpeg process (log at %s)' % logFilename)
|
self.core.logDir, 'preview_%s.log' % str(self.compPos))
|
||||||
with open(logFilename, 'w') as logf:
|
log.debug('Creating ffmpeg process (log at %s)' % logFilename)
|
||||||
logf.write(" ".join(command) + '\n\n')
|
with open(logFilename, 'w') as logf:
|
||||||
with open(logFilename, 'a') as logf:
|
logf.write(" ".join(command) + '\n\n')
|
||||||
|
with open(logFilename, 'a') as logf:
|
||||||
|
pipe = openPipe(
|
||||||
|
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
|
stderr=logf, bufsize=10**8
|
||||||
|
)
|
||||||
|
else:
|
||||||
pipe = openPipe(
|
pipe = openPipe(
|
||||||
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
stderr=logf, bufsize=10**8
|
stderr=subprocess.DEVNULL, bufsize=10**8
|
||||||
)
|
)
|
||||||
|
|
||||||
byteFrame = pipe.stdout.read(self.chunkSize)
|
byteFrame = pipe.stdout.read(self.chunkSize)
|
||||||
closePipe(pipe)
|
closePipe(pipe)
|
||||||
|
|
||||||
|
|
|
@ -110,15 +110,21 @@ class Component(Component):
|
||||||
'-codec:v', 'rawvideo', '-',
|
'-codec:v', 'rawvideo', '-',
|
||||||
'-frames:v', '1',
|
'-frames:v', '1',
|
||||||
])
|
])
|
||||||
logFilename = os.path.join(
|
if self.core.logEnabled:
|
||||||
self.core.logDir, 'preview_%s.log' % str(self.compPos))
|
logFilename = os.path.join(
|
||||||
log.debug('Creating ffmpeg process (log at %s)' % logFilename)
|
self.core.logDir, 'preview_%s.log' % str(self.compPos))
|
||||||
with open(logFilename, 'w') as logf:
|
log.debug('Creating ffmpeg log at %s', logFilename)
|
||||||
logf.write(" ".join(command) + '\n\n')
|
with open(logFilename, 'w') as logf:
|
||||||
with open(logFilename, 'a') as logf:
|
logf.write(" ".join(command) + '\n\n')
|
||||||
|
with open(logFilename, 'a') as logf:
|
||||||
|
pipe = openPipe(
|
||||||
|
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
|
stderr=logf, bufsize=10**8
|
||||||
|
)
|
||||||
|
else:
|
||||||
pipe = openPipe(
|
pipe = openPipe(
|
||||||
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
stderr=logf, bufsize=10**8
|
stderr=subprocess.DEVNULL, bufsize=10**8
|
||||||
)
|
)
|
||||||
byteFrame = pipe.stdout.read(self.chunkSize)
|
byteFrame = pipe.stdout.read(self.chunkSize)
|
||||||
closePipe(pipe)
|
closePipe(pipe)
|
||||||
|
|
85
src/core.py
85
src/core.py
|
@ -13,8 +13,8 @@ import toolkit
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger('AVP.Core')
|
log = logging.getLogger('AVP.Core')
|
||||||
STDOUT_LOGLVL = logging.VERBOSE
|
STDOUT_LOGLVL = logging.INFO
|
||||||
FILE_LOGLVL = logging.DEBUG
|
FILE_LOGLVL = logging.VERBOSE
|
||||||
|
|
||||||
|
|
||||||
class Core:
|
class Core:
|
||||||
|
@ -145,17 +145,11 @@ class Core:
|
||||||
saveValueStore = self.getPreset(filepath)
|
saveValueStore = self.getPreset(filepath)
|
||||||
if not saveValueStore:
|
if not saveValueStore:
|
||||||
return False
|
return False
|
||||||
try:
|
comp = self.selectedComponents[compIndex]
|
||||||
comp = self.selectedComponents[compIndex]
|
comp.loadPreset(
|
||||||
comp.loadPreset(
|
saveValueStore,
|
||||||
saveValueStore,
|
presetName
|
||||||
presetName
|
)
|
||||||
)
|
|
||||||
except KeyError as e:
|
|
||||||
log.warning(
|
|
||||||
'%s #%s\'s preset is missing value: %s',
|
|
||||||
comp.name, str(compIndex), str(e)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.savedPresets[presetName] = dict(saveValueStore)
|
self.savedPresets[presetName] = dict(saveValueStore)
|
||||||
return True
|
return True
|
||||||
|
@ -472,11 +466,12 @@ class Core:
|
||||||
encoderOptions = json.load(json_file)
|
encoderOptions = json.load(json_file)
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
|
'canceled': False,
|
||||||
|
'FFMPEG_BIN': findFfmpeg(),
|
||||||
'dataDir': dataDir,
|
'dataDir': dataDir,
|
||||||
'settings': QtCore.QSettings(
|
'settings': QtCore.QSettings(
|
||||||
os.path.join(dataDir, 'settings.ini'),
|
os.path.join(dataDir, 'settings.ini'),
|
||||||
QtCore.QSettings.IniFormat),
|
QtCore.QSettings.IniFormat),
|
||||||
'logDir': os.path.join(dataDir, 'log'),
|
|
||||||
'presetDir': os.path.join(dataDir, 'presets'),
|
'presetDir': os.path.join(dataDir, 'presets'),
|
||||||
'componentsPath': os.path.join(wd, 'components'),
|
'componentsPath': os.path.join(wd, 'components'),
|
||||||
'junkStream': os.path.join(wd, 'gui', 'background.png'),
|
'junkStream': os.path.join(wd, 'gui', 'background.png'),
|
||||||
|
@ -486,8 +481,8 @@ class Core:
|
||||||
'1280x720',
|
'1280x720',
|
||||||
'854x480',
|
'854x480',
|
||||||
],
|
],
|
||||||
'FFMPEG_BIN': findFfmpeg(),
|
'logDir': os.path.join(dataDir, 'log'),
|
||||||
'canceled': False,
|
'logEnabled': False,
|
||||||
}
|
}
|
||||||
|
|
||||||
settings['videoFormats'] = toolkit.appendUppercase([
|
settings['videoFormats'] = toolkit.appendUppercase([
|
||||||
|
@ -572,42 +567,42 @@ class Core:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def makeLogger():
|
def makeLogger():
|
||||||
logFilename = os.path.join(Core.logDir, 'avp_debug.log')
|
# send critical log messages to stdout
|
||||||
libLogFilename = os.path.join(Core.logDir, 'global_debug.log')
|
|
||||||
# delete old logs
|
|
||||||
for log in (logFilename, libLogFilename):
|
|
||||||
if os.path.exists(log):
|
|
||||||
os.remove(log)
|
|
||||||
|
|
||||||
# create file handlers to capture every log message somewhere
|
|
||||||
logFile = logging.FileHandler(logFilename)
|
|
||||||
logFile.setLevel(FILE_LOGLVL)
|
|
||||||
libLogFile = logging.FileHandler(libLogFilename)
|
|
||||||
libLogFile.setLevel(FILE_LOGLVL)
|
|
||||||
|
|
||||||
# send some critical log messages to stdout as well
|
|
||||||
logStream = logging.StreamHandler()
|
logStream = logging.StreamHandler()
|
||||||
logStream.setLevel(STDOUT_LOGLVL)
|
logStream.setLevel(STDOUT_LOGLVL)
|
||||||
|
|
||||||
# create formatters for each stream
|
|
||||||
fileFormatter = logging.Formatter(
|
|
||||||
'[%(asctime)s] %(threadName)-10.10s %(name)-23.23s %(levelname)s: '
|
|
||||||
'%(message)s'
|
|
||||||
)
|
|
||||||
streamFormatter = logging.Formatter(
|
streamFormatter = logging.Formatter(
|
||||||
'<%(name)s> %(message)s'
|
'<%(name)s> %(levelname)s: %(message)s'
|
||||||
)
|
)
|
||||||
logFile.setFormatter(fileFormatter)
|
|
||||||
libLogFile.setFormatter(fileFormatter)
|
|
||||||
logStream.setFormatter(streamFormatter)
|
logStream.setFormatter(streamFormatter)
|
||||||
|
|
||||||
log = logging.getLogger('AVP')
|
log = logging.getLogger('AVP')
|
||||||
log.addHandler(logFile)
|
|
||||||
log.addHandler(logStream)
|
log.addHandler(logStream)
|
||||||
libLog = logging.getLogger()
|
|
||||||
libLog.addHandler(libLogFile)
|
if FILE_LOGLVL is not None:
|
||||||
# lowest level must be explicitly set on the root Logger
|
# write log files as well!
|
||||||
libLog.setLevel(0)
|
Core.logEnabled = True
|
||||||
|
logFilename = os.path.join(Core.logDir, 'avp_debug.log')
|
||||||
|
libLogFilename = os.path.join(Core.logDir, 'global_debug.log')
|
||||||
|
# delete old logs
|
||||||
|
for log_ in (logFilename, libLogFilename):
|
||||||
|
if os.path.exists(log_):
|
||||||
|
os.remove(log_)
|
||||||
|
|
||||||
|
logFile = logging.FileHandler(logFilename)
|
||||||
|
logFile.setLevel(FILE_LOGLVL)
|
||||||
|
libLogFile = logging.FileHandler(libLogFilename)
|
||||||
|
libLogFile.setLevel(FILE_LOGLVL)
|
||||||
|
fileFormatter = logging.Formatter(
|
||||||
|
'[%(asctime)s] %(threadName)-10.10s %(name)-23.23s %(levelname)s: '
|
||||||
|
'%(message)s'
|
||||||
|
)
|
||||||
|
logFile.setFormatter(fileFormatter)
|
||||||
|
libLogFile.setFormatter(fileFormatter)
|
||||||
|
|
||||||
|
libLog = logging.getLogger()
|
||||||
|
log.addHandler(logFile)
|
||||||
|
libLog.addHandler(libLogFile)
|
||||||
|
# lowest level must be explicitly set on the root Logger
|
||||||
|
libLog.setLevel(0)
|
||||||
|
|
||||||
# always store settings in class variables even if a Core object is not created
|
# always store settings in class variables even if a Core object is not created
|
||||||
Core.storeSettings()
|
Core.storeSettings()
|
||||||
|
|
|
@ -92,6 +92,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
self.previewWorker.moveToThread(self.previewThread)
|
self.previewWorker.moveToThread(self.previewThread)
|
||||||
self.previewWorker.imageCreated.connect(self.showPreviewImage)
|
self.previewWorker.imageCreated.connect(self.showPreviewImage)
|
||||||
self.previewThread.start()
|
self.previewThread.start()
|
||||||
|
self.previewThread.finished.connect(
|
||||||
|
lambda:
|
||||||
|
log.critical('PREVIEW THREAD DIED! This should never happen.')
|
||||||
|
)
|
||||||
|
|
||||||
timeout = 500
|
timeout = 500
|
||||||
log.debug(
|
log.debug(
|
||||||
|
@ -442,7 +446,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
appName += '*'
|
appName += '*'
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
log.debug('Setting window title to %s' % appName)
|
log.verbose('Setting window title to %s' % appName)
|
||||||
self.window.setWindowTitle(appName)
|
self.window.setWindowTitle(appName)
|
||||||
|
|
||||||
@QtCore.pyqtSlot(int, dict)
|
@QtCore.pyqtSlot(int, dict)
|
||||||
|
@ -459,16 +463,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
modified = False
|
modified = False
|
||||||
else:
|
else:
|
||||||
modified = (presetStore != self.core.savedPresets[name])
|
modified = (presetStore != self.core.savedPresets[name])
|
||||||
if modified:
|
|
||||||
log.verbose(
|
modified = bool(presetStore)
|
||||||
'Differing values between presets: %s',
|
|
||||||
", ".join([
|
|
||||||
'%s: %s' % item for item in presetStore.items()
|
|
||||||
if val != self.core.savedPresets[name][key]
|
|
||||||
])
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
modified = bool(presetStore)
|
|
||||||
if pos < 0:
|
if pos < 0:
|
||||||
pos = len(self.core.selectedComponents)-1
|
pos = len(self.core.selectedComponents)-1
|
||||||
name = self.core.selectedComponents[pos].name
|
name = self.core.selectedComponents[pos].name
|
||||||
|
|
|
@ -91,16 +91,24 @@ class FfmpegVideo:
|
||||||
|
|
||||||
def fillBuffer(self):
|
def fillBuffer(self):
|
||||||
from component import ComponentError
|
from component import ComponentError
|
||||||
logFilename = os.path.join(
|
if core.Core.logEnabled:
|
||||||
core.Core.logDir, 'render_%s.log' % str(self.component.compPos))
|
logFilename = os.path.join(
|
||||||
log.debug('Creating ffmpeg process (log at %s)', logFilename)
|
core.Core.logDir, 'render_%s.log' % str(self.component.compPos)
|
||||||
with open(logFilename, 'w') as logf:
|
)
|
||||||
logf.write(" ".join(self.command) + '\n\n')
|
log.debug('Creating ffmpeg process (log at %s)', logFilename)
|
||||||
with open(logFilename, 'a') as logf:
|
with open(logFilename, 'w') as logf:
|
||||||
|
logf.write(" ".join(self.command) + '\n\n')
|
||||||
|
with open(logFilename, 'a') as logf:
|
||||||
|
self.pipe = openPipe(
|
||||||
|
self.command, stdin=subprocess.DEVNULL,
|
||||||
|
stdout=subprocess.PIPE, stderr=logf, bufsize=10**8
|
||||||
|
)
|
||||||
|
else:
|
||||||
self.pipe = openPipe(
|
self.pipe = openPipe(
|
||||||
self.command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
self.command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
||||||
stderr=logf, bufsize=10**8
|
stderr=subprocess.DEVNULL, bufsize=10**8
|
||||||
)
|
)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
if self.parent.canceled:
|
if self.parent.canceled:
|
||||||
break
|
break
|
||||||
|
|
Reference in New Issue