您的位置:首页 > 移动开发

log4j通过SocketAppender将日志内容发送到远程服务器

2013-01-24 14:36 525 查看


通过log4j可以实现将日志内容发送到其他服务器,其他机器可以再对日志做统一处理,比如发送邮件,发送短信,日志分析等等。具体demo如下:


1. 客户端代码

客户端代码分为log4j的配置文件,和客户端记录log4j日志类

log4j.xml内容如下

[html] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE log4j:configuration SYSTEM "dtd/log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d{ABSOLUTE\} %5p %c{1\}:%L - %m%n"/>

</layout>

</appender>

<appender name="remoteFile" class="org.apache.log4j.net.SocketAppender">

<param name="remoteHost" value="127.0.0.1" /><!-- 这是远程log server -->

<param name="port" value="4445" /><!-- 这是远程log server port -->

<param name="Threshold" value="INFO" /><!-- log 级别 -->

<param name="ReconnectionDelay" value="1000" />

<param name="LocationInfo" value="true" />

​</appender>

<logger name="testRemote" additivity="false">

<level value="INFO" />

<appender-ref ref="STDOUT" />

</logger>

<logger name="testRemote2" additivity="false">

<level value="INFO" />

<appender-ref ref="remoteFile" />

</logger>

<root>

<level value="info" />

<appender-ref ref="STDOUT" />

</root>

</log4j:configuration>

测试类如下

[java] view
plaincopy

public class Log4JSocketAppenderTest

{

public static void main(String[] args) throws Exception

{

//发送日志记录时间

long runTime = 1000 * 60 * 1;

DOMConfigurator.configure(Log4JSocketAppenderTest.class.getResource("log4j.xml"));

Logger remoteLogger = LogManager.getLogger("testRemote2");

long i = 0;

String sendInfo = "the send info is ";

long old = System.currentTimeMillis();

while (true)

{

System.out.println("send info begin: " + sendInfo + i);

remoteLogger.info(sendInfo + i);

i++;

//每3秒记录一次日志

Thread.sleep(1000 * 3);

long now = System.currentTimeMillis();

if((now - old) > runTime)

{

break;

}

}

}

}



2. 服务端代码


服务端代码是监听对应的端口,并接收log4j发过来的内容



[java] view plaincopyimport java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.log4j.Logger;

public class LogSocketServer implements Runnable
{
private static final Logger logger = Logger.getLogger(LogSocketServer.class);

public void run()
{
logger.debug("begin call listen log info .....");
ServerSocket serverSocket;
Socket socket = null;
try
{
//如果没有配置端口  则抛出异常
serverSocket = new ServerSocket(4445);

while (true) {

logger.info("Waiting to accept a new client.");

socket = serverSocket.accept();

InetAddress inetAddress = socket.getInetAddress();

logger.debug("Connected to client at " + inetAddress);

logger.debug("Starting new socket node.");

new Thread(new LogSocketNode(socket)).start();

}
}
catch (Exception e)
{
logger.error("error in liston info  ", e);
}

}
}

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;public class LogSocketNode implements Runnable {

Socket socket;
ObjectInputStream ois;
static Logger logger = Logger.getLogger(LogSocketNode.class);
public LogSocketNode(Socket socket) {
this.socket = socket;
try {
ois = new ObjectInputStream(new BufferedInputStream(
socket.getInputStream()));
} catch (Exception e) {
logger.error("Could not open ObjectInputStream to " + socket, e);
}
}

public void run() {
LoggingEvent event;
try {
if (ois != null) {
while (true) {
// read an event from the wire
event = (LoggingEvent) ois.readObject();
System.out.println("get log info is : " + event.getMessage());
}

}

} catch (java.io.EOFException e) {

logger.error("Caught java.io.EOFException closing conneciton.");

} catch (java.net.SocketException e) {

logger.error("Caught java.net.SocketException closing conneciton.");

} catch (IOException e) {

logger.error("Caught java.io.IOException: " + e);

logger.error("Closing connection.");

} catch (Exception e) {

logger.error("Unexpected exception. Closing conneciton.", e);

} finally {

if (ois != null) {

try {
logger.debug("begin close ois");
ois.close();
logger.debug("end close ois");

} catch (Exception e) {

logger.error("Could not close connection.", e);

}

}

if (socket != null) {

try {
logger.debug("begin close socket");
socket.close();
logger.debug("end close socket");

} catch (IOException ex) {
logger.error("socket close error ", ex);
}

}

}

}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: