[poky] Logging: mechanisms and best practices
Darren Hart
dvhart at linux.intel.com
Thu Apr 21 21:23:54 PDT 2011
On 04/21/2011 05:09 PM, Chris Larson wrote:
> On Thu, Apr 21, 2011 at 4:53 PM, Darren Hart <dvhart at linux.intel.com> wrote:
>>
>> From what I could gather, the preferred method is to use the various
>> loglevel functions from bb. ie:
>>
>> bb.fatal() A fatal error, the recipe will set the error code and
>> abort.
>> bb.error() A non-fatal error. The error code is set, the build
>> will be marked as red in the autobuilder.
>> bb.warn() A non-fatal condition that could affect how things
>> progress.
>> bb.debug() One of several debug levels.
>> bb.note() A condition the user should be made aware of
>> bb.plain() typically the output of a tool, such as listtasks
>>
>> note and plain will go to the console and should be used extremely
>> sparingly. debug will only go to the console with the -D[D[D]] bitbake
>> arguments, but should always go to the logs.
>
> As far as I know, notes from tasks are no longer displayed with
> knotty. They certainly aren't in master.
Gah, right. I knew that, got lost in maelstrom.
>
>> For annotating your recipe's task's logs, debug should typically be
>> used. warn() should be used whenever possible over error() so as to not
>> set the error code.
>
> Correct.
>
>> The above only covers the python functions in recipes. Unfortunately,
>> many functions are bash. Most of these recipes use "echo", although
>> there exist wrappers to echo in base.bbclass:
>>
>> oenote
>> oewarn
>> oedebug
>> oefatal
>>
>> As these only wrap echo, none of them go to the console without -D[D[D]]
>> flags. Note the absence of oeplain and oeerror. oeplain wouldn't work
>> the same as bb.plain() as it doesn't go the console, the existing oenote
>> has a similar problem. I've added oeerror() to my local build. oedebug()
>> uses "clever" bash tests to check the OEDEBUG loglevel, unfortunately
>> this causes the function to exit with a failure code when the condition
>> is not met. I've addressed this as well. There are zero users of the oe*
>> logging calls in "meta" but I did find several users in oe.
>>
>> The oe* calls depend on OEDEBUG which is not included in the environment
>> whitelists and is not set by the -D[D[D]] arguments. Even adding it to
>> the whitelist and my environent it wasn't accessible from the bash
>> function. I was unable to to use oedebug() as I couldn't get the OEDEBUG
>> value set without hardcoding it into base.bbclass.
>
> These are largely remnants. I'm not opposed to having the shell
> functions that output useful things, but at the very least we can use
> a python snippet to check the current bitbake logging level rather
> than relying on an old env var. There's currently no way for shell to
> output things to the bitbake UI's display. In the long term, we
> should be able to provide small command-line scripts which communicate
> with the current running bitbake server the same way the current
> running UI does.
If they are remnants, would anyone object to my replacing them with:
bbplain()
bbnote()
bbwarn()
bbdebug()
bberror()
bbfatal()
?
My hope is to get something working now, even if it is just to the logs,
that we can extend the functionality of by integrating it with bitbake
logging later - without changing the interface.
>
>> So... before I start breaking things, I wanted to make sure I fully
>> understand how these mechanisms are intended to be used. Also, I would
>> very much like to see a consistent interface between bash and python
>> fragments that have the same semantics. There are also at least two more
>> logging mechanisms I stumbled across withing the bitbake source. One is
>> marked deprecated, and I'm not sure how the other is meant to be used.
>> The two I mentioned above seem to be the right ones for recipes to use.
>
> This is correct. Internal bitbake code should be using the python
> logging framework at this time. For now, the api functions
> bb.{error,warn,...} are correct for the metadata.
"For now"... Do you expect to see a change here? I don't want to go off
canonicalizing my recipes if the recipes logging API is likely to change
significantly from what I use.
>
>> Would people consider the following to be appropriate:
>>
>> o Remove BBDEBUG from local.conf.sample as it appears not be used.
>
> Agreed.
>
>> o Modify oedebug to always echo the message as all echos only go to the
>> logs anyway. A future change may enhance the oe* calls to print to the
>> console for oenote, a new oeplain, and oedebug based on -D[D[D]] and
>> BBDEBUG.
>
> This would lose us functionality unnecessarily.
Well... right now it doesn't work at all ;-)
> We can
> programmatically check the bitbake debugging level from ${@}. E.g.:
>
> if ${@['false', 'true'][bb.msg.debug_level['default']]}; then
> echo "DEBUG: " "$@"
> fi
The problem I have with this approach is that it limits what gets sent
to the logs. As I understand it, the -D[D[D]] mechanism is meant to
limit what gets sent to the console, but all debug output should go to
the logs.
So until we integrate this with the bitbake logger, I think it makes the
most sense to just print it all to the logs.
Am I off in the weeds here?
>
>> o Remove OEDEBUG as it doesn't seem to fit with the current BBDEBUG,
>> -D[D[D]] mechanisms nor with the expectation that all debug statements
>> get sent to the logs.
>
> Agreed.
Thanks for the review and insight Chris!
--
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
More information about the poky
mailing list