您的位置:首页 > 运维架构

Axis2学习总结(3)在客户端配置log4j监控soap消息

2016-05-23 10:56 633 查看
先编写log4j自定义appdener,代码如下

package com.appender;

import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;

public class SoapAppender extends AppenderSkeleton{

private String file = "";

public void setFile(String filedata){

file = filedata;
}

public String getFile(){

return file;
}
@Override
public void close() {
// TODO Auto-generated method stub

}

@Override
public boolean requiresLayout() {
// TODO Auto-generated method stub
return true;
}

@Override
protected void append(LoggingEvent event) {
// TODO Auto-generated method stub

Object obdata = hexToString(event.getMessage().toString());
LoggingEvent soaplogevent = new LoggingEvent(event.getFQNOfLoggerClass(), event.getLogger(),
event.getLevel(), obdata, new Throwable());
System.out.println(this.getLayout().format(soaplogevent));
//	System.out.println(hexToString(event.getMessage().toString()));
writeDataToLogFile(obdata.toString());
}

// 转化十六进制编码为字符串
public static String toStringHex(String s)
{
byte[] baKeyword = new byte[s.length()/2];
for(int i = 0; i < baKeyword.length; i++)
{
try
{
baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i*2, i*2+2),16));
}
catch(Exception e)
{
e.printStackTrace();
}
}
try
{
s = new String(baKeyword, "utf-8");//UTF-16le:Not
}
catch (Exception e1)
{
e1.printStackTrace();
}
return s;
}

//将字符串中的十六进制字节转换为字符串
public static String hexToString(String data){

//默认编码是utf-8,即一个非常规字符用3个十六进制字节表示
String regex = "\\[0x(\\w\\w)\\]\\[0x(\\w\\w)\\]\\[0x(\\w\\w)\\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher=pattern.matcher(data);
StringBuffer nedata = new StringBuffer();
while(matcher.find()){

String tempdata = toStringHex(matcher.group(1) + matcher.group(2) + matcher.group(3));
matcher.appendReplacement(nedata, tempdata);

}
matcher.appendTail(nedata);

if(nedata.toString().length() <= 0){

return data;
}else{
return nedata.toString();
}

}

public void writeDataToLogFile(String filedata){

if(file.isEmpty()){

LogLog.debug("file is not exit!");
}else{

try{

FileWriter fwio = new FileWriter(file, true);
fwio.write(filedata);
fwio.close();

}catch(IOException e){

e.printStackTrace();
}
}
}
}

再配置log4j.properties

<span style="font-size:14px;"># Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
log4j.logger.httpclient.wire.content=DEBUG,axis2

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] -%c- %m%n

log4j.appender.axis2=com.appender.SoapAppender
log4j.appender.axis2.layout=org.apache.log4j.PatternLayout
log4j.appender.axis2.layout.ConversionPattern=[%p] %m%n
log4j.additivity.httpclient.wire.content=false</span>


说明:
log4j.rootLogger//==配置跟logger日志级别及日志输出位置,如:
    log4j.rootLogger=ERROR,file,stdout表示,日志级别为ERROR的日志输出到控制台和file中。
但如果日志要分别输出到不同的文件中,如根据功能模块输出到不同文件,则无需将不同位置在此设置,否则在无法按照功能模块输出日志,导致不同文件记录相同的日志。
 
log4j.additivity是子Logger是否继承父Logger 的 输出源(appender)的标志位。具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger 会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。

配置完成就可以监控soap消息了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: