From 6f537569d9d2c939e64140cfd7ba84f7b3e0c7a1 Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Wed, 3 Apr 2024 16:39:50 -0300 Subject: [PATCH 1/2] Updating log levels analyzer to allow usage of split without leaving a comment --- .../loglevels/LogLevelsAnalyzer.java | 10 +++-- .../loglevels/UseOneOfTheExpectedMethods.java | 32 ++++++++++++++++ .../analyzer/AnalyzerIntegrationTest.java | 6 +-- ...ingExpectedMethodsOnLogLevel.approved.txt} | 2 +- ...dMethodsOnLogLevelAndMessage.approved.txt} | 4 +- ...singExpectedMethodsOnMessage.approved.txt} | 2 +- .../NotUsingExpectedMethodsOnLogLevel.java | 27 ++++++++++++++ ...ngExpectedMethodsOnLogLevelAndMessage.java | 37 +++++++++++++++++++ ... => NotUsingExpectedMethodsOnMessage.java} | 13 ++++++- .../NotUsingSubstringOnBothMethods.java | 15 -------- .../NotUsingSubstringOnLogLevel.java | 15 -------- .../.meta/config.json | 0 .../expected_analysis.json | 2 +- .../expected_tags.json | 0 .../src/main/java/LogLevels.java | 23 ++++++++++++ .../src/main/java/LogLevels.java | 13 ------- 16 files changed, 146 insertions(+), 55 deletions(-) create mode 100644 src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java rename src/test/resources/analyzer/{AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnLogLevel.approved.txt => AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt} (73%) rename src/test/resources/analyzer/{AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnBothMethods.approved.txt => AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt} (67%) rename src/test/resources/analyzer/{AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnMessage.approved.txt => AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt} (73%) create mode 100644 src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevel.java create mode 100644 src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevelAndMessage.java rename src/test/resources/scenarios/log-levels/{NotUsingSubstringOnMessage.java => NotUsingExpectedMethodsOnMessage.java} (50%) delete mode 100644 src/test/resources/scenarios/log-levels/NotUsingSubstringOnBothMethods.java delete mode 100644 src/test/resources/scenarios/log-levels/NotUsingSubstringOnLogLevel.java rename tests/log-levels/{no-substring-used => no-expected_methods-used}/.meta/config.json (100%) rename tests/log-levels/{no-substring-used => no-expected_methods-used}/expected_analysis.json (77%) rename tests/log-levels/{no-substring-used => no-expected_methods-used}/expected_tags.json (100%) create mode 100644 tests/log-levels/no-expected_methods-used/src/main/java/LogLevels.java delete mode 100644 tests/log-levels/no-substring-used/src/main/java/LogLevels.java diff --git a/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java b/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java index cf30c11d..77d97c87 100644 --- a/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java +++ b/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java @@ -27,8 +27,8 @@ public class LogLevelsAnalyzer extends VoidVisitorAdapter imple private static final String REFORMAT = "reformat"; private static final String MESSAGE = "message"; private static final String LOG_LEVEL = "logLevel"; - private static final String SUBSTRING = "substring"; private static final String FORMAT = "format"; + private static List EXPECTED_METHODS = List.of("substring", "split"); @Override public void analyze(Solution solution, OutputCollector output) { @@ -48,8 +48,8 @@ public void visit(MethodDeclaration node, OutputCollector output) { return; } - if (!node.getNameAsString().equals(REFORMAT) && doesNotCallMethod(node, SUBSTRING)) { - output.addComment(new UseSubstringMethod(node.getNameAsString())); + if (!node.getNameAsString().equals(REFORMAT) && doesNotCallMethods(node, EXPECTED_METHODS)) { + output.addComment(new UseOneOfTheExpectedMethods(node.getNameAsString())); return; } @@ -81,6 +81,10 @@ private static boolean doesNotCallMethod(MethodDeclaration node, String otherMet return node.findAll(MethodCallExpr.class, x -> x.getNameAsString().contains(otherMethodName)).isEmpty(); } + private static boolean doesNotCallMethods(MethodDeclaration node, List allowedMethods) { + return allowedMethods.stream().allMatch(method -> doesNotCallMethod(node, method)); + } + private static boolean callsMethod(MethodDeclaration node, String otherMethodName) { return !node.findAll(MethodCallExpr.class, x -> x.getNameAsString().contains(otherMethodName)).isEmpty(); } diff --git a/src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java b/src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java new file mode 100644 index 00000000..02c7eb70 --- /dev/null +++ b/src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java @@ -0,0 +1,32 @@ +package analyzer.exercises.loglevels; + +import java.util.Map; + +import analyzer.Comment; + +/** + * @see Markdown Template + */ +class UseOneOfTheExpectedMethods extends Comment { + private final String inMethod; + + public UseOneOfTheExpectedMethods(String inMethod) { + this.inMethod = inMethod; + } + + @Override + public String getKey() { + return "java.log-levels.use_one_of_the_expected_methods"; + } + + @Override + public Map getParameters() { + return Map.of( + "inMethod", this.inMethod); + } + + @Override + public Type getType() { + return Type.ACTIONABLE; + } +} diff --git a/src/test/java/analyzer/AnalyzerIntegrationTest.java b/src/test/java/analyzer/AnalyzerIntegrationTest.java index 110d0592..26315c72 100644 --- a/src/test/java/analyzer/AnalyzerIntegrationTest.java +++ b/src/test/java/analyzer/AnalyzerIntegrationTest.java @@ -138,9 +138,9 @@ void needforspeed(String scenario) throws IOException { "NoReuseLogLevel", "NoReuseMessage", "NoReuseOfBothMethods", - "NotUsingSubstringOnLogLevel", - "NotUsingSubstringOnMessage", - "NotUsingSubstringOnBothMethods", + "NotUsingExpectedMethodsOnLogLevel", + "NotUsingExpectedMethodsOnMessage", + "NotUsingExpectedMethodsOnLogLevelAndMessage", "UsingStringFormat" }) void loglevels(String scenario) throws IOException { diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnLogLevel.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt similarity index 73% rename from src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnLogLevel.approved.txt rename to src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt index 05a6be7d..5b828a58 100644 --- a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnLogLevel.approved.txt +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt @@ -1,7 +1,7 @@ { "comments": [ { - "comment": "java.log-levels.use_substring_method_v2", + "comment": "java.log-levels.use_one_of_the_expected_methods", "params": { "inMethod": "logLevel" }, diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnBothMethods.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt similarity index 67% rename from src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnBothMethods.approved.txt rename to src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt index e5081148..8534be2b 100644 --- a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnBothMethods.approved.txt +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt @@ -1,14 +1,14 @@ { "comments": [ { - "comment": "java.log-levels.use_substring_method_v2", + "comment": "java.log-levels.use_one_of_the_expected_methods", "params": { "inMethod": "message" }, "type": "actionable" }, { - "comment": "java.log-levels.use_substring_method_v2", + "comment": "java.log-levels.use_one_of_the_expected_methods", "params": { "inMethod": "logLevel" }, diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnMessage.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt similarity index 73% rename from src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnMessage.approved.txt rename to src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt index fdc7e811..77a631ed 100644 --- a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingSubstringOnMessage.approved.txt +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt @@ -1,7 +1,7 @@ { "comments": [ { - "comment": "java.log-levels.use_substring_method_v2", + "comment": "java.log-levels.use_one_of_the_expected_methods", "params": { "inMethod": "message" }, diff --git a/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevel.java b/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevel.java new file mode 100644 index 00000000..0ade71b3 --- /dev/null +++ b/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevel.java @@ -0,0 +1,27 @@ +package scenarios.loglevels; + +public class LogLevels { + + public static String message(String logLine) { + return logLine.substring(logLine.indexOf(":") + 1).trim(); + } + + public static String logLevel(String logLine) { + int closingBracketIndex = logLine.indexOf("]"); + if (closingBracketIndex == -1) { + return logLine.toLowerCase(); + } + + StringBuilder levelBuilder = new StringBuilder(); + for (int i = 0; i <= closingBracketIndex; i++) { + levelBuilder.append(logLine.charAt(i)); + } + + return levelBuilder.toString().replace("[", "").replace("]", "").toLowerCase(); + } + + + public static String reformat(String logLine) { + return message(logLine) + " (" + logLevel(logLine) + ")"; + } +} diff --git a/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevelAndMessage.java b/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevelAndMessage.java new file mode 100644 index 00000000..56022d69 --- /dev/null +++ b/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnLogLevelAndMessage.java @@ -0,0 +1,37 @@ +package scenarios.loglevels; + +public class LogLevels { + + public static String message(String logLine) { + int colonIndex = logLine.indexOf("]: "); + if (colonIndex == -1) { + return logLine; + } + + StringBuilder messageBuilder = new StringBuilder(); + for (int i = colonIndex + 3; i < logLine.length(); i++) { + messageBuilder.append(logLine.charAt(i)); + } + + return messageBuilder.toString().trim(); + } + + public static String logLevel(String logLine) { + int closingBracketIndex = logLine.indexOf("]"); + if (closingBracketIndex == -1) { + return logLine.toLowerCase(); + } + + StringBuilder levelBuilder = new StringBuilder(); + for (int i = 0; i <= closingBracketIndex; i++) { + levelBuilder.append(logLine.charAt(i)); + } + + return levelBuilder.toString().replace("[", "").replace("]", "").toLowerCase(); + } + + + public static String reformat(String logLine) { + return message(logLine) + " (" + logLevel(logLine) + ")"; + } +} diff --git a/src/test/resources/scenarios/log-levels/NotUsingSubstringOnMessage.java b/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnMessage.java similarity index 50% rename from src/test/resources/scenarios/log-levels/NotUsingSubstringOnMessage.java rename to src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnMessage.java index 79ae75cc..fdbf0ed8 100644 --- a/src/test/resources/scenarios/log-levels/NotUsingSubstringOnMessage.java +++ b/src/test/resources/scenarios/log-levels/NotUsingExpectedMethodsOnMessage.java @@ -1,8 +1,19 @@ package scenarios.loglevels; public class LogLevels { + public static String message(String logLine) { - return logLine.split("]: ")[1].trim(); + int colonIndex = logLine.indexOf("]: "); + if (colonIndex == -1) { + return logLine; + } + + StringBuilder messageBuilder = new StringBuilder(); + for (int i = colonIndex + 3; i < logLine.length(); i++) { + messageBuilder.append(logLine.charAt(i)); + } + + return messageBuilder.toString().trim(); } public static String logLevel(String logLine) { diff --git a/src/test/resources/scenarios/log-levels/NotUsingSubstringOnBothMethods.java b/src/test/resources/scenarios/log-levels/NotUsingSubstringOnBothMethods.java deleted file mode 100644 index 987a15cb..00000000 --- a/src/test/resources/scenarios/log-levels/NotUsingSubstringOnBothMethods.java +++ /dev/null @@ -1,15 +0,0 @@ -package scenarios.loglevels; - -public class LogLevels { - public static String message(String logLine) { - return logLine.split("]: ")[1].trim(); - } - - public static String logLevel(String logLine) { - return logLine.split("]: ")[0].replace("[", "").toLowerCase(); - } - - public static String reformat(String logLine) { - return message(logLine) + " (" + logLevel(logLine) + ")"; - } -} diff --git a/src/test/resources/scenarios/log-levels/NotUsingSubstringOnLogLevel.java b/src/test/resources/scenarios/log-levels/NotUsingSubstringOnLogLevel.java deleted file mode 100644 index c66e22dc..00000000 --- a/src/test/resources/scenarios/log-levels/NotUsingSubstringOnLogLevel.java +++ /dev/null @@ -1,15 +0,0 @@ -package scenarios.loglevels; - -public class LogLevels { - public static String message(String logLine) { - return logLine.substring(logLine.indexOf(":") + 1).trim(); - } - - public static String logLevel(String logLine) { - return logLine.split("]: ")[0].replace("[", "").toLowerCase(); - } - - public static String reformat(String logLine) { - return message(logLine) + " (" + logLevel(logLine) + ")"; - } -} diff --git a/tests/log-levels/no-substring-used/.meta/config.json b/tests/log-levels/no-expected_methods-used/.meta/config.json similarity index 100% rename from tests/log-levels/no-substring-used/.meta/config.json rename to tests/log-levels/no-expected_methods-used/.meta/config.json diff --git a/tests/log-levels/no-substring-used/expected_analysis.json b/tests/log-levels/no-expected_methods-used/expected_analysis.json similarity index 77% rename from tests/log-levels/no-substring-used/expected_analysis.json rename to tests/log-levels/no-expected_methods-used/expected_analysis.json index 307a4bf8..3f3f3ad7 100644 --- a/tests/log-levels/no-substring-used/expected_analysis.json +++ b/tests/log-levels/no-expected_methods-used/expected_analysis.json @@ -1,7 +1,7 @@ { "comments": [ { - "comment": "java.log-levels.use_substring_method_v2", + "comment": "java.log-levels.use_one_of_the_expected_methods", "params": { "inMethod": "message" }, diff --git a/tests/log-levels/no-substring-used/expected_tags.json b/tests/log-levels/no-expected_methods-used/expected_tags.json similarity index 100% rename from tests/log-levels/no-substring-used/expected_tags.json rename to tests/log-levels/no-expected_methods-used/expected_tags.json diff --git a/tests/log-levels/no-expected_methods-used/src/main/java/LogLevels.java b/tests/log-levels/no-expected_methods-used/src/main/java/LogLevels.java new file mode 100644 index 00000000..6c465587 --- /dev/null +++ b/tests/log-levels/no-expected_methods-used/src/main/java/LogLevels.java @@ -0,0 +1,23 @@ +class LogLevels { + public static String message(String logLine) { + int colonIndex = logLine.indexOf("]: "); + if (colonIndex == -1) { + return logLine; + } + + StringBuilder messageBuilder = new StringBuilder(); + for (int i = colonIndex + 3; i < logLine.length(); i++) { + messageBuilder.append(logLine.charAt(i)); + } + + return messageBuilder.toString().trim(); + } + + public static String logLevel(String logLine) { + return logLine.substring(1, logLine.indexOf("]")).toLowerCase(); + } + + public static String reformat(String logLine) { + return message(logLine) + " (" + logLevel(logLine) + ")"; + } +} diff --git a/tests/log-levels/no-substring-used/src/main/java/LogLevels.java b/tests/log-levels/no-substring-used/src/main/java/LogLevels.java deleted file mode 100644 index 8cf407b0..00000000 --- a/tests/log-levels/no-substring-used/src/main/java/LogLevels.java +++ /dev/null @@ -1,13 +0,0 @@ -class LogLevels { - public static String message(String logLine) { - return logLine.split("]: ")[1].trim(); - } - - public static String logLevel(String logLine) { - return logLine.substring(1, logLine.indexOf("]")).toLowerCase(); - } - - public static String reformat(String logLine) { - return message(logLine) + " (" + logLevel(logLine) + ")"; - } -} From ef29deec40891a589b3205ef6dc36beb53a579a1 Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Thu, 4 Apr 2024 10:19:57 -0300 Subject: [PATCH 2/2] Leaving a comment to use substring when detecting that neither split or substring have been used --- .../loglevels/LogLevelsAnalyzer.java | 2 +- .../loglevels/UseOneOfTheExpectedMethods.java | 32 ------------------- ...singExpectedMethodsOnLogLevel.approved.txt | 2 +- ...edMethodsOnLogLevelAndMessage.approved.txt | 4 +-- ...UsingExpectedMethodsOnMessage.approved.txt | 2 +- .../expected_analysis.json | 2 +- 6 files changed, 6 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java diff --git a/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java b/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java index 77d97c87..4ba1fd6f 100644 --- a/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java +++ b/src/main/java/analyzer/exercises/loglevels/LogLevelsAnalyzer.java @@ -49,7 +49,7 @@ public void visit(MethodDeclaration node, OutputCollector output) { } if (!node.getNameAsString().equals(REFORMAT) && doesNotCallMethods(node, EXPECTED_METHODS)) { - output.addComment(new UseOneOfTheExpectedMethods(node.getNameAsString())); + output.addComment(new UseSubstringMethod(node.getNameAsString())); return; } diff --git a/src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java b/src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java deleted file mode 100644 index 02c7eb70..00000000 --- a/src/main/java/analyzer/exercises/loglevels/UseOneOfTheExpectedMethods.java +++ /dev/null @@ -1,32 +0,0 @@ -package analyzer.exercises.loglevels; - -import java.util.Map; - -import analyzer.Comment; - -/** - * @see Markdown Template - */ -class UseOneOfTheExpectedMethods extends Comment { - private final String inMethod; - - public UseOneOfTheExpectedMethods(String inMethod) { - this.inMethod = inMethod; - } - - @Override - public String getKey() { - return "java.log-levels.use_one_of_the_expected_methods"; - } - - @Override - public Map getParameters() { - return Map.of( - "inMethod", this.inMethod); - } - - @Override - public Type getType() { - return Type.ACTIONABLE; - } -} diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt index 5b828a58..05a6be7d 100644 --- a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevel.approved.txt @@ -1,7 +1,7 @@ { "comments": [ { - "comment": "java.log-levels.use_one_of_the_expected_methods", + "comment": "java.log-levels.use_substring_method_v2", "params": { "inMethod": "logLevel" }, diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt index 8534be2b..e5081148 100644 --- a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnLogLevelAndMessage.approved.txt @@ -1,14 +1,14 @@ { "comments": [ { - "comment": "java.log-levels.use_one_of_the_expected_methods", + "comment": "java.log-levels.use_substring_method_v2", "params": { "inMethod": "message" }, "type": "actionable" }, { - "comment": "java.log-levels.use_one_of_the_expected_methods", + "comment": "java.log-levels.use_substring_method_v2", "params": { "inMethod": "logLevel" }, diff --git a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt index 77a631ed..fdc7e811 100644 --- a/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt +++ b/src/test/resources/analyzer/AnalyzerIntegrationTest.loglevels.NotUsingExpectedMethodsOnMessage.approved.txt @@ -1,7 +1,7 @@ { "comments": [ { - "comment": "java.log-levels.use_one_of_the_expected_methods", + "comment": "java.log-levels.use_substring_method_v2", "params": { "inMethod": "message" }, diff --git a/tests/log-levels/no-expected_methods-used/expected_analysis.json b/tests/log-levels/no-expected_methods-used/expected_analysis.json index 3f3f3ad7..307a4bf8 100644 --- a/tests/log-levels/no-expected_methods-used/expected_analysis.json +++ b/tests/log-levels/no-expected_methods-used/expected_analysis.json @@ -1,7 +1,7 @@ { "comments": [ { - "comment": "java.log-levels.use_one_of_the_expected_methods", + "comment": "java.log-levels.use_substring_method_v2", "params": { "inMethod": "message" },