From fbfb934c12c189f7bc160b47f8f359530367f19a Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Wed, 8 Feb 2023 20:46:07 +0100
Subject: [PATCH] Fine tuning in logging.

---
 src/core/de.evoal.core.main/pom.xml           | 12 ++++++++---
 src/core/de.evoal.core.main/scripts/paths.env |  1 -
 .../de/evoal/core/api/board/Blackboard.java   | 21 +++++++++++++++++++
 .../core/api/board/CoreBlackboardEntries.java |  6 ++++++
 .../de/evoal/core/api/ea/cdi/Fitness.java     | 19 +++++++++++++++++
 .../main/java/de/evoal/core/main/Evoal.java   | 13 ++++++++++--
 .../search/HeuristicSearchEvaluation.java     |  2 +-
 .../statistics/fitness/FitnessStatistics.java |  3 ---
 .../src/main/java/module-info.java            |  2 ++
 .../src/main/resources/logback.xml            |  8 ++-----
 10 files changed, 71 insertions(+), 16 deletions(-)
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java

diff --git a/src/core/de.evoal.core.main/pom.xml b/src/core/de.evoal.core.main/pom.xml
index de42bfc5..9cbf74e5 100644
--- a/src/core/de.evoal.core.main/pom.xml
+++ b/src/core/de.evoal.core.main/pom.xml
@@ -45,12 +45,18 @@
 			<scope>runtime</scope>
 		</dependency>
 
-		<!-- logback for logging (@runtime) -->
+		<!-- logback for logging -->
 		<dependency>
 			<groupId>ch.qos.logback</groupId>
 			<artifactId>logback-classic</artifactId>
-			<version>1.4.0</version>
-			<scope>runtime</scope>
+			<version>1.4.5</version>
+		</dependency>
+
+		<!-- Deltaspike uses JUL. Use the JUL bridge to reroute it SLF4J -->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jul-to-slf4j</artifactId>
+			<version>2.0.6</version>
 		</dependency>
 
 		<!-- deltaspike -->
diff --git a/src/core/de.evoal.core.main/scripts/paths.env b/src/core/de.evoal.core.main/scripts/paths.env
index bd1e3b7e..b627c074 100644
--- a/src/core/de.evoal.core.main/scripts/paths.env
+++ b/src/core/de.evoal.core.main/scripts/paths.env
@@ -4,7 +4,6 @@ PLUGIN_PATHS=`ls -d "${EVOALPATH}/plugins"/* | tr '\n' ':'`
 CLASSPATH="-Dorg.jboss.logging.provider=slf4j \
           --module-path ${EVOALPATH}/modules/:$PLUGIN_PATHS \
           --add-modules ALL-MODULE-PATH \
-          --add-opens java.base/java.lang=guice \
           --add-exports io.jenetics.base/io.jenetics.internal.math=de.evoal.core.main \
           --add-exports io.jenetics.base/io.jenetics.internal.collection=de.evoal.core.main \
           --add-exports io.jenetics.base/io.jenetics.internal.util=de.evoal.core.main \
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/Blackboard.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/Blackboard.java
index 93064d2d..9f4b77b9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/Blackboard.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/Blackboard.java
@@ -3,8 +3,11 @@ package de.evoal.core.api.board;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.event.Event;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
 import lombok.NonNull;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.LoggerFactory;
 
 import javax.inject.Inject;
 import java.util.HashMap;
@@ -91,6 +94,24 @@ public class Blackboard {
      * @param args The command line arguments.
      */
     public void readArguments(final String[] args) {
+        for(String arg : args) {
+            if(!arg.startsWith("-B")) {
+                continue;
+            }
+
+            arg = arg.substring(2);
+            final int colonIndex = arg.indexOf('=');
+
+            final String entry = arg.substring(0, colonIndex);
+            final String value = arg.substring(colonIndex + 1);
+
+            if(CoreBlackboardEntries.LOGGING_LEVEL.equals(entry)) {
+                final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+                final Level level = Level.toLevel(value);
+                root.setLevel(level);
+            }
+        }
+
         for(String arg : args) {
             if(!arg.startsWith("-B")) {
                 continue;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java
index e665ecf7..379ec68d 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/board/CoreBlackboardEntries.java
@@ -19,6 +19,12 @@ public class CoreBlackboardEntries implements BlackboardEntries {
      */
     public static final String CONSTRAINT_FOLDER = "core:constraint-folder";
 
+    /**
+     * Parameter to specify for logging leven.
+     */
+    @Commandline(main = "",  name = "core:logging", doc = "Logging level to use (ERROR,WARN,INFO,DEBUG)")
+    public static final String LOGGING_LEVEL = "core:logging";
+
     /**
      * Number of evaluation runs.
      */
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java
new file mode 100644
index 00000000..f56446d9
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java
@@ -0,0 +1,19 @@
+package de.evoal.core.api.ea.cdi;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+import java.lang.annotation.*;
+
+/**
+ * Annotation for marking fitness functions.
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Qualifier
+@Target({ElementType.TYPE})
+public @interface Fitness {
+    /**
+     * @return Name of the fitness calculator.
+     */
+    public String value();
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java
index 4360f37e..eee035a3 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java
@@ -14,6 +14,7 @@ import org.apache.deltaspike.cdise.api.CdiContainer;
 import org.apache.deltaspike.cdise.api.CdiContainerLoader;
 import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.core.util.metadata.AnnotationInstanceProvider;
+import org.slf4j.bridge.SLF4JBridgeHandler;
 
 import java.lang.reflect.Field;
 import java.util.*;
@@ -25,14 +26,17 @@ import java.util.*;
 @Slf4j
 public final class Evoal {
     public static void main(final String ... args) {
+        installJavaLoggingToSLF4JBridge();
+
         log.info("Starting up EvoAl");
 
         log.info("Booting CDI container");
         final CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
         cdiContainer.boot();
-        cdiContainer.getContextControl().startContext(ApplicationScoped.class);
+        cdiContainer.getContextControl()
+                    .startContext(ApplicationScoped.class);
 
-        if(args.length == 0) {
+        if(args.length == 0 || args.length == 1 && "--help".equals(args[0])) {
             printUsage();
         } else {
             log.info("Setting up black board");
@@ -62,6 +66,11 @@ public final class Evoal {
         cdiContainer.shutdown();
     }
 
+    private static void installJavaLoggingToSLF4JBridge() {
+        SLF4JBridgeHandler.removeHandlersForRootLogger();
+        SLF4JBridgeHandler.install();
+    }
+
     private static void printUsage() {
         System.out.println();
         System.out.println();
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
index a676ebfa..d5cabac5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
@@ -31,7 +31,7 @@ documentation = """
 Evaluates a heuristic search using multiple targets.
 
 Each target is searched for 'core:evaluation-iterations' times to allow a
-proper empirical evaluation. 
+proper empirical evaluation.
 """
 )
 @ApplicationScoped
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java
index ad59cb8b..c5c323f6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java
@@ -1,9 +1,6 @@
 package de.evoal.core.main.statistics.fitness;
 
-import de.evoal.core.api.board.CoreBlackboardEntries;
-import de.evoal.core.api.cdi.BlackboardValue;
 import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.statistics.*;
 import de.evoal.languages.model.instance.Instance;
diff --git a/src/core/de.evoal.core.main/src/main/java/module-info.java b/src/core/de.evoal.core.main/src/main/java/module-info.java
index aad17264..375e9181 100644
--- a/src/core/de.evoal.core.main/src/main/java/module-info.java
+++ b/src/core/de.evoal.core.main/src/main/java/module-info.java
@@ -13,6 +13,8 @@ module de.evoal.core.main {
     requires lombok;
 
     requires org.slf4j;
+    requires jul.to.slf4j;
+    requires ch.qos.logback.classic;
 
     requires io.jenetics.base;
     requires io.jenetics.ext;
diff --git a/src/core/de.evoal.core.main/src/main/resources/logback.xml b/src/core/de.evoal.core.main/src/main/resources/logback.xml
index b5396d36..ae0cb0a6 100644
--- a/src/core/de.evoal.core.main/src/main/resources/logback.xml
+++ b/src/core/de.evoal.core.main/src/main/resources/logback.xml
@@ -1,15 +1,11 @@
 <configuration>
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
-      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
     </encoder>
   </appender>
 
-  <logger name="de.evoal" level="INFO" />
-  <logger name="org.jboss.weld" level="DEBUG" />
-  <logger name="org.jboss.weld.level" level="DEBUG" />
-
-  <root level="INFO">
+  <root level="ERROR">
     <appender-ref ref="STDOUT" />
   </root>
 </configuration>
\ No newline at end of file
-- 
GitLab