<div dir="ltr"><div>Hi Pierre,<br><br></div>Why I need to keep the logs long term is:<br><ol><li>It is a goal of the project long term I am working on<br></li><li>If the logHorizon ticket# <a href="http://trac.buildbot.net/ticket/3572">3572 </a>was fixed I would not need to archive the logs</li></ol><p>Regards,</p><p>Alvaro<br></p></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 28, 2017 at 4:00 AM, Pierre Tardy <span dir="ltr"><<a href="mailto:tardyp@gmail.com" target="_blank">tardyp@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Mike,<div><br></div><div>Thanks for sharing this code. I think it is a very interesting approach.</div><div><br></div><div>All,</div><div>I'd like to better understand the reasons why you want to archive those build logs.</div><div>What do you want to do with them in the long term?</div><div>Why having them accessible from the buildbot UI/rest api is not enough?</div><div>Do we need a build report archiver reporter included in buildbot?</div><span class="HOEnZb"><font color="#888888"><div>Pierre</div></font></span></div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Tue, Mar 28, 2017 at 12:49 PM Mike Alexeev <<a href="mailto:mike.42.alexeev@gmail.com" target="_blank">mike.42.alexeev@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8948782926128488792gmail_msg">Hello Pierre,<div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">Thank you for advice. </div><div class="m_-8948782926128488792gmail_msg">I will use reporter class instead of Build class customization.</div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">Alvaro, anyway here is an example of subclassing Build:</div><div class="m_-8948782926128488792gmail_msg"><a href="https://pastebin.com/gfq1wQLG" class="m_-8948782926128488792gmail_msg" target="_blank">https://pastebin.com/gfq1wQLG</a> </div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">Maybe it will be helpful in other cases  </div></div><div class="gmail_extra m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"><div class="gmail_quote m_-8948782926128488792gmail_msg">2017-03-27 21:49 GMT+03:00 Pierre Tardy <span dir="ltr" class="m_-8948782926128488792gmail_msg"><<a href="mailto:tardyp@gmail.com" class="m_-8948782926128488792gmail_msg" target="_blank">tardyp@gmail.com</a>></span>:<br class="m_-8948782926128488792gmail_msg"><blockquote class="gmail_quote m_-8948782926128488792gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792gmail_msg">Hi all,</div><div class="m_-8948782926128488792gmail_msg">Usually, the way to do that is to setup a custom reporter class.</div><div class="m_-8948782926128488792gmail_msg">You can then use the data api to fetch as many information on the build as you need to build your html report, and push it to S3.</div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">The details of what you can get with rest api is documented here:</div><div class="m_-8948782926128488792gmail_msg"><a href="https://docs.buildbot.net/0.9.5/developer/rest.html" class="m_-8948782926128488792gmail_msg" target="_blank">https://docs.buildbot.net/0.9.<wbr>5/developer/rest.html</a></div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">The best is to look at the example of reporters/utils <a href="https://github.com/buildbot/buildbot/blob/master/master/buildbot/reporters/utils.py" class="m_-8948782926128488792gmail_msg" target="_blank">https://<wbr>github.com/buildbot/buildbot/<wbr>blob/master/master/buildbot/<wbr>reporters/utils.py</a></div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">If you are not confident enough with twisted and async, you can just put a MasterShellCommand with a python script in the end of your builds and use the REST api to fetch the data you need.</div><div class="m_-8948782926128488792gmail_msg">In order to get raw logs, you can use the raw log endpoint (no need for logobservers!):</div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">e.g: <a href="https://nine.buildbot.net/api/v2/logs/357614/raw" class="m_-8948782926128488792gmail_msg" target="_blank">https://nine.buildbot.net/api/<wbr>v2/logs/357614/raw</a></div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">Note that buildbot store the stdout/stderr information, which is removed when you fetch it via raw endpoint.</div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">Here is an example on how to process the stream logs that we use for debugging our integration tests:</div><div class="m_-8948782926128488792gmail_msg"><a href="https://github.com/buildbot/buildbot/blob/master/master/buildbot/test/util/integration.py#L246" class="m_-8948782926128488792gmail_msg" target="_blank">https://github.com/buildbot/<wbr>buildbot/blob/master/master/<wbr>buildbot/test/util/<wbr>integration.py#L246</a><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792gmail_msg">Regards</div><span class="m_-8948782926128488792m_2590368696160643449HOEnZb m_-8948782926128488792gmail_msg"><font class="m_-8948782926128488792gmail_msg" color="#888888"><div class="m_-8948782926128488792gmail_msg">Pierre</div><div class="m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"></div></font></span></div><div class="m_-8948782926128488792m_2590368696160643449HOEnZb m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792m_2590368696160643449h5 m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792gmail_msg"><div class="gmail_quote m_-8948782926128488792gmail_msg"><div dir="ltr" class="m_-8948782926128488792gmail_msg">Le lun. 27 mars 2017 à 18:41, Alvaro Erickson <<a href="mailto:alvaro.erickson@gmail.com" class="m_-8948782926128488792gmail_msg" target="_blank">alvaro.erickson@gmail.com</a>> a écrit :<br class="m_-8948782926128488792gmail_msg"></div><blockquote class="gmail_quote m_-8948782926128488792gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">Hi Mike,<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div>I too would like to see what your solution for saving a log (into plain text, not html) for all steps after a build is finished. Specifically, if you could please share the subclassed Build class for log generation. Any examples would be very helpful.<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div>Background: On my work project, one of the goals is they want all the build logs to be archived.<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div>Regards,<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div>Alvaro<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="gmail_extra m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><div class="gmail_quote m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">On Mon, Mar 27, 2017 at 8:52 AM, Mike Alexeev <span dir="ltr" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><<a href="mailto:mike.42.alexeev@gmail.com" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg" target="_blank">mike.42.alexeev@gmail.com</a>></span> wrote:<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><blockquote class="gmail_quote m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">Hello, Koutheir<div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">I have also similar problem. </div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">I need to save log from all steps after build finished.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">No html just plain text.<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">It seems that there is no ready solution. </div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">For example there is no file storage in buildbot for files (reports, logs and other build artifacts).</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">So my solution is not universal though it can be helpful. </div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">For log generation I subclassed Build class. You can set your own custom Build class</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">to build factory in buildbot config.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">I overrided buildFinished method and added there code to collect log from all steps.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">In build instance you have access to Data API and you can read logs from DB.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">I can share example if you want.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">For file serving I use nginx.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">I added links to log in build page template and substitute path to log based on build properties.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">So every build has link on its page to log.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">I think that saving log can also be implemented as step running on Local Worker </div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">(it runs on master).  But I used custom build class because it looks cleaner (no odd steps in build).</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">By the way, can be there default implementation for file storage in buildbot? </div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">For example default solution with twisted file serving</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">and possibility to use server like nginx in bigger setups. Just like db setup - sqlite has no external</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"> processes and easy to setup, but  also you can use postgre which much more faster.</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">What about adding post-build hook in configuration? Log-saving method for example could be</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"> set there</div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div><div class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div></div>
<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">______________________________<wbr>_________________<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">
users mailing list<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">
<a href="mailto:users@buildbot.net" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg" target="_blank">users@buildbot.net</a><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">
<a href="https://lists.buildbot.net/mailman/listinfo/users" rel="noreferrer" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg" target="_blank">https://lists.buildbot.net/<wbr>mailman/listinfo/users</a><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></blockquote></div><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg"></div>
______________________________<wbr>_________________<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">
users mailing list<br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">
<a href="mailto:users@buildbot.net" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg" target="_blank">users@buildbot.net</a><br class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg">
<a href="https://lists.buildbot.net/mailman/listinfo/users" rel="noreferrer" class="m_-8948782926128488792m_2590368696160643449m_9099353080319539250gmail_msg m_-8948782926128488792gmail_msg" target="_blank">https://lists.buildbot.net/<wbr>mailman/listinfo/users</a></blockquote></div>
</div></div></blockquote></div><br class="m_-8948782926128488792gmail_msg"></div>
</blockquote></div>
</div></div></blockquote></div><br></div>