1.配置

默认 Log4j2可以将自己配置为记录错误及更高级别日志,并将消息记录到控制台中。

【显示配置】1.检测log4j.configurationFile系统属性,如果属性存在,就从指定文件加载。

2.在类路径上寻找名为log4j2-test.json或log4j2-test.jsn,如果存在,就加载。

3.在类路径上寻找名为log4j2-test.xml

4.在类路径上寻找log4j2.json或log4j2.jsn

5.在类路径上寻找log4j2.xml

优先使用-test理由,执行单元测试,这两个文件都在类路径上。

2.级别

OFF

FATAL

ERROR

WARN

INFO

DEBUG

TRACE

ALL

【定义自己的级别】

public final class CustomLevels{

  public static final Level CONFIG = Level.forName("CONFIG",350);

}

3.记录器或分类器

LogManager.getLogger  用完全限定类名  分类,不同类名的Logger可以设置不同级别。

4.日志存储器

……………………………………………………………………………………………………

【创建Log4j2配置文件】Log4j和Log42不兼容(XMLSchema、不接受properties配置)

1.适合测试环境的log4j2-test.xml

<!--默认status是OFF 没有显示配置直接写代码-->
<configuration status="WARN">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<!--root Logger Level默认是Error-->
<root level="debug">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>

Log4j本身是通过StatusLogger特殊Logger完成记录自己出问题消息,应对创建的Socket Appender无法连接目标服务器诸如这样的情况。

2.开发环境的log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--%logger用于输出类、方法、文件和日志消息 所在行号-->
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!--将日志输出到Tomcat logs 目录中-->
<RollingFile name="WroxFileAppender" fileName="../logs/application.log"
filePattern="../logs/application-%d{MM-dd-yyyy}-%i.log">
<PatternLayout>
<!--%X{id}这个叫鱼标签,是ThreadContext中的属性-->
<pattern>%d{HH:mm:ss.SSS} [%t] %X{id} %X{username} %-5level %c{36} %l: %msg%n</pattern>
</PatternLayout>
<Policies>
<!--每10MB作为管辖 滚动条件-->
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<!--保持不超过4个备份日志文件-->
<DefaultRolloverStrategy min="1" max="4" />
</RollingFile>
</appenders>
<loggers>
<root level="warn">
<appender-ref ref="Console" />
</root>
<!--com.wrox所有Logger 不可添加 additivity=false -->
<logger name="com.wrox" level="info" additivity="false">
<appender-ref ref="WroxFileAppender" />
<!--不继承Console Appender-->
<appender-ref ref="Console">
<!--在com.wrox层次的Logger只可以在包含了名为WROX_CONSOLES事件上将日志记录到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>

3.在任何日志框架中都应该【为请求使用鱼标签】,这样就可以将属于相同请求中的日志消息进行分组。

ThreadContext存储当前线程属性,同一线程记录所有事件,如果许多并发web请求在执行,为请求分配唯一的鱼标签可以帮助我们识别特定请求的所有相关信息。

【鱼标签】是唯一的,如UUID。ThreadContext可以存储任何有用于区别日志事件的信息 比如用户名。

//过滤器支持多个派发器,可以单个请求执行多次
@WebFilter(urlPatterns = "/*", dispatcherTypes = {
DispatcherType.REQUEST, DispatcherType.ERROR, DispatcherType.FORWARD,
DispatcherType.INCLUDE
})
public class LoggingFilter implements Filter
{
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
boolean clear = false;
//%X{id} %X{username}
if(!ThreadContext.containsKey("id"))
{
clear = true;
ThreadContext.put("id", UUID.randomUUID().toString());
HttpSession session = ((HttpServletRequest)request).getSession(false);
if(session != null)
ThreadContext.put("username",
(String)session.getAttribute("username"));
}
try
{
chain.doFilter(request, response);
}
finally
{
if(clear)
ThreadContext.clearAll();
}
}
}

4.在java代码使用Logger

@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;
}
}
}

5.在表现层记录日志(一般没有这个需求,表现层不应该有业务逻辑)

<%@ taglib prefix="log" uri="http://logging.apache.org/log4j/tld/log" %>
<log:entry />
<!DOCTYPE html>
<html>
<head>
<title>Test Logging</title>
</head>
<body>
<log:info message="JSP body displaying." />
Messages have been logged.
<log:info>JSP body complete.</log:info>
</body>
</html>
<log:exit />

Log4j2 快速开始的更多相关文章

  1. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

  2. spring boot+log4j2快速使用(一)

    log4j是Apache的一个开源项目,log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,他抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款 ...

  3. Log4j2常见使用示例及Syslog/Syslog-ng

    准备工作 打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本.解压后 ...

  4. 通过ELK快速搭建一个你可能需要的集中化日志平台

    在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4net就够了,随着应用的越来越多,日志散 落在各个服务器的logs文件夹下,确实有点不大方便,这个时候 ...

  5. Spring Boot 快速入门笔记

    Spirng boot笔记 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  6. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...

  7. slf4j+log4j2模式的日志搭建

    前言:今天打算为大家介绍一下我们我们在项目中必须得有的一个部分——日志!是的,就是那些让我们看着头疼的东西~~~好的日志可以帮助团队成员快速发现并解决问题,用好了可以大幅度提高代码缺陷修复效率!言归正 ...

  8. JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...

  9. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

随机推荐

  1. ORACLE报错和解决方案

    ORA-01034: ORACLE not available ORA-27101 出现ORA-01034和ORA-27101的原因是多方面的:主要是oracle当前的服务不可用,shared mem ...

  2. Windows下使用Diskpart格式化U盘

    步骤 进入Diskpartdiskpart 列出所有的磁盘list disk 选择磁盘select disk 清楚clean 创建主分区creat partition parimary 激活当前分区a ...

  3. [luogu3938][斐波那契]

    题目链接 思路 首先可以看出来每个月新增的兔子构成的斐波那契数列.然后每代兔子都可以用斐波那契数列中的一个数来表示.所以对于每只兔子都能在斐波那契数列中找到他所属的一个位置.因为每个兔子都是在两个月之 ...

  4. win10 python3.5 自动补全设置

    https://www.cnblogs.com/lgh344902118/p/8521437.html # python startup file import readline import rlc ...

  5. Day4--Python--列表增删改查,元组,range

    # 一.列表# 能装东西的东西 列表中装的数据是没有限制的,大小基本上够用# 列表用[]表示# 有索引和切片 [start,end,step] ###增删改查 (重点) # 1.新增 # appent ...

  6. Ubuntu的 g++ gcc版本升降级

    更改gcc默认版本(gcc版本降级/升级) ### 以降级到gcc-6为例 >* sudo apt install gcc-6 g++-6 >* sudo update-alternati ...

  7. C regex.h

    C也是存在正则表达式的 Linux下regex.h知识点和使用样例 上文中有一个样例代码,进行了测试 总结一下有些注意点: 1.上述代码的匹配子串很奇怪,为什么会出现 cnt= a very cnt= ...

  8. nginx搭建分布式简单配置

    1.下载安装nginx 2.编辑nginx.conf文件 upstream 172.100.10.52 { ip_hash; #保证每一个用户访问同一个网站 server 172.100.10.21: ...

  9. 考虑浏览器兼容的文件上传(IE8不支持FormData)

    方法一:使用FormData(因IE8不支持FormData, IE10才支持,因此此方法不兼容IE10以下的IE浏览器) 也可参考文章 http://www.jianshu.com/p/46e6e0 ...

  10. u-boot(一)启动简介

    目录 u-boot(一)启动简介 启动概述 内部存储布局 Bootloader概述 内核启动参数 taggedlist 体验一下实际的Uboot U-boot的使用帮助 U-boot基本要求 titl ...