maven下载Log4J2包
<!-- 日志-->
<!-- log4j-api提供了日志的api。
它是唯一需要添加到应用程序编译作用域的Log4j依赖,因为它只包含了用于编码的的类
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
<scope>compile</scope>
</dependency>
<!--
log4j-core包含了标准的Log4j 2实现,它是标准实现,不是API。API不要求任何配置
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<!--
log4j-jcl是一个支持Commons Logging API的适配器。该适配器将使用Log4j 2作为Commons Logging的实现
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<!--
log4j-slf4j-impl 是一个SLF4J实现适配器。该适配器使用Log4j 2作为SLF4J的实现
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<!--
log4j-taglib是一个在JSP页面中包含JSP标签库用于日志记录的适配器
-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-taglib</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
在Maven项目中,Commons Logging or SLF4JAPI 通常被赋予compile作用域,而它的实现将被赋予runtime作用域,从而完全避免了应用程序直接使用底层实现的情况。
配置Log4j2
Log4j 2实现完全是自配置的。最多只有一件事情是必须做的:在代码的日志语句中使用Log4j 2。默认,Log4j 2可以将自己配置为记录错误和更高级别的日志,并将消息记录到控制台中。只有下面所有定位显示配置的步骤都失败时,它才会这样做:
(1)检测log4j.configurationFile系统属性,如果属性存在,就从它指定的文件中加载配置。
(2)在类路径上寻找名为log4j2-test.json或者log4j2-test.jsn的文件,如果文件存在,就从该文件加载配置
(3)在类路径上寻找名为log4j2-test.xml的文件,如果文件存在,就从该文件加载配置。
(4)在类路径上寻找名为log4j2.json或者log4j2.jsn的文件,如果文件存在,就从该文件加载配置
(5)在类路径上寻找名为log4j2.xml的文件,如果文件存在,就从该文件加载配置。
Log4j2的级别
在org.apache.logging.log4j.Level类中,Log4j 2定义了6个日志级别和两个具有特殊含义的级别,类中按照优先级列出了这些级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL。注意OFF和ALL并非是在实际应用程序中会使用的级别;相反,需要将这些级别赋给一个特有的org.apache.logging.log4j.Logger或者org.apache.logging.log4j.core.Appender,OFF意味着“不记录任何消息”,而ALL意味着“记录所有消息” 。Level讲根据需要通过API暴露出来,但如何使用级别控制消息的记录是在具体实现中配置的。
Log4j2的过滤器
不要将Log4j 2过滤器与Servlet过滤器混淆,它提供了一种机制用于检查日志消息是否应该或者如何被输出。Filter执行的结果可以是ACCEPT、DENY或者NEUTRAL之一,正如网络防火墙一样。ACCEPT表示该消息应该被输出,所有其他的过滤器应该被忽略。DENY表示的意思完全相反:它意味着消息将立刻被拒绝,接下来的过滤器也没有机会再对消息进行评估。NEUTRAL表示过滤器不接受也不拒绝该消息,其他过滤器可以进一步对它进行评估。
例
<?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>
<!--
这里使用了滚动文件Appender将日志输出到Tomcat logs目录钟的application.log文件。
尽管Log4j 2有一个更简单的文件Appender用于输出日志到文件,但是该Appender在一种
或多种情况下可以自动滚动文件,例如日志达到了特定的大小、日期变化、应用程序启动或者
这几个情况的任意组合。在本例钟,Appender被设置为每当文件大小达到10MB时就滚动日志
文件,并保持不超过4个备份日志文件。
-->
<RollingFile name="WroxFileAppender" fileName="/Users/chenhong/Documents/apache-tomcat-8.0.26/logs/application.log"
filePattern="/Users/chenhong/Documents/apache-tomcat-8.0.26/logs/application-%d{MM-dd-yyyy}-%i.log" append="true">
<PatternLayout>
<pattern>%d{HH:mm:ss.SSS} [%t] %X{id} %X{username} %-5level %c{36} %l: %msg%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy min="1" max="4" />
</RollingFile>
</appenders>
<loggers>
<root level="warn">
<appender-ref ref="Console" />
</root>
<!-- servlet为包名-->
<logger name="servlet" level="info" additivity="false">
<appender-ref ref="WroxFileAppender" />
<appender-ref ref="Console">
<MarkerFilter marker="WROX_CONSOLE" onMatch="NEUTRAL"
onMismatch="DENY" />
</appender-ref>
</logger>
<logger name="org.apache" level="info">
<appender-ref ref="WroxFileAppender" />
</logger>
</loggers>
</configuration>
创建ActionServlet,该Servlet使用Log
package servlet;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.MarkerManager;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@WebServlet(name = "actionServlet", urlPatterns = "/files")
public class ActionServlet extends HttpServlet
{
private static final Logger log = LogManager.getLogger();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String action = request.getParameter("action");
if(action != null)
{
log.info("Received request with action {}.", action);
String contents = null;
switch(action)
{
case "readFoo":
contents = this.readFile("../foo.bar", true);
break;
case "readLicense":
contents = this.readFile("../LICENSE", false);
break;
default:
contents = "Bad action " + action + " specified.";
log.warn("Action {} not supported.", action);
}
if(contents != null)
response.getWriter().write(contents);
}
else
{
log.error("No action specified.");
response.getWriter().write("No action specified.");
}
}
protected String readFile(String fileName, boolean deleteWhenDone)
{
log.entry(fileName, deleteWhenDone);
try
{
byte[] data = Files.readAllBytes(new File(fileName).toPath());
log.info("Successfully read file {}.", fileName);
return log.exit(new String(data));
}
catch(IOException e)
{
log.error(MarkerManager.getMarker("WROX_CONSOLE"),
"Failed to read file {}.", fileName, e);
return null;
}
}
}
通过传入不同的action,查看控制台和Tomcat/logs/application.log 日志文件中的内容。