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的理 ...
随机推荐
- DNA Evolution CodeForces - 828E(树状数组)
题中有两种操作,第一种把某个位置的字母修改,第二种操作查询与[L, R]内与给出字符串循环起来以后对应位置的字母相同的个数.给出的字符串最大长度是10. 用一个四维树状数组表示 cnt[ATCG的编号 ...
- [HEOI2015]小Z的房间(矩阵树定理学习笔记)
题目描述 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一 ...
- saltstack常用命令
Salt通过公钥加密和认证minions.想要让minion从master端接受命令,minions的密钥需要被master接受 salt-key -L #列出master上的密钥; salt-key ...
- [bzoj1692][队列变换]
题目链接 思路 首先肯定想到贪心,从队尾和队首取更小的那个. 但是如果遇到队尾和队首一样大的情况呢,总不能再挨个往前比较.所以就把整个字符串倒过来再挂到现在字符串的后面,也就是把当前字符串对称过去.然 ...
- System.Web.Optimization对脚本和样式表的压缩操作
1 是否允许样式表压缩 BundleTable.EnableOptimizations = true; 在MVC项目中的 BundleConfig操作中是微软已经给我们准备好的CSS和JS压缩,我们可 ...
- HTTPS笔记:使用 SSLEngine 为 aioserver 服务器提供 SSL 访问支持
现在 HTTPS 的普及率是越来越高,闲来无事,花了二三天时间,为五年前写的 aioserver 服务器提供了 SSL 访问支持. 查看网上资料,为了提高服务器的高并发,建议使用:SSLEngine ...
- 斯坦福大学公开课机器学习:machine learning system design | data for machine learning(数据量很大时,学习算法表现比较好的原理)
下图为四种不同算法应用在不同大小数据量时的表现,可以看出,随着数据量的增大,算法的表现趋于接近.即不管多么糟糕的算法,数据量非常大的时候,算法表现也可以很好. 数据量很大时,学习算法表现比较好的原理: ...
- Methods for follow-up research of exome analysis:外显子后续分析研究思路总结
外显子后续分析研究思路一般有以下几种(Methods for follow-up research of exome analysis): 1.对突变频率.突变类型.突变方式进行统计分析 Mutati ...
- pytest 2.测试用例setup和teardown
之前我写的unittest的setup和teardown,还有setupClass和teardownClass(需要配合@classmethod装饰器一起使用),接下来就介绍pytest的类似于这类的 ...
- 导出为word文档
原来用freemarker就可以,真是太简便了.先设计一张文档,然后把要输出的值用freemarker取值表达式获取数据,最后保存为ftl文件,再调整一下就可以了.