log4j2 在测试时写入文件,而不是在部署时
log4j2 writing in file when testing, not when deploying
我正在使用 jax-rs 构建 Web 服务,并希望在调用 url 时记录一些内容。我发现了 log4j 2 并决定使用它。
我不知道为什么,但是当我做一些测试时它会起作用
Response response = target("user/v1/"+alfred.getPseudo()).request().get();
assertTrue(response.getStatus() < 300);
这会将日志字符串放入 logs/logs.log(我喜欢日志)。
然而,当我部署(使用 glassfish 4.1.1)时,当我调用相同的 URL.
时,它不会在文件中写入一个字符
这是我的 log4j2.xml
(位于 src/main/resources):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<File name="File" fileName="logs/logs.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
我的 web.xml
是空的:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
我的 pom.xml.
中有 lo4j-api 和 log4j-core,都是 2.5
最后,这是代码:
private final static Logger logger = LogManager.getLogger(MyClass.class);
我只是调用 logger.info(String)
和 logger.error(String)
.
我哪里做错了,我应该怎么做才能在部署时创建日志?
谢谢。
编辑: 也许这会有所帮助。我以前
<File name="File" fileName="logs/logs.log" bufferedIO="false">
我在测试的时候,有一个警告"Hey, you set bufferedIO to false but the default buffer size is 8192, wtf"。当我在实际部署期间调用 url 时,会显示此警告。我想这意味着我的配置在部署时也被检测到了。
我想你需要在 web.xml
中告知位置。
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>WEB-INF/classes/log4j2.xml</param-value>
</context-param>
请检查 log4j2.xml
位置的部署并相应地更改 param-value
。
但建议在WAR级别使用log4j2.xml
。所以很容易找到和改变。
好的,所以我明白了我的错误:
我试图将文件写入应用程序的目录中。
已更改
<File name="File" fileName="logs/logs.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %c{1} - %msg%n"/>
</File>
到
<File name="File" fileName="c:/logs.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %c{1} - %msg%n"/>
</File>
而且有效!
我正在使用 jax-rs 构建 Web 服务,并希望在调用 url 时记录一些内容。我发现了 log4j 2 并决定使用它。 我不知道为什么,但是当我做一些测试时它会起作用
Response response = target("user/v1/"+alfred.getPseudo()).request().get();
assertTrue(response.getStatus() < 300);
这会将日志字符串放入 logs/logs.log(我喜欢日志)。 然而,当我部署(使用 glassfish 4.1.1)时,当我调用相同的 URL.
时,它不会在文件中写入一个字符这是我的 log4j2.xml
(位于 src/main/resources):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<File name="File" fileName="logs/logs.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
我的 web.xml
是空的:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
我的 pom.xml.
中有 lo4j-api 和 log4j-core,都是 2.5最后,这是代码:
private final static Logger logger = LogManager.getLogger(MyClass.class);
我只是调用 logger.info(String)
和 logger.error(String)
.
我哪里做错了,我应该怎么做才能在部署时创建日志?
谢谢。
编辑: 也许这会有所帮助。我以前
<File name="File" fileName="logs/logs.log" bufferedIO="false">
我在测试的时候,有一个警告"Hey, you set bufferedIO to false but the default buffer size is 8192, wtf"。当我在实际部署期间调用 url 时,会显示此警告。我想这意味着我的配置在部署时也被检测到了。
我想你需要在 web.xml
中告知位置。
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>WEB-INF/classes/log4j2.xml</param-value>
</context-param>
请检查 log4j2.xml
位置的部署并相应地更改 param-value
。
但建议在WAR级别使用log4j2.xml
。所以很容易找到和改变。
好的,所以我明白了我的错误:
我试图将文件写入应用程序的目录中。 已更改
<File name="File" fileName="logs/logs.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %c{1} - %msg%n"/>
</File>
到
<File name="File" fileName="c:/logs.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %c{1} - %msg%n"/>
</File>
而且有效!