读取web服务器log

killercwf1 2009-12-15 02:17:12
求一段log文件完成以下的实验

Web服务器记录文件的处理
一、实验目的
1、 熟悉java.net包中表示IP地址的类InteAddress类的使用方法;
2、 掌握利用该类中提供的方法实现IP地址和主机名之间的转换;
3、 掌握解析主机名并获得IP地址的方法。

二、实验原理
Web服务器的记录文件可以记录登到网站上的主机。记录的内容包括链接到服务器上的机器IP地址。而用户可以从机器名上获得更多信息,但是Web服务器直接记录机器名要通过DNS域名服务器来获取,会给计算带来很大的开销。因此Web服务器采取更有效的方式:先记录IP地址,并在稍后服务器不忙的时候将IP地址转换为主机名。

...全文
157 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
killercwf1 2009-12-15
  • 打赏
  • 举报
回复
实验代码
//PooledWeblog.java
import java.io.*;
import java.util.*;
import com.macfaq.io.SafeBufferedReader;
public class PooledWeblog {
private BufferedReader in;//输入流
private BufferedWriter out;//输出流
private int numberOfThreads;//记录线程的数量
private List entries = Collections.synchronizedList(new LinkedList( ));
private boolean finished = false;//标志是否结束
private int test = 0;
public PooledWeblog(InputStream in, OutputStream out, int numberOfThreads) {
this.in = new BufferedReader(new InputStreamReader(in));
this.out = new BufferedWriter(new OutputStreamWriter(out));
this.numberOfThreads = numberOfThreads;
}
public boolean isFinished( ) {
//当结束时返回
return this.finished;
}
public int getNumberOfThreads( ) {
return numberOfThreads;//返回线程的个数
}
public void processLogFile( ) {
for (int i = 0; i < numberOfThreads; i++) {
//去创建新的线程
Thread t = new LookupThread(entries, this);
t.start( );//启动线程
}
try {
String entry = null;
while ((entry = in.readLine( )) != null) {
if (entries.size( ) > numberOfThreads) {
try {
Thread.sleep((long) (1000.0/numberOfThreads));//停止线程一段时间
}
catch (InterruptedException e) {}
continue;
}
synchronized (entries) {
entries.add(0, entry);
entries.notifyAll( );
}
Thread.yield( );
} // 循环终止
}
catch (IOException e) {
System.out.println("Exception: " + e);//输出错误信息
}
this.finished = true;
// 结束那些仍然等待的线程
synchronized (entries) {
entries.notifyAll( );
}
}
//记录错误信息
public void log(String entry) throws IOException {
out.write(entry + System.getProperty("line.separator", "\r\n"));
out.flush( );
}
public static void main(String[] args) {
try {
PooledWeblog tw = new PooledWeblog(new FileInputStream(args[0]),
System.out, 100);
tw.processLogFile( );
}
catch (FileNotFoundException e) {
System.err.println("Usage: java PooledWeblog logfile_name");
}
catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Usage: java PooledWeblog logfile_name");
}
catch (Exception e) {
System.err.println(e);
e.printStackTrace( );
}
}
}


//LookupThread.java
import java.net.*;
import java.io.*;
import java.util.*;
public class LookupThread extends Thread {
private List entries;
PooledWeblog log; //在回调的时候使用
//检索线程是否在列表中
public LookupThread(List entries, PooledWeblog log) {
this.entries = entries;
this.log = log;
}
//启动线程的函数
public void run( ) {
String entry;
while (true) {
synchronized (entries) {
while (entries.size( ) == 0) {
if (log.isFinished( )) return;
try {
entries.wait( );
}
catch (InterruptedException e) {
}
}
entry = (String) entries.remove(entries.size( )-1);
}
int index = entry.indexOf(' ', 0);
//获得远程主机地址
String remoteHost = entry.substring(0, index);
String theRest = entry.substring(index, entry.length( ));
try {
//获得远程主机的地址
remoteHost =InetAddress.getByName(remoteHost).getHostName( );
}
catch (Exception e) {
}
try {
log.log(remoteHost + theRest);
}
catch (IOException e) {
}
this.yield( );
}
}
}

//Weblog.java
import java.net.*;
import java.io.*;
import java.util.*;
import com.macfaq.io.SafeBufferedReader;
public class Weblog {
public static void main(String[] args) {
Date start = new Date( );//得到起始日期
try {
//使用FileInputStream 类来装饰输入流
FileInputStream fin = new FileInputStream(args[0]);
Reader in = new InputStreamReader(fin);//获得Read类型输入流
SafeBufferedReader bin = new SafeBufferedReader(in);
String entry = null;
while ((entry = bin.readLine( )) != null) {
// 分离出IP地址
int index = entry.indexOf(' ', 0);
String ip = entry.substring(0, index);//得到IP地址
String theRest = entry.substring(index, entry.length( ));
// 找到主机名字,并打印出来
try {
InetAddress address = InetAddress.getByName(ip);//通过IP地址获得此地址
System.out.println(address.getHostName( ) + theRest);
}
catch (UnknownHostException e) {
System.out.println(entry);
}
} // 循环终止
}
catch (IOException e) {
System.out.println("Exception: " + e);
}
Date end = new Date( );//得到新日期
long elapsedTime = (end.getTime()-start.getTime( ))/1000;
System.out.println("Elapsed time: " + elapsedTime + " seconds");
} // main终止
}
boboo_2000_0 2009-12-15
  • 打赏
  • 举报
回复
楼主的意思不是很清楚,log文件怎么能解决楼主所述问题呢?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧