On Jun 17, 2008, at 5:07 PM, Ittay Dror wrote:
My 2c:
* instead of saving log messages in memory to print them to the
console in
case of exception, why can't the user look at the log file?
This is for convenience. It saves a step to the user. Even a failing
compile would make it necessary to look at the info log. So I think
it is nice to print it directly to the console in case something goes
wrong. The basic idea of 2-phase-logging (or any other name we want
to give to it) is: We have two log streams. One is the one which is
currently (Gradle 0.2) printed to the console (either info or debug
when using -d). The new log stream is neither info nor debug nor any
other standard log level. It gives high level information only about
which tasks are executed and in which order. Additionally it serves
as progress indicator. Once we have the two log streams it should be
up to the user what to do with them.
Use cases:
High Level to Console. In case of error info to the console and debug
to a file.
High Level to Console. In case of error debug to the console and no
file logging.
Info to the console, debug to a file (high level is not used)
Etc ...
This should be configurable via the command line or via the
gradle.properties file. Once we have the two logstreams our logback
logging engine makes it very easy to route the logstreams. In fact
logback makes it also pretty easy to generate the two log streams, as
it allows to create your own log levels (via Marker objects). It is a
really good tool, written by the founder of log4j.
I think the log
file can be in 'debug' level (but make sure 'debug' messages are not
actually meaningless 'trace' messages). also, analysis tools such as
printing the dag, will be good.
What you can do right now is: gradle -t
This prints all the available tasks and there dependencies to the
console. But you are right, this is not the specific DAG for a
certain task. I think it's a good idea to print this out as well when
in debug mode. http://jira.codehaus.org/browse/GRADLE-121
* i'm not sure how printing dots is a good solution. say i have
some task
that takes a long time and doesn't print anything (a compiler,
copying a
large file), either no dots appear - the user thinks the build is
stalled,
or, printing a dot periodically, in which case the task may
actually be
stalled and yet dots will appear.
This is not a particular problem of our two phase logging but two
phase logging might make it slightly worse.
For example:
INFO logging:
Executing: :compile
:: resolving dependencies :: org.gradle#buildSrc;SNAPSHOT
confs: [compile]
found #svnkit;1.1.6 in lib
found #svnkit-javahl;1.1.6 in lib
[groovyc] Compiling 13 source files to /Users/hans/IdeaProjects/
gradle/gradle-core/buildSrc/build/classes
If the last step takes long, the user gets no progress indication.
High Level logging:
Executing :compile
If this takes long we also offer no progress indication but the user
does not know whether this is because the compile takes such a long
time or if the remote repository is down when fetching the dependencies.
It depends on the kind of build if this really is a typical problem.
It will be configurable, so you can switch high level logging of.
what i think is needed is a monitor of the
system resources. this is commonly seen in downloading tools that
tell you
the rate of download. so for compilations, show the cpu usage and for
copying, show the io activity.
That would be really cool. May be not for the first implementation
but for the future.
either show all indicators all the time
(which i prefer), or allow each task to turn on the necessary
indicator.
this also solves the issue of multi-threading.
* if a task is stalled,
We would need a UI for this (which is fine). But it would be cool to
have also a boiled down version for the command line display.
- Hans
ittay
hdockter wrote:
I'm not happy with the logging behavior of Gradle, Ant or Maven.
I think there is too much information printed out to the console,
making it hard to figure out the important bits (for example an
unusual warning).
I would like to improve this and have the following idea:
A log of a successful build would look roughly like this:
-- resources (0 sec)
-- compile (2 sec)
-- test (13 sec)
-- libs (35 sec)
-- integTest (40 sec)
Build Successful: Total time 60 sec
We only show the task names that get executed.
If there are log messages with a level higher than info we write them
to the console:
-- resources (0 sec)
[warning] some message
-- compile (2 sec)
-- test (13 sec)
-- libs (35 sec)
-- integTest (40 sec)
Build Successful: Total time 60 sec
This leaves us with three problems.
1.) If there is an exception, just showing the stacktrace and the
exception message is not necessarily enough to figure out the reason
for the exception. For example the ant javac task throws an exception
if the code does not compile, but this exception points to the
earlier log output to learn about the details. The solution I have in
mind would be to record all the logging. In case of an exception we
print the log of the complete build to the console. The user can
configure which log level should be recorded. The default is INFO.
2.) There has to be some kind of progress indicator, to inform the
user whether there is a stall and to make it more exciting to look at
the log (psychological acceleration ;) ).
I 'm not sure what is the best solution here. One solution would be
to print dots according to a certain algorithm which is based on
incoming log statements. The other solution would require more
console magic. Gradle would show only for example three log
statements. If a new log statement comes in the first one disappears.
This log statement 'window' would move down if a new task is getting
executed. At the end of the build no normal log statement would be
visible.
3.) If the build is stalled you want to interrupt it and learn about
the reasons. Therefore we would implement a shutdown hook for the
JVM. This hook would print the complete recorded log to the console
(similar to the exception case).
Additionally, the log can be written to a file. This will always be
the normal log, not the reduced form of the console. The log level of
the file log can be chosen independently. Of course if people don't
like the reduced form they can always switch to normal logging. The
Gradle logging behavior is either configurable via the command line
or by properties set in the gradle.properties file (either in the
project or in the gradle user home dir).
I use the term 2-phase logging for this. If you have other ideas for
the terminology please let us know.
What do you think about all this?
- Hans
--
Hans Dockter
Gradle Project lead
http://www.gradle.org
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
--
View this message in context: http://www.nabble.com/2-phase-logging-
tp16945248p17913845.html
Sent from the gradle-user mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
--
Hans Dockter
Gradle Project lead
http://www.gradle.org
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email