From bbe44c65b89d42b9ec50b0d809d5697e75dad1de Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Thu, 8 Dec 2022 09:49:50 +0000 Subject: common parsing --- .../model/builder/xml/dom/DomAdminBuilderBase.java | 34 ++-------- .../java/com/yahoo/log/internal/LevelsModSpec.java | 78 ++++++++++++++++++++++ 2 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 vespalog/src/main/java/com/yahoo/log/internal/LevelsModSpec.java diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java index 6ca4281a243..ba4a915e255 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java @@ -5,6 +5,7 @@ import com.yahoo.config.model.ConfigModelContext.ApplicationType; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; +import com.yahoo.log.internal.LevelsModSpec; import com.yahoo.text.XML; import com.yahoo.vespa.model.Host; import com.yahoo.vespa.model.HostResource; @@ -112,40 +113,13 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu } } - private static Map defaultLogLevels() { - var m = new HashMap(); - m.put("all", "off"); - m.put("error", "on"); - m.put("warning", "on"); - m.put("info", "on"); - m.put("config", "on"); - m.put("event", "on"); - m.put("debug", "off"); - m.put("spam", "off"); - return m; - } - private void addLoggingSpec(ModelElement loggingSpec, Admin admin) { - var currentLevels = defaultLogLevels(); if (loggingSpec == null) return; String componentSpec = loggingSpec.requiredStringAttribute("name"); String levels = loggingSpec.requiredStringAttribute("levels"); - var levelsModSpec = new StringBuilder(); - levelsModSpec.append("all=off"); - for (String s : levels.split("[ ,]")) { - if (s.isEmpty()) continue; - String offOn = "on"; - if (s.startsWith("-")) { - offOn = "off"; - s = s.substring(1); - } - if (currentLevels.containsKey(s)) { - levelsModSpec.append(",").append(s).append("=").append(offOn); - } else { - throw new IllegalArgumentException("invalid level '" + s + "' in logging levels: " + levels); - } - } - admin.addLogctlCommand(componentSpec, levelsModSpec.toString()); + var levelSpec = new LevelsModSpec(); + levelSpec.setLevels(levels); + admin.addLogctlCommand(componentSpec, levelSpec.toLogctlModSpec()); } void addLoggingSpecs(ModelElement loggingElement, Admin admin) { diff --git a/vespalog/src/main/java/com/yahoo/log/internal/LevelsModSpec.java b/vespalog/src/main/java/com/yahoo/log/internal/LevelsModSpec.java new file mode 100644 index 00000000000..4e45b2a91c5 --- /dev/null +++ b/vespalog/src/main/java/com/yahoo/log/internal/LevelsModSpec.java @@ -0,0 +1,78 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.log.internal; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class LevelsModSpec { + private static final String ON = "on"; + private static final String OFF = "off"; + + private static Map defaultLogLevels() { + var m = new LinkedHashMap(); + m.put("fatal", ON); + m.put("error", ON); + m.put("warning", ON); + m.put("info", ON); + m.put("event", ON); + m.put("config", ON); + m.put("debug", OFF); + m.put("spam", OFF); + return m; + } + private Map levelMods = defaultLogLevels(); + + private void setAll(String value) { + for (String k : levelMods.keySet()) { + levelMods.put(k, value); + } + } + private void setAll() { + setAll(ON); + } + private void clearAll() { + setAll(OFF); + } + + public LevelsModSpec addModifications(String mods) { + for (String s : mods.split("[+ ,]")) { + String offOn = ON; + if (s.startsWith("-")) { + offOn = OFF; + s = s.substring(1); + } + if (s.isEmpty()) continue; + if (s.equals("all")) { + setAll(offOn); + } else if (levelMods.containsKey(s)) { + levelMods.put(s, offOn); + } else { + throw new IllegalArgumentException("Unknown log level: "+s); + } + } + return this; + } + + public LevelsModSpec setLevels(String levels) { + if (! (levels.startsWith("+") || levels.startsWith("-"))) { + clearAll(); + } + return addModifications(levels); + } + + public String toLogctlModSpec() { + var spec = new StringBuilder(); + boolean comma = false; + for (var entry : levelMods.entrySet()) { + if (comma) { + spec.append(","); + } + spec.append(entry.getKey()); + spec.append("="); + spec.append(entry.getValue()); + comma = true; + } + return spec.toString(); + } + +} -- cgit v1.2.3