我对Web服务世界还很陌生,但是具有相关知识log4j
。
我需要实现将日志消息发送到Web服务而不是使用 Web Service附加程序 发送到文件的功能。
我是通过在 Google 上搜索WebServiceAppender
该log4j
类别之一来阅读的,但我无法验证这一点。
log4j.appender.CONSOLE=main.WSAppender
log4j.appender.CONSOLE.endpoint=http://localhost:8080/Logging/services/logging?wsdl
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n
WSAppender.java extends AppenderSkeleton, can't resolve endpoint, hostname in append()
if (endpoint == null) {
System.out.println("no endpoint set. Check configuration file");
System.out.println("[" + hostname + "] " + this.layout.format(event));
return;
}
当您扩展该类时,AppenderSkeleton
我假设您应该使用public void activateOptions()
应重写的方法来初始化您的webservice类。我已经编写了DatabaseAppender和JmsAppender
log4j记录器,并且我总是发现我必须初始化该方法中的db连接或jms连接或您的Web服务属性public void activateOptions()
。
然后,像往常一样在该append(LoggingEvent)
方法中,您只需调用Web服务。
可能我建议实现一个BlockingQueue来存储所有LoggingEvent对象,以便在收到大量日志消息时将它们排队并异步发送到Web服务。
更新以包括模板Log4j类
尝试使用以下模板。我在重要部分添加了评论。基本上在activateOptions和processEvent方法中,您将在此初始化“连接”并发送事件对象。可以是DB,JMS,WebService等。
package mypackage;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
public class WebServiceAppender extends AppenderSkeleton {
private static final BlockingQueue<LoggingEvent> loggingEventQueue = new LinkedBlockingQueue<LoggingEvent>();
private static WebServiceAppender instance;
private static Thread thread = null;
//Your custom properties for your web service
private String property1;
private String property2;
private String property3;
static {
thread = new Thread(new Runnable() {
public void run() {
processQueue();
}
});
thread.setDaemon(true);
thread.start();
}
private static void processQueue() {
while(true) {
try {
LoggingEvent event = loggingEventQueue.poll(1L, TimeUnit.SECONDS);
if (event != null) {
instance.processEvent(event);
}
}
catch(InterruptedException e) {
// No operations.
}
}
}
private final void processEvent(LoggingEvent loggingEvent) {
if(loggingEvent != null) {
//Send the loggingEvent object or you can
//get data out of it and package it in another
//java class and send that, to your web service.
//Web Service is invoked here
}
}
public synchronized void close() {
// The synchronized modifier avoids concurrent append and close operations
if(this.closed) {
return;
}
closeWS();
thread.interrupt();
LogLog.debug("Closing appender [" + name + "].");
this.closed = true;
}
private void closeWS() {
try {
//Close the webservice connection
//or whatever here.
}
catch(Exception ex) {
LogLog.error("Error while closing WebServiceAppender [" + name + "].", ex);
}
}
public boolean requiresLayout() {
//Does not need a layout because
//we are sending serialized events
//to an external source
return false;
}
@Override
public void activateOptions() {
instance = this;
try {
LogLog.debug("Getting web service properties.");
if(property1 != null) {
//Do something with your property
}
if(property2 != null) {
//Do something with your property
}
if(property3 != null) {
//Do something with your property
}
//Initialize your web-service connection and objects here
LogLog.debug("Web Service created.");
}
catch(Exception ex) {
LogLog.error("Error while activating options for WebServiceAppender [" + name + "].", ex);
}
}
/*
* These methods are set from the log4j properties file like:
* log4j.appender.WS=mypackage.WebServiceAppender
* log4j.appender.WS.property1=bla
* log4j.appender.WS.property2=ble
* log4j.appender.WS.property3=blo
*/
public final String getProperty1() {
return property1;
}
public final String getProperty2() {
return property2;
}
public final String getProperty3() {
return property3;
}
public final void setProperty1(String property1) {
this.property1 = property1;
}
public final void setProperty2(String property2) {
this.property2 = property2;
}
public final void setProperty3(String property3) {
this.property3 = property3;
}
@Override
protected void append(LoggingEvent event) {
loggingEventQueue.add(event);
}
@Override
public void finalize() {
close();
super.finalize();
}
}
我在Java日志记录方面遇到了一些障碍。我想将日志发送到笔记本电脑上的Nginx本地服务器。我如何使用log4j或slf4j实现这个函数,有人能帮我实现代码吗?谢谢
我们正在使用REST保证来测试一些REST服务。我们需要将请求和响应日志重定向到Log4j日志。我们有以下代码来测试日志重定向: 我们将以下日志输出到log4j文件: 在system.out,我们看到请求和响应的REST保证输出。该输出没有重定向到Log4j文件。如何将控制台输出重定向到Log4j文件?
问题内容: 我正在使用slf4j api进行记录的应用程序: (上面的代码显示了正在使用的类和程序包,但是很标准。) 我们使用配置如下的logback: 我们的某些代码利用了使用java.util.logging记录的第三方库- 特别是freemarker。从下面的控制台日志条目中可以看到,logback和jul都正在记录到控制台,但是它们没有使用相同的配置(logback条目使用我们的模式,ju
我的Java应用程序使用Log4j2作为其日志记录实现,它依赖于使用Log4J的第三方库。 你能建议我如何将这些第三方库的日志记录程序路由到myAppender吗?
问题内容: 我正在通过以下方法使用Web服务: 发送json字符串,它可以工作,但是如果我尝试使用FormData追加输入的内容并将其传递给数据值,我将得到500响应。我该怎么办? 问题答案: 您需要序列化数据…。 在控制器内部,您可以拥有类似 希望能帮助到你…
问题内容: 我正在使用arzoo的Flight API。服务器必须在简单的POST请求中接收发布的数据。为此,我使用了PHP cURL。API文档中明确提到数据应以以下格式发送: 我在变量$ xml中使用了上面的代码。我的PHP cURL代码如下: 我没有得到任何回应。我已经与API Provider讨论过同样的问题,但是他们在日志中发现了空请求。我到底想念什么吗?您的答复将不胜感激。谢谢。 问题