📄 mapachelogsql.java
字号:
package net.jumperz.app.MApacheLogSql;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.text.*;
import net.jumperz.sql.*;
import net.jumperz.util.*;
public class MApacheLogSql
{
private static final String HSQLDB_JDBC_DRIVER_CLASS_NAME = "net.jumperz.ext.org.hsqldb.jdbcDriver";
private static final String DEFAULT_DBMS_USER = "sa";
private static final String DEFAULT_DBMS_PASS = "";
private static final int BUFSIZE = 1024;
private static final int OFFSET = 50;
private static final int METHOD_MAX_LENGTH = 9;
private static final int URI_MAX_LENGTH = 1024;
private static final int VERSION_MAX_LENGTH = 10;
private String dbmsPass = DEFAULT_DBMS_PASS;
private String dbmsUser = DEFAULT_DBMS_USER;
private String dbmsUrl;
private String logFileName;
private Connection connection;
private ResultSet rs;
private BufferedReader reader;
//--------------------------------------------------------------------------------
public static void main( String[] args )
throws Exception
{
if( args.length == 0 )
{
showUsage();
return;
}
MApacheLogSql instance = new MApacheLogSql();
instance.start( args );
}
//--------------------------------------------------------------------------------
private static void showUsage()
{
System.out.println( "Usage: java MApacheLogSql -d dbmsUrl -f logFileName [ -u username ] [ -p password ]" );
}
//--------------------------------------------------------------------------------
public void start( String[] args )
throws Exception
{
try
{
for( int i = 0; i < args.length; ++i )
{
if( args[ i ].equals( "-u" ) )
{
dbmsUser = args[ i + 1 ];
++i;
}
else if( args[ i ].equals( "-p" ) )
{
dbmsPass = args[ i + 1 ];
++i;
}
else if( args[ i ].equals( "-d" ) )
{
dbmsUrl = args[ i + 1 ];
++i;
}
else if( args[ i ].equals( "-f" ) )
{
logFileName = args[ i + 1 ];
++i;
}
}
}
catch( IndexOutOfBoundsException e )
{
MApacheLogSql.showUsage();
return;
}
if( dbmsUser == null
|| dbmsPass == null
|| dbmsUrl == null
|| logFileName == null
)
{
MApacheLogSql.showUsage();
return;
}
Class.forName( MSqlUtil.getJdbcDriverClassName( dbmsUrl ) );
connection = DriverManager.getConnection( dbmsUrl, dbmsUser, dbmsPass );
try
{
execute();
}
catch( Exception e )
{
e.printStackTrace();
}
connection.close();
}
//--------------------------------------------------------------------------------
private void execute()
throws SQLException, IOException, ParseException
{
// input
BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( logFileName ) ) );
String clientIp;
long time;
String requestLine;
String method;
String uri;
String version;
int statusCode;
int size;
String referer;
String userAgent;
String line;
/*
66.196.90.143 - [10/Jun/2004:16:08:55 +0900] "GET / HTTP/1.0" 302 647 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
*/
while( true )
{
line = reader.readLine();
if( line == null )
{
break;
}
// clinet IP address
clientIp = MRegEx.getMatch( "^[0-9.]{1,}", line );
// time
String dateStr = MRegEx.getMatch( " \\[(.*) \\+0900\\]", line );
dateStr = dateStr.replaceAll( "/", " " );
dateStr = dateStr.replaceFirst( ":", " " );
// time = DateFormat.getInstance().parse( dateStr ).getTime();
time = ( new java.util.Date( dateStr ) ).getTime();
//requestLine
String[] result = getNextPart( line );
requestLine = result[ 0 ];
line = result[ 1 ];
//method, uri, version
String[] array = requestLine.split( " " );
if( array.length != 3 )
{
System.err.println( line );
continue;
}
method = array[ 0 ];
uri = array[ 1 ];
version = array[ 2 ];
//check length
if( method.length() > METHOD_MAX_LENGTH )
{
System.err.println( line );
continue;
}
if( uri.length() > URI_MAX_LENGTH )
{
System.err.println( line );
continue;
}
if( version.length() > VERSION_MAX_LENGTH )
{
System.err.println( line );
continue;
}
//statusCode, size
statusCode = Integer.parseInt( MRegEx.getMatch( "^([0-9]{3})", line ) );
try
{
size = Integer.parseInt( MRegEx.getMatch( "^[0-9]{3} ([0-9]{1,})", line ) );
}
catch( NumberFormatException e )
{
size = 0;
}
//referer
result = getNextPart( line );
referer = result[ 0 ];
line = result[ 1 ];
//userAgent
result = getNextPart( line );
userAgent = result[ 0 ];
String queryString =
"insert into tAccess values( ??? );";
MObjectArray args = new MObjectArray();
args.add( clientIp );
args.add( new Timestamp( time ) );
args.add( method );
args.add( uri );
args.add( version );
args.add( statusCode );
args.add( size );
args.add( referer );
args.add( userAgent );
MSqlUtil.executeUpdate2( connection, queryString, args );
}
}
//--------------------------------------------------------------------------------
private String[] getNextPart( String line )
{
int index1 = line.indexOf( '"' );
int index2;
for( int i = 1;; ++i )
{
index2 = line.indexOf( '"', index1 + i );
if( line.charAt( index2 - 1 ) != '\\' )
{
break;
}
}
String[] result = new String[ 2 ];
result[ 0 ] = line.substring( index1 + 1, index2 );
if( line.length() > index2 + 2 )
{
result[ 1 ] = line.substring( index2 + 2 );
}
return result;
}
//--------------------------------------------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -