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

前言

《迷你微信》服务器中,我们用了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. 除了BAT,计算机、软件专业的毕业生还有别的好去处吗?

    "学技术的同学应该关注36氪.pingwest,极客公园这些圈子里很有影响力的科技媒体" 转载--除了BAT,计算机.软件专业的毕业生还有别的好去处吗? 又到校招季,985理工科的 ...

  2. 基于FPGA具有容错能理的异步串口程序设计

    首先,问题源于一个项目.本来是一个很简单的多个串口收发FIFO存取数据的小程序,通过电脑验证也可用,而下位机板子之间通信就出现了丢数问题. 经过分析原因如下: 我的串口收模块是基于特权同学的开发板程序 ...

  3. Other - 个人对知识讨论、分享等平台上抄袭乱象的看法

    在某论坛上看到这样一句话,深表赞同.

  4. 常见的web漏洞及其防范

    原文地址:http://blog.csdn.net/u013777676/article/details/52124298 一.SQL注入漏洞 SQL注入攻击(SQL Injection),简称注入攻 ...

  5. nkv客户端性能调优

    此文已由作者张洪箫授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 问题描述 随着考拉业务的增长和规模的扩大,很多的应用都开始重度依赖缓存服务,也就是杭研的nkv.但是在使用过 ...

  6. etcd代理组件的开发思想

    最近在一个项目中,需要使用到etcd集群来实现服务发现的功能,目的是统一管理相应的服务资源,同时也可对资源做一定的负载均衡策略.然而,项目中使用的技术栈是C++语言,github上没有合适的C++开源 ...

  7. bootstrap初学者模板

    <!doctype html> <html lang="en"> <head> <!-- Required meta tags --> ...

  8. php文件上传(视频图片或者其他)

    html页面 <html> <head> <meta charset="utf-8"> <title></title> ...

  9. c# 衍生类和基类的构造顺序

    public class MyDeriveClass :MyBaseClass { public MyDeriveClass() :base() { } int derive_int = 1; } p ...

  10. 洛谷P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...