This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch jbang-log in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2b1018e152fca86b047606a42a14fe29286b91fc Author: Claus Ibsen <[email protected]> AuthorDate: Mon Apr 29 11:39:33 2024 +0200 CAMEL-20721: camel-jbang - Make it possible to set logging-level per package individually from CLI --- .../dsl/jbang/core/commands/CamelCommand.java | 4 +- .../dsl/jbang/core/commands/ExportBaseCommand.java | 4 +- .../apache/camel/dsl/jbang/core/commands/Run.java | 32 ++++++++++- .../camel/dsl/jbang/core/common/RuntimeUtil.java | 66 ++++++++++++++++++---- 4 files changed, 89 insertions(+), 17 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java index ddbafad01f1..40ed1be0e41 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java @@ -52,8 +52,8 @@ public abstract class CamelCommand implements Callable<Integer> { return main; } - protected void configureLoggingOff() { - RuntimeUtil.configureLog("off", false, false, false, false, null); + protected void configureLoggingOff() throws Exception { + RuntimeUtil.configureLog("off", false, false, false, false, null, null); } protected boolean disarrangeLogging() { diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java index 24f0803d95c..a3df4f79217 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java @@ -227,9 +227,9 @@ abstract class ExportBaseCommand extends CamelCommand { public Integer doCall() throws Exception { // configure logging first if (logging) { - RuntimeUtil.configureLog(loggingLevel, false, false, false, true, null); + RuntimeUtil.configureLog(loggingLevel, false, false, false, true, null, null); } else { - RuntimeUtil.configureLog("off", false, false, false, true, null); + RuntimeUtil.configureLog("off", false, false, false, true, null, null); } if (!quiet) { diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index 795b6ae8f5a..c27923ca164 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -215,6 +215,9 @@ public class Run extends CamelCommand { @Option(names = { "--logging-config-path" }, description = "Path to file with custom logging configuration") String loggingConfigPath; + @Option(names = { "--logging-category" }, description = "Used for individual logging levels (ex: org.apache.kafka=DEBUG)") + List<String> loggingCategory = new ArrayList<>(); + @Option(names = { "--max-messages" }, defaultValue = "0", description = "Max number of messages to process before stopping") int maxMessages; @@ -1430,11 +1433,34 @@ public class Run extends CamelCommand { return main; } - private void configureLogging() { + private void configureLogging() throws Exception { if (silentRun) { // do not configure logging } else if (logging) { - RuntimeUtil.configureLog(loggingLevel, loggingColor, loggingJson, scriptRun, false, loggingConfigPath); + // allow to configure individual logging levels in application.properties + Properties prop = loadProfileProperties(); + if (prop != null) { + for (Object obj : prop.keySet()) { + String key = obj.toString(); + String value = prop.getProperty(key); + if (key.startsWith("logging.level.")) { + key = key.substring(14); + } else if (key.startsWith("quarkus.log.category.")) { + key = key.substring(21); + if (key.endsWith(".level")) { + key = key.substring(0, key.length() - 6); + } + } + key = StringHelper.removeLeadingAndEndingQuotes(key); + String line = key + "=" + value; + String line2 = key + " = " + value; + if (!loggingCategory.contains(line) && !loggingCategory.contains(line2)) { + loggingCategory.add(line); + } + } + } + RuntimeUtil.configureLog(loggingLevel, loggingColor, loggingJson, scriptRun, false, loggingConfigPath, + loggingCategory); writeSettings("loggingLevel", loggingLevel); writeSettings("loggingColor", loggingColor ? "true" : "false"); writeSettings("loggingJson", loggingJson ? "true" : "false"); @@ -1445,7 +1471,7 @@ public class Run extends CamelCommand { logFile.deleteOnExit(); } } else { - RuntimeUtil.configureLog("off", false, false, false, false, null); + RuntimeUtil.configureLog("off", false, false, false, false, null, null); writeSettings("loggingLevel", "off"); } } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java index 41b8371a405..ca44f91652a 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java @@ -19,15 +19,20 @@ package org.apache.camel.dsl.jbang.core.common; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Properties; +import java.util.StringJoiner; import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.camel.util.IOHelper; import org.apache.camel.util.OrderedProperties; +import org.apache.camel.util.StringHelper; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; @@ -39,23 +44,64 @@ public final class RuntimeUtil { } public static void configureLog( - String level, boolean color, boolean json, boolean script, boolean export, String loggingConfigPath) { + String level, boolean color, boolean json, boolean script, boolean export, String loggingConfigPath, + List<String> loggingCategories) + throws Exception { if (INIT_DONE.compareAndSet(false, true)) { long pid = ProcessHandle.current().pid(); System.setProperty("pid", Long.toString(pid)); if (loggingConfigPath != null) { + // ust custom logging configuration as-is Configurator.initialize("CamelJBang", "file://" + Path.of(loggingConfigPath).toAbsolutePath()); - } else if (export) { - Configurator.initialize("CamelJBang", "log4j2-export.properties"); - } else if (script) { - Configurator.initialize("CamelJBang", "log4j2-script.properties"); - } else if (json) { - Configurator.initialize("CamelJBang", "log4j2-json.properties"); - } else if (color) { - Configurator.initialize("CamelJBang", "log4j2.properties"); + } else if (loggingCategories != null && !loggingCategories.isEmpty()) { + // enrich logging file with custom logging categories + String name = "log4j2-no-color.properties"; + if (export) { + name = "log4j2-export.properties"; + } else if (script) { + name = "log4j2-export.properties"; + } else if (json) { + name = "log4j2-export.properties"; + } else if (color) { + name = "log4j2.properties"; + } + InputStream is = RuntimeUtil.class.getClassLoader().getResourceAsStream(name); + String content = IOHelper.loadText(is); + IOHelper.close(is); + + StringJoiner sj = new StringJoiner(System.lineSeparator()); + int i = 0; + for (String lc : loggingCategories) { + String prefix = "custom" + i++; + String catName = StringHelper.before(lc, "=", "").trim(); + String catLevel = StringHelper.after(lc, "=", "").trim(); + if (!catName.isEmpty() && !catLevel.isEmpty()) { + sj.add("logger." + prefix + ".name=" + catName); + sj.add("logger." + prefix + ".level=" + catLevel); + sj.add("logger." + prefix + ".appenderRef.$1.ref=out"); + sj.add("logger." + prefix + ".appenderRef.$2.ref=file"); + } + } + content = content + System.lineSeparator() + sj; + + name = CommandLineHelper.CAMEL_JBANG_WORK_DIR + "/log4j2.properties"; + Files.writeString(Paths.get(name), content); + + Configurator.initialize("CamelJBang", "file://" + Path.of(name).toAbsolutePath()); } else { - Configurator.initialize("CamelJBang", "log4j2-no-color.properties"); + // use out of the box logging configuration + if (export) { + Configurator.initialize("CamelJBang", "log4j2-export.properties"); + } else if (script) { + Configurator.initialize("CamelJBang", "log4j2-script.properties"); + } else if (json) { + Configurator.initialize("CamelJBang", "log4j2-json.properties"); + } else if (color) { + Configurator.initialize("CamelJBang", "log4j2.properties"); + } else { + Configurator.initialize("CamelJBang", "log4j2-no-color.properties"); + } } }
