Log4j2使用案例

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表示过滤器不接受也不拒绝该消息,其他过滤器可以进一步对它进行评估。

首先,在resouces目录下创建配置文件 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>
        <!--
            这里使用了滚动文件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 日志文件中的内容。
有问题欢迎留言指正。
代码地址:http://download.csdn.net/detail/ch717828/9152369







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值