当前页面: 开发资料首页 → J2EE 专题 → 使用 Web Service Appender for Log4j 管理日志纪录
摘要: 深入理解 WSDL 如何映射到 SOAP。在一般环境下,无须考虑 SOAP 消息中的命名空间。然而,在某些情况下,就必须要考虑这个问题。您可能需要手工创建 SOAP 消息,并在没有其它工具辅助下处理命名空间的问题。本文将专门针对这些情况来解决相关问题。
#set the level of the root logger
log4j.rootLogger = INFO, CONSOLE
#set own logger
log4j.logger.com.carmelouria.logging.test=CONSOLE
log4j.appender.CONSOLE=com.carmelouria.logging.WebServiceAppender
log4j.appender.CONSOLE.endpoint=
http://localhost:9080/log4j/services/LogAppenderService
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n
#set the level of the root logger
log4j.rootLogger = INFO, FILE
#set own logger
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.file=c:/temp/log4j/server/server.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n
package com.carmelouria.logging.test;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* @author Carmelo Uria
*
*/
public class LoggingSample
{
private static Logger logger = Logger.getLogger(LoggingSample.class.getName());
/**
*
*/
public LoggingSample()
{
super();
PropertyConfigurator.configure("c:/temp/log4j.properties");
logger.log(Level.INFO, "LoggingSample instantiation...");
System.out.println("finished...");
}
public static void main(String[] args)
{
LoggingSample sample = new LoggingSample();
}
}
protected void append(LoggingEvent event)
{
// create Web Service client using endpoint
if (endpoint == null)
{
System.out.println("no endpoint set. Check configuration file");
System.out.println("[" + hostname + "] " + this.layout.format(event));
return;
}
executeWebService(event);
}
private void executeWebService(LoggingEvent event)
{
SoapClient client = new SoapClient();
URL endPoint = null;
try
{
endPoint = new URL(getendpoint());
}
catch (MalformedURLException e1)
{
e1.printStackTrace();
}
String nameSpace = "http://ejb.logging.carmelouria.com";
QName serviceName = new QName(nameSpace, "LogAppenderServiceService");
QName operation = new QName(nameSpace, "log");
QName port = new QName(nameSpace, "LogAppenderService");
Parameter message =
new Parameter("log", Constants.XSD_ANY, SOAPElement.class, ParameterMode.IN);
try
{
/**
*create SOAPElement from LoggingEvent need hostname
*/
Level level = event.getLevel();
String sysLog = "" + new Integer(level.getSyslogEquivalent()).toString() ";
+ "
String startTime = new Long(LoggingEvent.getStartTime()).toString();
String timeTag = "" + startTime + " ";
String hostName = "" + InetAddress.getLocalHost() + ";
"
String threadName = "<thread_name>" + event.getThreadName()
+"</thread_name>";
String logger = "" + event.getLoggerName() + " ";
String eventMessage = "" + event.getRenderedMessage() + ";
"
String log = hostName + threadName + logger + timeTag + sysLog +
eventMessage;
String throwableInformation[] = event.getThrowableStrRep();
if (throwableInformation != null)
{
for (int i = 0; i < throwableInformation.length; i++)
{
String throwable = "<throwable_information>" + throwableInformation +
"</throwable_information>";
log += throwable;
}
}
String ndcString = event.getNDC();
if (throwableInformation != null)
{
String throwable =" + ndcString + ";
log += throwable;
}
message.setValue(SOAPElementFactory.create(" + log + "));
}
catch (UnknownHostException unknownHostException)
{
unknownHostException.printStackTrace();
}
catch (SOAPException e2)
{
e2.printStackTrace();
}
Parameter resultType = newParameter("logResponse",
Constants.WEBSERVICES_VOID,
Object.class,
ParameterMode.OUT);
Parameter[] parameters = { message };
try
{
// execute client
Object result =
client.execute(endPoint, serviceName, operation, "wrapped", null,
port, resultType, parameters);
if ((result != null) && (result instanceof String))
System.out.println((String) result);
}
catch (ClientException e)
{
e.printStackTrace();
}
}
public static javax.xml.soap.SOAPElement create(String xml) throws SOAPException
{
com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory factory =
(com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory)
com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory
.newInstance();
SOAPElement element =
(javax.xml.soap.SOAPElement)factory.createElementFromXMLString(xml);
return(element);
}
public static SOAPElement create(String arg0, String arg1, String arg2,
boolean ibmSoapElement) throws
SOAPException
{
if (ibmSoapElement)
{
SOAPFactory soapFactory =
(com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory)
com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory.newInstance();
return (soapFactory.createSOAPElement(arg0, arg1));
}
javax.xml.soap.SOAPFactory soapFactory =
javax.xml.soap.SOAPFactory.newInstance();
return (soapFactory.createElement(arg0, arg1, arg2));
}
private Object call(SoapService service, QName operation, QName portType,
String operationStyleProperty,
String encodingURIProperty, Parameter returnType,
Parameter[] parameters) throws ClientException
{
QName portName;
String response = null;
Object results = null;
Call call = null;
try
{
// check to see if Service object exists
if (service == null)
throw new ClientException("Invalid Service object. It maybe null.");
// retrieve call from Service object
call = service.createCall();
call.setOperationName(operation);
call.setPortTypeName(portType);
// check call object
if (call == null)
throw new ClientException("invalid operation. Call object is null.");
// set default values
if (operationStyleProperty == null)
call.setProperty(Call.OPERATION_STYLE_PROPERTY,
OPERATION_STYLE_DOCUMENT_TYPE);
else
call.setProperty(Call.OPERATION_STYLE_PROPERTY,
operationStyleProperty);
if (encodingURIProperty == null)
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,
ENCODING_LITERAL);
else
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,
encodingURIProperty);
call.setTargetEndpointAddress(service.getServiceEndPoint());
//create Parameter class for SoapClient
for (int i = 0; i < parameters.length; i++)
{
Class classObject = parameters.getClassObject();
if (classObject != null)
call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),
parameters[i].getClassObject(), parameters[i].getMode());
else
call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),
parameters[i].getMode());
}
// pass parameter as ReturnType
if (returnType != null)
{
if (returnType.getClassObject() != null)
call.setReturnType(returnType.getXmlType(), returnType.getClassObject());
else
call.setReturnType(returnType.getXmlType());
}
Object[] request = new Object[parameters.length];
// add parameter values
for (int i = 0; i < request.length; i++)
{
request[i] = parameters[i].getValue();
}
results = call.invoke(request);
}
catch (SOAPFaultException e)
{
System.out.println(e.getFaultString());
e.getStackTrace();
throw new ClientException(e.getLocalizedMessage(), e);
}
catch (ServiceException serviceException)
{
serviceException.getStackTrace();
throw new ClientException(serviceException.getLocalizedMessage(),
serviceException);
}
catch (RemoteException exception)
{
exception.printStackTrace();
throw new ClientException(exception.getLocalizedMessage(), exception);
}
return (results); }
#set the level of the root logger
log4j.rootLogger = INFO, FILE
#set own logger
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.file=c:/temp/log4j/server/server.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n
public void log(SOAPElement message)
{
try
{
InputSource source = ((IBMSOAPElement)
message).toInputSource(false);
Document document = Parser.parse(source);
String log = null;
String hostname =
document.selectSingleNode("//hostname").getText();
String threadName =
document.selectSingleNode("//thread_name").getText();
String syslog =
document.selectSingleNode("//syslog").getText();
String startTime = new Long(
document.selectSingleNode("//start_time").
getText()).toString();
log = '[' + startTime + ':' + hostname + ':' + threadName +
"] " + document.selectSingleNode(
"//message").getText();
// retrieve any throwable messages
List throwableList = document.selectNodes(
"//throwable_information");
if(throwableList != null)
{
Iterator throwables = throwableList.iterator();
while(throwables.hasNext())
{
log += '\n' + ((Node)throwables.next()).getText();
}
log += '\n';
}
logger.log(Level.toLevel(new Integer(syslog).intValue()),
log);
logger.log(Level.INFO,log);
}
catch(ParserException parseException)
{
parseException.printStackTrace();
}
catch (SAXException e)
{
e.printStackTrace();
}
}