如何支持所有(或部分)命令和子命令的共享选项?例如,如果最终用户--stacktrace在命令行参数中的任何位置提供,则打印的任何错误都将包括堆栈跟踪。
我们可以使用 Mixin 定义布尔--stacktrace选项,并在所有(子)命令中包含此 Mixin,或者使用继承并让所有命令子类化定义布尔选项的类--stacktrace,但无论哪种方式,都会为每个命令。哪个选项为 true 取决于用户在 args 中放置的位置--stacktrace,因此确定是否--stacktrace提供了意味着迭代所有父命令并查看是否有任何为 true。
如果有一种更方便的方法来检测用户是否指定了这样的共享选项,那就太好了。
Log4j 2 允许将类和行信息包含在日志条目中。然而,作者声称创建条目需要 4-5 倍的时间。
我的日志的 99.5% 由正常操作条目(信息)组成,其中 line 和 class 并不是真正必要的。我想知道是否有任何方法可以将 log4j 2 配置为仅将文件、类和行包含到带有“警告”或更高级别的条目中?
最近,我尝试了Log4j 2日志记录,并尝试将其性能与我本地Mac机器上的Logback进行比较.令人惊讶的是,我看到Logback在我的测试用例中表现更好.我希望Log4j 2比Log4j 2网站声称的Logback做得更好,所以我想检查一下我在使用Log4j 2时是否做错了.
为了测试,我使用了直接Log4j 2和Logback 而不使用SLF4J.此外,它ConsoleAppender用于两个日志框架,我测试的模式是:
<Pattern>%d{YYYY-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
Run Code Online (Sandbox Code Playgroud)
日志测试代码是:
logger.info("This is a bootstrap message");
long start = System.currentTimeMillis();
for (int i = 1; i <= 1000000; i++) {
logger.info("Order={} successfully processed", "ABC123");
}
long end = System.currentTimeMillis();
logger.info("time taken to process={} ms", end - start);
Run Code Online (Sandbox Code Playgroud)
我为每个日志记录分别运行了10次测试,并尝试将平均时间用于处理.出乎意料的是,每次运行都会更好地执行logback.我尝试使用params禁用Log4j 2附带的默认GC日志记录:
-Dlog4j2.enable.threadlocals=false -Dlog4j2.enable.direct.encoders=false
Run Code Online (Sandbox Code Playgroud)
但我仍然没有看到有关logback的任何改进.任何人都可以确认我做的是否正确?
log4j 2配置:
<Configuration status="INFO" debug="false">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders> …Run Code Online (Sandbox Code Playgroud) 我使用log4j 2.9
我在 log4j2.xml 中配置了文件附加程序。
例如 :
all_log_appender, device_appender, sql_appender
Run Code Online (Sandbox Code Playgroud)
所有附加程序都登录不同的文件。
在运行时选择我的附加程序以便决定在哪里(在哪个文件中)记录的正确方法是什么?
老实说,我在文档中找不到示例。我还尝试扩展 Logger 类,但据我了解, 扩展 log4j2 记录器类是不正确的,因为“某些布局要求 Log4j 遍历堆栈跟踪以报告记录器代码中的哪个类和行被调用”
我找不到任何如何在运行时选择附加程序的示例。
你能给我一个简单的例子吗?
尝试运行 JUnit 测试错误时,测试将无法正确运行
package picocli;
import picocli.CommandLine.Option;
public class ComparatorRunnerConfig {
@Option(names = {"-rc", "--report-class"}, required = false,
description = "define report")
private String report;
public String getReport() {
return report;
}
}
Run Code Online (Sandbox Code Playgroud)
我的 JUnit 测试:
package picocli;
import static org.junit.Assert.*;
import org.junit.Test;
public class ConfigurationTest {
@Test
public void testBasicConfigOptions() {
String args = "-rc BlahBlah";
ComparatorRunnerConfig mfc = new ComparatorRunnerConfig();
new CommandLine(mfc).parse(args);
String myTestValue = mfc.getReport();
assertEquals(myTestValue, "BlahBlah");
}
}
Run Code Online (Sandbox Code Playgroud)
测试失败。