package server; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.InputStream; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.apache.mina.core.session.IoSession; import org.apache.mina.core.write.WriteRequest; import org.apache.mina.filter.logging.LoggingFilter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import exception.MyException; import protocol.ProtoHead; import server.LoggerRule.LoggerType; import tools.DataTypeTranslater; public class MyLogger extends LoggingFilter { private Logger logger = Logger.getLogger(this.getClass()); private ServerModel serverModel; public static final String LoggerXML = "LoggerRule.xml"; private LoggerRule loggerRule; public MyLogger(){ readLogRule(); } public void closeLoggerNotWant(){ for (String className : loggerRule.logCalssList) Logger.getLogger(className).setAdditivity(false); } public ServerModel getServerModel() { return serverModel; } public void setServerModel(ServerModel serverModel) { this.serverModel = serverModel; } // @Override // public void messageReceived(NextFilter nextFilter, IoSession session, // Object message) throws Exception { // // TODO Auto-generated method stub // super.messageReceived(nextFilter, session, message); // } @Override public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { super.messageSent(nextFilter, session, writeRequest); showPacket(session, writeRequest); } /** * log要发送给client的包 * * @param ioSession * @param size * @param byteArray */ private PacketFromServer packetFromServer; private String userId; private void showPacket(IoSession ioSession, WriteRequest writeRequest) { userId = null; try { userId = serverModel.getClientUserFromTable(ioSession).userId; } catch (Exception e) { } packetFromServer = (PacketFromServer) writeRequest.getMessage(); try { ProtoHead.ENetworkMessage messageType = ProtoHead.ENetworkMessage.valueOf(packetFromServer.getMessageType()); if (loggerRule.loggerType == LoggerType.Contain && !loggerRule.loggerSet.contains(messageType)) return; if (loggerRule.loggerType == LoggerType.Ignore && loggerRule.loggerSet.contains(messageType)) return; logger.info("Server send packet to client(" + ServerModel.getIoSessionKey(ioSession) + "); MessageType : " + messageType.toString() + "; MessageId : " + DataTypeTranslater.bytesToInt(packetFromServer.getMessageID(), 0) + "; UserId : " + (userId == null ? "null" : userId)); } catch (Exception e) { e.printStackTrace(); } } private void readLogRule() { DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); try { DocumentBuilder dombuilder=domfac.newDocumentBuilder(); InputStream is=new FileInputStream(LoggerXML); Document doc=dombuilder.parse(is); // File file = new File(LoggerXML); // System.out.println(file.exists()); // BufferedReader reader = new BufferedReader(new FileReader(file)); // System.out.println(reader.readLine()); 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>(); } }