Log4j2 快速开始
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 快速开始的更多相关文章
- ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例
前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...
- spring boot+log4j2快速使用(一)
log4j是Apache的一个开源项目,log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,他抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款 ...
- Log4j2常见使用示例及Syslog/Syslog-ng
准备工作 打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本.解压后 ...
- 通过ELK快速搭建一个你可能需要的集中化日志平台
在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4net就够了,随着应用的越来越多,日志散 落在各个服务器的logs文件夹下,确实有点不大方便,这个时候 ...
- Spring Boot 快速入门笔记
Spirng boot笔记 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...
- Spring Boot 2.0 的快速入门(图文教程)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...
- slf4j+log4j2模式的日志搭建
前言:今天打算为大家介绍一下我们我们在项目中必须得有的一个部分——日志!是的,就是那些让我们看着头疼的东西~~~好的日志可以帮助团队成员快速发现并解决问题,用好了可以大幅度提高代码缺陷修复效率!言归正 ...
- JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构
一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...
- 浅谈Log4j2日志框架及使用
目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...
随机推荐
- Visible Trees HDU - 2841(容斥)
对于已经满足条件的(x1,y1),不满足条件的点就是(n*x1,n*y1),所以要求的就是满足点(x,y)的x,y互质,也就是gcd(x,y) == 1,然后就可以用之前多校的方法来做了 另f[i] ...
- hdu 2609 How many(最小表示法)
Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than ...
- LOJ#2720 你的名字
题意:给定母串s和若干个询问.每个询问是一个串t和两个数l,r,表示求t中有多少个本质不同的子串没有在s[l,r]中出现过. 解:我写的并不是正解......是个毒瘤做法.只在loj上面卡时过了就写l ...
- CF954F Runner's Problem(DP+矩阵快速幂优化)
这题是一年前某场我参加过的Education Round codeforces的F题,当时我显然是不会的. 现在看看感觉应该是能做出的. 不扯了写题解: 考虑朴素的DP,在不存在障碍的情况下:f[i] ...
- Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)
Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...
- 怎样删除windows server back 备份副本文件
我用的服务器是windows server 2012 下面说明 第一步:打开windows powershell 第二步:输入命令 DISKSHADOW 第二步:输入 delete shadows ...
- (string 数组) leetcode 804. Unique Morse Code Words
International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...
- redis主从复制配置(1)
我们来配置一个一主两从的服务,根据前面写的已经配置好的redis基础上进行主从配置 一:进入redis的配置目录 cd /usr/local/redis 创建下面3个目录,命令为:make -p /u ...
- Python网络编程之socket编程
什么是Socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...
- sys用户的操作
oracle中查找某个表属于哪个用户? select owner from dba_tables where table_name=upper('t_l_tradelist' ) 1 ...