Как я могу заставить муравья, параллельного не мультиплексировать/чередовать мои записи в журнале?

Когда я работаю, или в теге муравей мультиплексирует журналы, смешивающие вывод каждой задачи. Я хотел бы что-то более легко read/grokked.

Я попробовал следующие подходы, и они лучше чем ничего, но все еще что я ищу. Следующий echos нечередующийся вывод журнала в конце журнала, но это также имеет объединенный и смешанный вывод этих двух задач сначала.

Существует ли способ, которым я могу сказать муравью ТОЛЬКО вывод в рассматриваемый файл и не пузырюсь вывод журнала вызывающей стороне?

<parallel>
  <ant target="task1" output=${log.dir}/task1.log"/>
  <ant target="task2" output=${log.dir}/task2.log"/>
</parallel>
<loadfile property="task1" srcfile="${log.dir}/task1.log"/>
<loadfile property="task2" srcfile="${log.dir}/task2.log"/>
<echo>Results:
Task1: ${task1}
---
Task2: ${task2}
</echo>
6
задан Peter Kahn 21 June 2010 в 20:56
поделиться

1 ответ

У меня есть два возможных решения:

  • написать моя собственная задача antcall, которая обрабатывает ведение журнала по-другому
  • забудьте о консоли и используйте запись для управления записью в файл

Я собираюсь использовать вторую, потому что ее проще всего реализовать, и потому что я, вероятно, перехожу в Gradle позже, где я решу это другим способом (но, вероятно, следуя аналогичной схеме)

Основная задача ant будет использовать запись для включения и выключения записи в build.log. Перед параллельным он отключит ведение журнала и позволит подчиненному муравью регистрироваться в файлах. После того, как они завершатся, ant загрузится и отобразит вывод. Вывод консоли продолжает смешиваться, а файл build.log сериализуется.

Это немного странно, но не так уж плохо.

<project name="antExperiments" default="para" basedir=".">

    <!-- Logging Control -->
    <property  name="build.log.dir" location="${basedir}/logs"/>


    <!-- - - - - - - - - - - - - - - - - - 
          macro: activate logging (defaults to ${build.log.dir}/build.log)                      
         - - - - - - - - - - - - - - - - - -->
    <macrodef name="start.log">
      <attribute name="name" default="build"/>
      <attribute name="dir" default="${build.log.dir}"/>
      <attribute name="append" default="false"/>
      <sequential>
        <record action="start" append="@{append}" name="@{dir}/@{name}.log"/>
      </sequential>
    </macrodef>

    <!-- - - - - - - - - - - - - - - - - - 
          macro: deactivate logging (defaults to ${build.log.dir}/build.log)                      
         - - - - - - - - - - - - - - - - - -->
    <macrodef name="stop.log">
      <attribute name="name" default="build"/>
      <attribute name="dir" default="${build.log.dir}"/>
      <attribute name="append" default="false"/>
      <sequential>
        <record action="stop" append="@{append}" name="@{dir}/@{name}.log"/>
      </sequential>
    </macrodef>

    <target  name="clean">
        <delete dir="${build.log.dir}"/>
        <mkdir  dir="${build.log.dir}"/>
    </target>

    <!-- - - - - - - - - - - - - - - - - - 
          target: main.init
          Initialization for Top Level build - not used by subants                      
         - - - - - - - - - - - - - - - - - -->
    <target name="main.init">
        <start.log/>
    </target>

    <!-- ================================= 
          target: para
          top level build runs 2 jobs in parallel producing interleaved hard to read
          on to standard output and non interleaved more easily understood logging 
          to build.log
         ================================= -->  
    <target  name="para" depends="main.init,clean">
        <stop.log/> <!-- disable top level logging -->
        <parallel threadcount="4" pollinterval="50">
            <ant output="${build.log.dir}/proc1.log" target="proc1">
                <property name="proc" value="proc1"/>
            </ant>
            <ant output="${build.log.dir}/proc2.log" target="proc2">
                <property name="proc" value="proc2"/>                    
            </ant>
        </parallel>
        <start.log/> <!-- enable top level logging -->

        <!-- Non interleaved output -->
        <loadfile property="p1" srcfile="${build.log.dir}/proc1.log"/>
        <loadfile property="p2" srcfile="${build.log.dir}/proc2.log"/>
        <echo>
--------------------------
BuildJob: proc1         
OUTPUT: ******************
${p1}
**************************
--------------------------
BuildJob: proc2         
OUTPUT: ******************
${p2}
**************************


BUILD LOG: ${build.log.dir}/build.log           
</echo>     
    </target>


    <target name="init">
        <echo>Init called by ${proc}</echo>
    </target>

    <target name="proc1" depends="init">
        <echo>PROC1.......................
        </echo>
        <exec dir="${basedir}" executable="cmd">
            <arg line="/c dir \"/>
        </exec>
    </target>
    <target name="proc2" depends="init">
        <echo>PROC2..........2222222.......
        </echo>
        <exec dir="${basedir}" executable="cmd">
            <arg line="/c dir \sandbox"/>
        </exec>
    </target>
</project>
4
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: