在Java中解析命令行参数的好方法是什么?
我无法决定是否使用slf4j与log4j2.基于在线帖子,看起来不会有任何性能影响,但它确实是必需的.
这些点也有利于log4j2:
我刚刚完成了log4j2.xml配置文件的调整,发现了一些我不太懂的东西.那是什么<Configuration status="SOME_STATUS_HERE">?
几乎在这里的所有示例中: 来自Apache的http://logging.apache.org/log4j/2.x/manual/configuration.html人员将状态添加到配置中.
例如,这是第一个:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"> <!--status="WARN" - what is this???-->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud) 我只是想知道是否有办法为LOG4J中的属性替换提供默认值?
我想在java系统属性中传递文件路径,然后将其与"$ {env:mySystemProperty}"一起使用.但是如果开发人员忘记设置此属性呢?然后我想在log4j2.xml中定义一些有意义的默认值.
知道如何实现这个功能吗?
编辑:
env替换对我不起作用:
standalone.conf
-DoauthLoginLogPath=/path/oauth2.log
Run Code Online (Sandbox Code Playgroud)
log44j2.xml
<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true">
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true">
Run Code Online (Sandbox Code Playgroud)
我可以在wildfly控制台中看到该属性,我重新启动了服务器,但我无法完成它.
我需要用Java编写一个简单的命令行应用程序.使用一个负责解析命令的库并处理标志和可选/强制参数之类的事情会很好.
UPDATE
内置TAB完成的东西会特别棒.
我必须遗漏一些东西,但我现在已经看了几天了,但为什么你会在log4j上使用log4j2(性能除外)?
从我到目前为止看到的,log4j2被宣传为更简单的配置,但它实际上要复杂得多(现在已经三天了,我仍然无法在我的主目录中写日志).自动配置对我来说根本不起作用(或者至少我无法使其工作),配置文件本身在结构上要复杂得多,并且在运行时添加内容以帮助诊断变得更加困难.
所以除了性能之外还有什么理由使用log4j2而不是原始的log4j?
我RollingRandomAccessFileAppender只配置了一个OnStartupTriggeringPolicyset,但是当我将max属性设置DefaultRolloverStrategy为某个数字时,日志会无限期地生成超过该数量.
这是我的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingRandomAccessFile
name="RollingRAF"
fileName="logs/app.log"
filePattern="logs/app-%d{dd-MMM-yyyy@HH.mm.ss}.log">
<PatternLayout>
<Pattern>%d %p %c{1.} %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Logger name="myLogger" level="warn">
<AppenderRef ref="RollingRAF"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
是因为我的名字模式中没有迭代器吗?
是因为我的文件名精度设置为秒?
是因为我只有OnStartupTriggeringPolicy这套?
或者这里发生了什么?
我的目标是设置滚动配置,记录最近5次应用程序运行.
我有一个使用log4j2编写的新应用程序,以利用它的一些新功能.它使用的其中一个库有点旧,用log4j 1.x构建.我遇到一个问题,即应用程序中的新代码写入日志,但旧库中的代码不会写入日志.我甚至有一个类是旧库中某个东西的子类,也是旧库中的代码调用,这个代码也不会写入日志.我已将应用程序配置为使用log4j2版本2.0.2,并且在将旧库引用为maven依赖项时明确排除了log4j.
如何让旧库中的代码登录到与我的新代码相同的文件中?
重写旧库应该被认为是最后的选择
我已将我的应用程序迁移到log4j 2,并且我已通过log4j2.xml进行了配置
但是,我使用的一些库依赖于log4j 1.如果我使用以下命令运行应用程序:
-Dlog4j.configurationFile=path/to/log4j2.xml
Run Code Online (Sandbox Code Playgroud)
log4j 1抱怨找不到配置文件.我正在使用log4j 2,log4j-1.2-api-2.0-rc1.jar提供的log4j 1.x桥.是否可以使用单个log4j2.xml进行配置?
我尝试过的另一种方法是将log4j和log4j2配置在一起:
-Dlog4j.configurationFile=path/to/log4j2.xml -Dlog4j.configuration=path/to/log4j.xml
Run Code Online (Sandbox Code Playgroud)
我担心的是我的日志配置文件和输出的碎片.我也担心log4j.xml和log4j2.xml之间可能存在冲突.例如,logfile error.log配置为使用log4j 1中的FileAppender和log4j 2中的RollingFileAppender.
有什么建议?
[注意]
这是我看到的错误:
log4j:WARN No appenders could be found for logger (org.apache.activemq.util.ThreadPoolUtils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Run Code Online (Sandbox Code Playgroud)
我正在使用的log4j 2的版本是log4j 2.0 rc1.
[回答]
似乎activemq-5.8.0.jar与log4j 1捆绑在一起.解决方案只是在activemq之前加载log4j 1.x桥.
java ×10
log4j2 ×7
logging ×7
log4j ×6
command-line ×3
picocli ×3
interactive ×1
shell ×1
slf4j ×1