【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:11.定制化Log输出
前言
在《迷你微信》服务器中,我们用了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输出的更多相关文章
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议
欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate
目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...
随机推荐
- C++ STL 的各结构实现
C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓 ...
- linux c段错误分析方法
from:http://blog.csdn.net/adaptiver/article/details/37656507 一. 段错误原因分析 1 使用非法的指针,包括使用未经初始化及已经释放的指针( ...
- IOS 获取系统通讯录
进入正题 获取系统通讯录,不想多讲,留下链接http://my.oschina.net/joanfen/blog/140146 通常做法: 首先创建一个ABAddressBookRef类的对象add ...
- Sharepoint2013商务智能学习笔记之部署AdventureWorksDW2012数据库(三)
AdventureWorksDW2012是sql server2012的样本数据库,后面做商务智能Demo会用到,所以需要下载并安装到sql server2012上,下载地址 第一步,下载数据库 第二 ...
- C# 外观模式
外观模式(Facade Pattern) 介绍 定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.使用外观模式时,创建了一个统一的类,用来 ...
- CodeForces 137C【贪心+优先队列】
这种区间的贪心好像都出"烂"了? 不过还是想写一下... 先按照区间左端点排序一下,然后搞个优先队列维护当前最小的右端点. #include <bits/stdc++.h&g ...
- hortonworks docker 安装
1. 下载并解压安装脚本: Hortonworks Data Platform (HDP) for Docker 2. 进入到解压后的目录,运行下面的命令,{HDPversion} 需要替换成相应目 ...
- 清北刷题冲刺 10-31 p.m
数列 #include<iostream> #include<cstdio> using namespace std; long long a,b,ans; void f(lo ...
- 洛谷P1505 [国家集训队]旅游
题目描述 \(Ray\) 乐忠于旅游,这次他来到了\(T\) 城.\(T\) 城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,\(T ...
- 关于json_encode和json_decode
json_encode将数组或者对象编码成字符串json_deode将字符串解码称对象或者数组,第二个参数为true时解码成字符串,否则解码成对象
