欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

前言

《迷你微信》服务器中,我们用了Log4J来进行输出,这可以在我们程序出现异常的时候找到错误发生时的上下文。然而吗,在项目的组件迭代过程中,我们发现,log出来的内容越来越多,往往在储蓄出现异常去查Log的时候,会被一大堆不相干的Log给淹没,这时,我们想:如果能够只输出我要的那部分岂不是很爽,这样就能快速的找到我们要的Log了,所以博主自己别编写了一个定制化输出的方法。

Log4J的Name

Log4J在创建时是需要设置名称的,可以把它理解成一个索引,以此在其他地方拿到它。

public class MyLogTest {
private Logger logger = Logger.getLogger(this.getClass().getSimpleName());
p
public void method_1(){
logger.info("abcdefg");
}
} public class Test_2 {
public Logger getMyLogger(String name){
return Logger.getLogger(name);
} }

上述MyLogTest类中,我们用类名创建了一个Log4J的Logger对象,在第二个类Test_2中,我们有一个getMyLogger方法,如果我们调用时传入的是MyLogTest的类名,则会返回MyLogTest中的那个Logger对象。

注:Logger.getLogger(name) 方法在以name命名对象不存在时,会创建一个新的返回,当已经被创建后调用则会返回之前创建过的那个Logger对象。

定制化Log输出

配置XML

想要做到定制化Log输出,我们需要有一个配置文件来设置哪些Logger输出,哪些不输出。

(详细源码请参考《迷你微信》服务器)

<?xml version=""1.0" encoding="UTF-8"?>
<LoggerRule>
<TypeContain>False</TypeContain>
<TypeList>
<ProtoHead logType="class">server.Server_User</ProtoHead>
</TypeList>
</LoggerRule>

先来解释一下上述代码所代表的意义:

  • LoggerRule : 代表Log规则的根,内不包含所有规则
  • TypeContain :参数为True时,代表包含,只输出列表中所述Logger的内容,Flase代表“除外”,即下面列表所述的Logger都不输出。
  • ProtoHead :每一个(不)要输出的条目(注:叫这个名字时历史遗留问题)

整体来说,就是在项目运行时,叫server.Server_User这个名字的Logger将被忽略输出。

编写读取类

private void readLogRule() {
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
InputStream is=new FileInputStream(LoggerXML);
Document doc=dombuilder.parse(is); Element root = doc.getDocumentElement(); // 获取根元素
String typeContain = root.getElementsByTagName("TypeContain").item(0).getFirstChild().getNodeValue().toString(); loggerRule = new LoggerRule(typeContain.equals("True") ? LoggerType.Contain
: LoggerType.Ignore); NodeList nodeList = root.getElementsByTagName("ProtoHead");
Node node1, node2;
NamedNodeMap namedNodeMap;
String nodeValue;
for (int i=0; i<nodeList.getLength(); i++) {
node1 = nodeList.item(i);
namedNodeMap = node1.getAttributes();
for (int j=0; j<namedNodeMap.getLength(); j++) {
node2 = namedNodeMap.item(j);
if (node2.getNodeName().equals("logType")) {
nodeValue = node1.getFirstChild().getNodeValue().toString();
if (node2.getNodeValue().equals("Network")) { // 显示服务器发了什么包的Log
loggerRule.loggerSet.add(ProtoHead.ENetworkMessage.valueOf(nodeValue));
} else if (node2.getNodeValue().equals("class")) {
loggerRule.logCalssList.add(nodeValue);
}
}
}
}
} catch (Exception e) {
logger.error("MyLogger : load " + LoggerXML + " file error!\n" + MyException.getStackStr(e.getStackTrace()));
}
} class LoggerRule {
public static enum LoggerType {
Contain, Ignore
}; public LoggerType loggerType;
HashSet<ProtoHead.ENetworkMessage> loggerSet;
public ArrayList<String> logCalssList; public LoggerRule(LoggerType loggerType) {
this.loggerType = loggerType;
loggerSet = new HashSet<ProtoHead.ENetworkMessage>();
logCalssList = new ArrayList<String>();
}
}

通过上面这个方法,我们从配置文件中读出了我们制定的输出规则,存储在一个ArrayList中,接着,只要进行以此遍历,将指定的Logger关掉即可:

public void closeLoggerNotWant(){
for (String className : loggerRule.logCalssList)
Logger.getLogger(className).setAdditivity(false);
}

优点

通过这种方式,我们实现了配置编程,在不修改项目源码的前提下,我们可以通过修改配置文件的方式来设置哪些Logger不惊醒输出。甚至,在对上述程序做一些修改后,可以动态的进行变化(如:定时读取XML),即可以在不重启整个进程的前提下修改输出设置。

欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:11.定制化Log输出的更多相关文章

  1. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...

  2. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...

  3. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...

  4. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议

    欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...

  5. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...

  6. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate

    目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...

  7. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...

  8. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...

  9. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...

随机推荐

  1. Coding CTO 孙宇聪:《人,技术与流程》

    我先做一下自我介绍,我是 07 年加入的 Google,在 Moutain View 总部任Google SRE,今年年初回国加入 Coding . 在 Google 我参与了两个 Project, ...

  2. Unity3D 脚本模板修改方法

    默认情况下,在Unity中创建C#脚本都会默认生成以下代码模板. using System.Collections; using System.Collections.Generic; using U ...

  3. IOHelper(自制常用的输入输出的帮助类)

    常用的读写文件,和地址转换(win和linux均支持),操作文件再也不是拼接那么的low了 using System; using System.Diagnostics; using System.I ...

  4. nginx配置同一域名下,共存2个nodejs项目

    项目背景: 1.官网需要改版,使用nodejs nuxt框架进行重构 2.官网改版没有全部完成.但需要上线首页 项目需求: 1.让首页内容显示为新项目 2.让老官网的内容可以被访问到(比如www.n. ...

  5. 【原创】谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字). 今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决. 其实热key问题说来也很简单,就是瞬间 ...

  6. Libvirt外部快照

    外部快照的创建 实验环境 CentOS 7 升级QEMU CentOS 7自带的qemu版本太低需要升级 $ sudo yum install -y gcc $ sudo yum install -y ...

  7. 最短路——弗洛伊德算法(floyd)

    模板: #include <bits/stdc++.h> using namespace std; ][]; int n,m,x,z,y; <<; int main() { c ...

  8. 点分治【bzoj1468】 Tree

    点分治[bzoj1468] Tree Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边 ...

  9. 2018年12月25&26日

    小结:昨天因为整理课件,调代码耗费了大量时间,所以没来得及整理作业,这两天主要做的题目是关于树链剖分和线段树的,难度大约都是省选难度,毕竟只要涉及到树链剖分难度就肯定不低. 一. 完成的题目: 洛谷P ...

  10. python依赖文件

    生成 pip freeze >requirements.txt 安装 pip install -r requirements.txt