JavaFX log4j in a textarea with a different thread












0















I'm trying to redirect log4j output to a textarea but this one get filled at the end of the action since I'm using Platform.runLater
Is there any way I can do it with a different thread ?



AppFX.java



public class AppFX extends Application {


public static void main(String args) {
ConfHandler.initConf();
launch(args);
}

@Override
public void start(Stage primaryStage)throws IOException {
primaryStage.getIcons().add(new Image("file:src/main/resources/images/frameIcon.png"));
FXMLLoader loader = new FXMLLoader();
String currentPath = System.getProperty("user.dir");
loader.setLocation(new URL("file:\"+currentPath+"\src\main\resources\scenes\TestsFrame.fxml"));
Parent content = loader.load();
primaryStage.setTitle("IGED Tests");
Scene scene = new Scene(content);
primaryStage.setScene(scene);
primaryStage.show();
TextAreaAppender.setTextArea(((EaaSCleanerController)loader.getController()).getLogTextArea());
}}


TextAreaAppender.java



public class TextAreaAppender extends WriterAppender {
private static volatile TextArea textArea = null;

public static void setTextArea(final TextArea textArea) {
TextAreaAppender.textArea = textArea;
}

@Override
public void append(final LoggingEvent loggingEvent) {
final String message = this.layout.format(loggingEvent);
try {
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
if (textArea != null) {
if (textArea.getText().length() == 0) {
textArea.setText(message);
} else {
textArea.selectEnd();
textArea.insertText(textArea.getText().length(), message);
}
}
} catch (final Throwable t) {
System.out.println("Unable to append log to textarea:" + t.getMessage());
}
}
});
} catch (final IllegalStateException e) {
}
}}


log4j.properties



# Append the logs to the GUI
log4j.appender.gui=com.bp.nest.testauto.gui.TextAreaAppender
log4j.appender.gui.layout=org.apache.log4j.PatternLayout
log4j.appender.gui.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n









share|improve this question



























    0















    I'm trying to redirect log4j output to a textarea but this one get filled at the end of the action since I'm using Platform.runLater
    Is there any way I can do it with a different thread ?



    AppFX.java



    public class AppFX extends Application {


    public static void main(String args) {
    ConfHandler.initConf();
    launch(args);
    }

    @Override
    public void start(Stage primaryStage)throws IOException {
    primaryStage.getIcons().add(new Image("file:src/main/resources/images/frameIcon.png"));
    FXMLLoader loader = new FXMLLoader();
    String currentPath = System.getProperty("user.dir");
    loader.setLocation(new URL("file:\"+currentPath+"\src\main\resources\scenes\TestsFrame.fxml"));
    Parent content = loader.load();
    primaryStage.setTitle("IGED Tests");
    Scene scene = new Scene(content);
    primaryStage.setScene(scene);
    primaryStage.show();
    TextAreaAppender.setTextArea(((EaaSCleanerController)loader.getController()).getLogTextArea());
    }}


    TextAreaAppender.java



    public class TextAreaAppender extends WriterAppender {
    private static volatile TextArea textArea = null;

    public static void setTextArea(final TextArea textArea) {
    TextAreaAppender.textArea = textArea;
    }

    @Override
    public void append(final LoggingEvent loggingEvent) {
    final String message = this.layout.format(loggingEvent);
    try {
    Platform.runLater(new Runnable() {
    @Override
    public void run() {
    try {
    if (textArea != null) {
    if (textArea.getText().length() == 0) {
    textArea.setText(message);
    } else {
    textArea.selectEnd();
    textArea.insertText(textArea.getText().length(), message);
    }
    }
    } catch (final Throwable t) {
    System.out.println("Unable to append log to textarea:" + t.getMessage());
    }
    }
    });
    } catch (final IllegalStateException e) {
    }
    }}


    log4j.properties



    # Append the logs to the GUI
    log4j.appender.gui=com.bp.nest.testauto.gui.TextAreaAppender
    log4j.appender.gui.layout=org.apache.log4j.PatternLayout
    log4j.appender.gui.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n









    share|improve this question

























      0












      0








      0








      I'm trying to redirect log4j output to a textarea but this one get filled at the end of the action since I'm using Platform.runLater
      Is there any way I can do it with a different thread ?



      AppFX.java



      public class AppFX extends Application {


      public static void main(String args) {
      ConfHandler.initConf();
      launch(args);
      }

      @Override
      public void start(Stage primaryStage)throws IOException {
      primaryStage.getIcons().add(new Image("file:src/main/resources/images/frameIcon.png"));
      FXMLLoader loader = new FXMLLoader();
      String currentPath = System.getProperty("user.dir");
      loader.setLocation(new URL("file:\"+currentPath+"\src\main\resources\scenes\TestsFrame.fxml"));
      Parent content = loader.load();
      primaryStage.setTitle("IGED Tests");
      Scene scene = new Scene(content);
      primaryStage.setScene(scene);
      primaryStage.show();
      TextAreaAppender.setTextArea(((EaaSCleanerController)loader.getController()).getLogTextArea());
      }}


      TextAreaAppender.java



      public class TextAreaAppender extends WriterAppender {
      private static volatile TextArea textArea = null;

      public static void setTextArea(final TextArea textArea) {
      TextAreaAppender.textArea = textArea;
      }

      @Override
      public void append(final LoggingEvent loggingEvent) {
      final String message = this.layout.format(loggingEvent);
      try {
      Platform.runLater(new Runnable() {
      @Override
      public void run() {
      try {
      if (textArea != null) {
      if (textArea.getText().length() == 0) {
      textArea.setText(message);
      } else {
      textArea.selectEnd();
      textArea.insertText(textArea.getText().length(), message);
      }
      }
      } catch (final Throwable t) {
      System.out.println("Unable to append log to textarea:" + t.getMessage());
      }
      }
      });
      } catch (final IllegalStateException e) {
      }
      }}


      log4j.properties



      # Append the logs to the GUI
      log4j.appender.gui=com.bp.nest.testauto.gui.TextAreaAppender
      log4j.appender.gui.layout=org.apache.log4j.PatternLayout
      log4j.appender.gui.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n









      share|improve this question














      I'm trying to redirect log4j output to a textarea but this one get filled at the end of the action since I'm using Platform.runLater
      Is there any way I can do it with a different thread ?



      AppFX.java



      public class AppFX extends Application {


      public static void main(String args) {
      ConfHandler.initConf();
      launch(args);
      }

      @Override
      public void start(Stage primaryStage)throws IOException {
      primaryStage.getIcons().add(new Image("file:src/main/resources/images/frameIcon.png"));
      FXMLLoader loader = new FXMLLoader();
      String currentPath = System.getProperty("user.dir");
      loader.setLocation(new URL("file:\"+currentPath+"\src\main\resources\scenes\TestsFrame.fxml"));
      Parent content = loader.load();
      primaryStage.setTitle("IGED Tests");
      Scene scene = new Scene(content);
      primaryStage.setScene(scene);
      primaryStage.show();
      TextAreaAppender.setTextArea(((EaaSCleanerController)loader.getController()).getLogTextArea());
      }}


      TextAreaAppender.java



      public class TextAreaAppender extends WriterAppender {
      private static volatile TextArea textArea = null;

      public static void setTextArea(final TextArea textArea) {
      TextAreaAppender.textArea = textArea;
      }

      @Override
      public void append(final LoggingEvent loggingEvent) {
      final String message = this.layout.format(loggingEvent);
      try {
      Platform.runLater(new Runnable() {
      @Override
      public void run() {
      try {
      if (textArea != null) {
      if (textArea.getText().length() == 0) {
      textArea.setText(message);
      } else {
      textArea.selectEnd();
      textArea.insertText(textArea.getText().length(), message);
      }
      }
      } catch (final Throwable t) {
      System.out.println("Unable to append log to textarea:" + t.getMessage());
      }
      }
      });
      } catch (final IllegalStateException e) {
      }
      }}


      log4j.properties



      # Append the logs to the GUI
      log4j.appender.gui=com.bp.nest.testauto.gui.TextAreaAppender
      log4j.appender.gui.layout=org.apache.log4j.PatternLayout
      log4j.appender.gui.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n






      javafx log4j






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 28 '18 at 8:30









      KhaledZeroKhaledZero

      237




      237
























          1 Answer
          1






          active

          oldest

          votes


















          0














          You should put your actions on a separate thread. Then the logging can happen in parallel to your actions. You should never block the GUI-thread.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53515142%2fjavafx-log4j-in-a-textarea-with-a-different-thread%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            You should put your actions on a separate thread. Then the logging can happen in parallel to your actions. You should never block the GUI-thread.






            share|improve this answer




























              0














              You should put your actions on a separate thread. Then the logging can happen in parallel to your actions. You should never block the GUI-thread.






              share|improve this answer


























                0












                0








                0







                You should put your actions on a separate thread. Then the logging can happen in parallel to your actions. You should never block the GUI-thread.






                share|improve this answer













                You should put your actions on a separate thread. Then the logging can happen in parallel to your actions. You should never block the GUI-thread.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 28 '18 at 9:39









                mipamipa

                4,4852824




                4,4852824
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53515142%2fjavafx-log4j-in-a-textarea-with-a-different-thread%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Lallio

                    Futebolista

                    Jornalista