我在类路径中有一个log4j2.xml配置文件.其中一个appender是File appender,我想在Java应用程序中的运行时设置目标文件名.
根据文档,我应该能够在log4j2.xml文件中使用双"$"和上下文前缀:
<appenders>
<File name="MyFile" fileName="$${sys:logFilename}">
<PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
Run Code Online (Sandbox Code Playgroud)
其中"sys"前缀表示Configurator将在系统属性中查找属性"logFilename".所以在应用程序中,我打电话(相当早):
System.setProperty("logFilename", filename);
Run Code Online (Sandbox Code Playgroud)
我还在xml文件中打开了log4j2的自动重新配置:
<configuration status="debug" monitorInterval="5">>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有任何效果,并且永远不会创建日志文件.一些log4j2状态输出如下:
2013-02-13 15:36:37,574 DEBUG在类org.apache.logging.log4j.core.appender.FileAppender上调用createAppender for element with params(fileName ="$ {sys:logFilename}",append ="null" ,locking ="null",name ="MyFile",immediateFlush ="null",suppressExceptions ="null",bufferedIO ="null",PatternLayout(% - 4r%d {yyyy-MM-dd/HH:mm:ss .SSS/zzz} [%t]%-5level%logger {36} - %msg%n),null)
2013-02-13 15:36:37,576 DEBUG启动FileManager $ {sys:logFilename}
如何在运行时设置File Appender中的"fileName"值? 或者,如何在运行时向根记录器添加新的File Appender?在Log4j 2.0中,大多数用于更改配置的API都是隐藏的.
我只是想知道是否有办法为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控制台中看到该属性,我重新启动了服务器,但我无法完成它.
我想做两件事:
控制台日志记录似乎工作得很好,但日志文件仍然是空的.
这是我的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>
<File name="MyFile" fileName="logs/app.log" immediateFlush="true">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
<loggers>
<logger name="filelogger" level="error">
<appender-ref ref="MyFile"/>
</logger>
<root level="info">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
Run Code Online (Sandbox Code Playgroud)
可能有什么问题?
我必须遗漏一些东西,但我现在已经看了几天了,但为什么你会在log4j上使用log4j2(性能除外)?
从我到目前为止看到的,log4j2被宣传为更简单的配置,但它实际上要复杂得多(现在已经三天了,我仍然无法在我的主目录中写日志).自动配置对我来说根本不起作用(或者至少我无法使其工作),配置文件本身在结构上要复杂得多,并且在运行时添加内容以帮助诊断变得更加困难.
所以除了性能之外还有什么理由使用log4j2而不是原始的log4j?
我一直在给新的Log4j2.从迁移文档中可以看出,XML Schema/DTD规范已被废除.
这似乎是倒退一步.当然应该可以将XML Schema或DTD与我联系起来,log4j2.xml以协助编写和验证.我无法在文档中找到任何有用的东西,也没有找到XML Schema或DTD本身.
那么:在Log4j2中,我应该如何将XML Schema与log4j2.xml?
是否可以使用XML配置中的规范以编程方式添加Log4J2 appender?
我打算在log4j2.xml中定义它,然后像这样选择appender(不会编译):
if (arg[0].equals("log") ) {
Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
//...
}
Run Code Online (Sandbox Code Playgroud) 我想从我的应用程序以编程方式加载Log4j2 XML配置文件.
试过这个:
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
Configurator.initialize(null, source);
Run Code Online (Sandbox Code Playgroud)
还有这个:
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source);
ConfigurationFactory.setConfigurationFactory(factory);
Run Code Online (Sandbox Code Playgroud)
但是没有任何效果.
嗨,我刚刚下载并配置了log4j-2.我坚持将颜色代码应用于SlowConsole控制台appender.我的控制台appender如下所示.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
</Console>
<Console name="SlowConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=black, DEBUG=green, TRACE=blue}"/>
</Console>
<File name="File" fileName="C:\log\out.txt">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n" />
</File>
</Appenders>
<Loggers>
<logger name="org.abc.ea.web" level="ALL" additivity="false">
<!--Log4j for the WEB MODULE -->
<appender-ref ref="SlowConsole"/>
</logger>
<logger name="org.abc.ea.ejb" level="ALL" additivity="false">
<!--Log4j for the EJB MODULE -->
<appender-ref ref="SlowConsole"/>
</logger>
<Root level="ERROR">
<AppenderRef ref="Console"/>
<AppenderRef ref="File" …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的新项目中采用Log4j2,但我得到了我的日志catalina.out,第一个始终是:ERROR StatusLogger Unable to locate a logging implementation, using SimpleLogger.看来我已根据Log4j2文档完成了所有工作,但仍然如此.
这是我实际做的:
log4j-api-2.0-beta3.jar到我的项目中log4j2.xml文件并将其放在类路径上的位置(当前,在/usr/local/tomcat/home/lib.实际上,我从Log4J2网页中获取了一个示例文件.我使用的是Tomcat 7,MacOS X 10.8,Java 7.
我错过了什么?
以防万一,这是我正在使用的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="MyFile"/>
</root>
</loggers>
</configuration>
我有应用程序,当我从maven log4j2运行时它正在工作:
mvn exec:java -Dexec.args=...
Run Code Online (Sandbox Code Playgroud)
但是当我将jar作为独立应用程序运行时,它会显示错误:
java -jar
Run Code Online (Sandbox Code Playgroud)
日志:
ERROR StatusLogger Unrecognized format specifier [d]
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [level]
ERROR StatusLogger Unrecognized conversion specifier [level] starting at position 35 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [logger]
ERROR StatusLogger Unrecognized conversion specifier [logger] starting at …Run Code Online (Sandbox Code Playgroud)