Web Server Logs Analyze Using the XML Technologies



Similar documents
By Nabil ADOUI, member of the 4D Technical Support team

XSL - Introduction and guided tour

Learning Outcomes. Networking. Sockets. TCP/IP Networks. Hostnames and DNS TCP/IP

An introduction to web programming with Java

HTML Fails: What No One Tells You About HTML

Building a Multi-Threaded Web Server

Consuming a Web Service(SOAP and RESTful) in Java. Cheat Sheet For Consuming Services in Java

Differences between HTML and HTML 5

Secure Testing Service

Lesson: All About Sockets

Data Integration through XML/XSLT. Presenter: Xin Gu

WWW. World Wide Web Aka The Internet. dr. C. P. J. Koymans. Informatics Institute Universiteit van Amsterdam. November 30, 2007

Files and input/output streams

BCS THE CHARTERED INSTITUTE FOR IT. BCS HIGHER EDUCATION QUALIFICATIONS BCS Level 6 Professional Graduate Diploma in IT WEB ENGINEERING

Overview of Web Services API

ResellerPlus - Bulk Http API Specification. (This Document gives details on how to send messages via the Bulk HTTP API for the RouteSms SMPP System)

Hypertext for Hyper Techs

Auto-Generating Documentation & Source Code

Google Web Toolkit. Progetto di Applicazioni Software a.a. 2011/12. Massimo Mecella

XML Processing and Web Services. Chapter 17

e Merchant Plug-in (MPI) Integration & User Guide

INPUT AND OUTPUT STREAMS

How To Write A Program For The Web In Java (Java)

THE PROXY SERVER 1 1 PURPOSE 3 2 USAGE EXAMPLES 4 3 STARTING THE PROXY SERVER 5 4 READING THE LOG 6

T XML in 2 lessons! %! " #$& $ "#& ) ' */,: -.,0+(. ". "'- (. 1

Division of Informatics, University of Edinburgh

WRITING DATA TO A BINARY FILE

Developing Web Views for VMware vcenter Orchestrator

reference: HTTP: The Definitive Guide by David Gourley and Brian Totty (O Reilly, 2002)

Managing Data on the World Wide-Web

Extending XSLT with Java and C#

LabVIEW Internet Toolkit User Guide

CSCI110: Examination information.

ShoreTel Enterprise Contact Center 8 Installing and Implementing Chat

Cross Platform App Development

Internet Technologies_1. Doc. Ing. František Huňka, CSc.

General principles and architecture of Adlib and Adlib API. Petra Otten Manager Customer Support

Cyber Security Workshop Ethical Web Hacking

Agenda. 1. ZAPms Konzept. 2. Benutzer-Kontroller. 3. Laout-Aufbau. 4. Template-Aufbau. 6. Konfiguration. 7. Module.

Security-Assessment.com White Paper Leveraging XSRF with Apache Web Server Compatibility with older browser feature and Java Applet

Introduction to Web Technologies

The Java I/O System. Binary I/O streams (ascii, 8 bits) The decorator design pattern Character I/O streams (Unicode, 16 bits)

XML WEB TECHNOLOGIES

.NET Best Practices Part 1 Master Pages Setup. Version 2.0

Using ilove SharePoint Web Services Workflow Action

FileMaker Server 9. Custom Web Publishing with PHP

Java and XML parsing. EH2745 Lecture #8 Spring

API Document Webaroo Technology India Pvt. Ltd.

Web Development. Owen Sacco. ICS2205/ICS2230 Web Intelligence

Web Authoring CSS. Module Descriptor

JAVA - FILES AND I/O

Managing Snort Alerts

Concrete uses of XML in software development and data analysis.

Chapter 1 Programming Languages for Web Applications

How To Create A Web Database From A Multimedia Resources Database On A Microsoft Web Browser On A Pc Or Mac Or Mac (For Free) On A Mac Or Ipad Or Ipa (For Cheap) On Pc Or Ipam (For Money

gomobi Traffic Switching Guide Version 0.9, 28 September 2010

API. Application Programmers Interface document. For more information, please contact: Version 2.01 Aug 2015

Crowbar: New generation web application brute force attack tool

Short notes on webpage programming languages

public static void main(string[] args) { System.out.println("hello, world"); } }

COMP 112 Assignment 1: HTTP Servers

Web. Programming. Hans- Pe0er Halvorsen, M.Sc. h0p://home.hit.no/~hansha/?page=sojware_development

Chulalongkorn University International School of Engineering Department of Computer Engineering Computer Programming Lab.

CONFIGURING A WEB SERVER AND TESTING WEBSPEED

10CS73:Web Programming

WA 2. GWT Martin Klíma

A70 How to Deploy Applications

WebSphere and Message Driven Beans

Web Container Components Servlet JSP Tag Libraries

WEB DEVELOPMENT IA & IB (893 & 894)

ANALYSING SERVER LOG FILE USING WEB LOG EXPERT IN WEB DATA MINING

Building A Very Simple Website

IT6503 WEB PROGRAMMING. Unit-I

ACM Crossroads Student Magazine The ACM's First Electronic Publication

The Web Server. 2 Implementation. 2.1 The Process Behind a Web Page Request. Shana Blair and Mark Kimmet

JobScheduler Web Services Executing JobScheduler commands

CSE 308. Coding Conventions. Reference

Apache Usage. Apache is used to serve static and dynamic content

Form Handling. Server-side Web Development and Programming. Form Handling. Server Page Model. Form data appended to request string

D06 PROGRAMMING with JAVA

Web Development I & II*

Big Data Meets Infosec Visualiza4on. Forensics Challenge 10 Honeynet.org

XML. CIS-3152, Spring 2013 Peter C. Chapin

WTP-101 Developing Rich Internet Applications with Java Web Frameworks

Network Communication

URLs and HTTP. ICW Lecture 10 Tom Chothia

See the Developer s Getting Started Guide for an introduction to My Docs Online Secure File Delivery and how to use it programmatically.

Cisco BTS Softswitch SOAP Adapter Interface Specification Programmer s Guide, Release 7.0

Web Application Report

HTTP - METHODS. Same as GET, but transfers the status line and header section only.

Acrobat Connect. Using Connect Enterprise Web Services

Transcription:

Web Server Logs Analyze Using the XML Technologies Author: Tayeb L. E-mail: Tayeb.Lemlouma@inrialpes.fr July 2002. We introduce here an approach to write and analyze server logs using the XML technology. The approach consists to transform the server log to an XML structure that we have defined and then to apply the log analyze. The analyze is done using XSLT and allows to have a clear idea about the server log in the form of a valid HTML [3] page generated from the XML log file. 1 The Server Logs Analyze The approach that we have adopted in order to analyze and manipulate the server logs, woks as follows: - First we transform, using a Java program, the textual format of the server log to an XML [1] file. The supported textual format of the server log is the one compatible with the Apache 1.3.20 log format. This last is simple, it includes a set of string lines where each line corresponds to a visitor hit. Each line includes: the visitor IP address, the time and the date of the visit, the client request, the status code of the server reply, the file size of the requested content, the referrer URL, and the user agent type. In the following we give an example of an Apache 1.3.20 server log: 193.105.113.102 - - [01/Jul/2002:17:31:17 +0200] "GET HTTP/1.1" 206 1024 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)" 193.105.113.102 - - [01/Jul/2002:17:31:18 +0200] "GET HTTP/1.1" 206 2395 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)" 193.105.113.102 - - [01/Jul/2002:17:31:19 +0200] "GET HTTP/1.1" 206 66568 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)" 208.13.106.20 - - [01/Jul/2002:17:40:56 +0200] "GET /people/tayeb.lemlouma/multimedia/ccpp/ups-package/upsprofiles.html HTTP/1.0" 200 3332 "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request" 80.15.59.139 - - [01/Jul/2002:17:41:07 +0200] "GET /people/tayeb.lemlouma/papers/adhoc_presentation.pdf HTTP/1.1" 200 18535 "http://www.google.fr/search?q=%22applications+militaires%22+fr%c3%a9quence&hl=fr&lr= &ie=utf-8&oe=utf8&start=20&sa=n" "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)" 64.51.19.178 - - [01/Jul/2002:18:09:15 +0200] "GET /people/tayeb.lemlouma/multimedia/ccpp/ups-package/upsprofiles.html HTTP/1.0" 200 3332 "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request" 64.51.19.178 - - [01/Jul/2002:18:19:08 +0200] "GET /people/tayeb.lemlouma/negotiationschema/index.htm HTTP/1.0" 304 - "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request"

Figure 1. An example of a server log file In order to avoid the size explosion of the generated XML, we have chosen a simple format that contains only the required information. In the following we give an example of the generated XML from the precedent log file: <?xml version="1.0"?> <ServerLog> <Visitor IP="193.105.113.102" accessdate="01/jul/2002:17:31:17 +0200" request="get HTTP/1.1" statuscode="206" filesize="1024" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.01; Windows NT)" /> <Visitor IP="193.105.113.102" accessdate="01/jul/2002:17:31:18 +0200" request="get HTTP/1.1" statuscode="206" filesize="2395" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.01; Windows NT)" /> <Visitor IP="193.105.113.102" accessdate="01/jul/2002:17:31:19 +0200" request="get HTTP/1.1" statuscode="206" filesize="66568" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.01; Windows NT)" /> <Visitor IP="208.13.106.20" accessdate="01/jul/2002:17:40:56 +0200" request="get /people/tayeb.lemlouma/multimedia/ccpp/ups-package/upsprofiles.html HTTP/1.0" statuscode="200" filesize="3332" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request" /> <Visitor IP="80.15.59.139" accessdate="01/jul/2002:17:41:07 +0200" request="get /people/tayeb.lemlouma/papers/adhoc_presentation.pdf HTTP/1.1" statuscode="200" filesize="18535" referrer="http://www.google.fr/search?q=%22applications+militaires%22+fr%c3%a9quence& amp;hl=fr&lr=&ie=utf-8&oe=utf8&start=20&sa=n" useragent="mozilla/4.0 (compatible; MSIE 6.0; Windows 98)" /> <Visitor IP="64.51.19.178" accessdate="01/jul/2002:18:09:15 +0200" request="get /people/tayeb.lemlouma/multimedia/ccpp/ups-package/upsprofiles.html HTTP/1.0" statuscode="200" filesize="3332" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request" /> <Visitor IP="64.51.19.178" accessdate="01/jul/2002:18:19:08 +0200" request="get /people/tayeb.lemlouma/negotiationschema/index.htm HTTP/1.0" statuscode="304" filesize="-" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request" /> </ServerLog> Figure 2. The generation of the XML log file - After transforming the server log file to XML, we use the XSLT language [2] to analyze the XML content. One of the proposed processing is to organize the log information in elements concerning each visitor with giving its IP address, the number of hits, the date of the first access, the first visit server resource and the referrer visitor URL. The following XML file represents an example of the generated XML form: <?xml version="1.0" encoding="utf-8"?> <analysresult> <accessnumber>0</accessnumber> <totalaccessnumber>7</totalaccessnumber> <VisitorIP>193.105.113.102</VisitorIP> <VisitorAccessNumber>3</VisitorAccessNumber> <firstaccessdate>01/jul/2002:17:31:17 +0200</firstAccessDate> <firstvisitorrequest>get HTTP/1.1</firstVisitorRequest> <referrer>-</referrer> <VisitorIP>208.13.106.20</VisitorIP> <VisitorAccessNumber>1</VisitorAccessNumber>

<firstaccessdate>01/jul/2002:17:40:56 +0200</firstAccessDate> <firstvisitorrequest>get /people/tayeb.lemlouma/multimedia/ccpp/ups- Package/UPSProfiles.html HTTP/1.0</firstVisitorRequest> <referrer>-</referrer> <VisitorIP>80.15.59.139</VisitorIP> <VisitorAccessNumber>1</VisitorAccessNumber> <firstaccessdate>01/jul/2002:17:41:07 +0200</firstAccessDate> <firstvisitorrequest>get /people/tayeb.lemlouma/papers/adhoc_presentation.pdf HTTP/1.1</firstVisitorRequest> <referrer>http://www.google.fr/search?q=%22applications+militaires%22+fr%c3%a9quence& amp;hl=fr&lr=&ie=utf-8&oe=utf8&start=20&sa=n</referrer> <VisitorIP>64.51.19.178</VisitorIP> <VisitorAccessNumber>2</VisitorAccessNumber> <firstaccessdate>01/jul/2002:18:09:15 +0200</firstAccessDate> <firstvisitorrequest>get /people/tayeb.lemlouma/multimedia/ccpp/ups- Package/UPSProfiles.html HTTP/1.0</firstVisitorRequest> <referrer>-</referrer> </analysresult> Figure 3. An XSLT analyze of the server log file The above XML form is generated from the XML log file (Figure 2) using the following XSLT style sheet: <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"><analysresult> <xsl:text> </xsl:text> <accessnumber><xsl:value-of select="count(serverlog/visitor[@ip='4.33.55.30'])" /></accessnumber> <totalaccessnumber><xsl:value-of select="count(serverlog/visitor)" /></totalaccessnumber> <xsl:for-each select="serverlog/visitor"> <xsl:variable name="value" select="@ip"/> <xsl:if test="count(preceding::visitor[@ip=$value]) = 0"> <VisitorIP><xsl:value-of select="@ip"/></visitorip> <VisitorAccessNumber><xsl:value-of select="count(/serverlog/visitor[@ip=$value])"/></visitoraccessnumber> <firstaccessdate><xsl:value-of select="@accessdate"/></firstaccessdate> <firstvisitorrequest><xsl:value-of select="@request"/></firstvisitorrequest> <referrer><xsl:value-of select="@referrer"/></referrer> </xsl:if> </xsl:for-each> </analysresult></xsl:template></xsl:stylesheet> Figure 4. The XSLT stylesheet used in the server log analyze - An other possible transformation of the XML server log is to analyze the log and output the result in the form of an HTML page that can be easily visualized. The following figure shows a possible analyze of the XML log file in the form of an HTML page: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <META http-equiv="content-type" content="text/html; charset=utf-8">

<title>web Analys Result</title> <meta content="text/html; charset=iso-8859-1" http-equiv="content-type"> </head> <body text="#000000" bgcolor="#ffffff"> <h1 align="left"> <b>server Web Analyze</b> </h1> <table border="0" width="97%"> <tr bgcolor="#ffff00"> <td width="9%"> <div align="left"> <b><font face="arial">visitor IP Adress</font></b> </div> </td><td width="12%"><b><font face="arial">hits Number</font></b></td><td width="30%"><b><font face="arial">date of the First Access</font></b></td><td width="6%"><b><font face="arial">first Request</font></b></td><td width="8%"><b><font face="arial">referrer</font></b></td> <tr bgcolor="#efefef"> <td bgcolor="#efefef" width="9%"><b><font size="2" face="arial" color="#990000">193.105.113.102</font></b></td><td width="12%"><font size="2" face="arial">3</font></td><td width="30%"><font size="2" face="arial">01/jul/2002:17:31:17 +0200</font></td><td width="6%"><font size="2" face="arial">get HTTP/1.1</font></td><td width="8%"><font size="2" face="arial">-</font></td> <tr bgcolor="#efefef"> <td bgcolor="#efefef" width="9%"><b><font size="2" face="arial" color="#990000">208.13.106.20</font></b></td><td width="12%"><font size="2" face="arial">1</font></td><td width="30%"><font size="2" face="arial">01/jul/2002:17:40:56 +0200</font></td><td width="6%"><font size="2" face="arial">get /people/tayeb.lemlouma/multimedia/ccpp/ups-package/upsprofiles.html HTTP/1.0</font></td><td width="8%"><font size="2" face="arial">-</font></td> <tr bgcolor="#efefef"> <td bgcolor="#efefef" width="9%"><b><font size="2" face="arial" color="#990000">80.15.59.139</font></b></td><td width="12%"><font size="2" face="arial">1</font></td><td width="30%"><font size="2" face="arial">01/jul/2002:17:41:07 +0200</font></td><td width="6%"><font size="2" face="arial">get /people/tayeb.lemlouma/papers/adhoc_presentation.pdf HTTP/1.1</font></td><td width="8%"><font size="2" face="arial">http://www.google.fr/search?q=%22applications+militaires%22+fr%c3%a9quenc e&hl=fr&lr=&ie=utf-8&oe=utf8&start=20&sa=n</font></td> <tr bgcolor="#efefef"> <td bgcolor="#efefef" width="9%"><b><font size="2" face="arial" color="#990000">64.51.19.178</font></b></td><td width="12%"><font size="2" face="arial">2</font></td><td width="30%"><font size="2" face="arial">01/jul/2002:18:09:15 +0200</font></td><td width="6%"><font size="2" face="arial">get /people/tayeb.lemlouma/multimedia/ccpp/ups-package/upsprofiles.html HTTP/1.0</font></td><td width="8%"><font size="2" face="arial">-</font></td> </table> <p> <font size="2">analyze done using log2xml utility. <br>author: Tayeb Lemlouma, <br> Jully 2002.</font> </p> </body> </html> Figure 5. An HTML form of an XSLT analyze of the server log

Figure 6. The generated HTML page 2 The application The source code used in the log server transformation is give as follows: import java.io.; import java.lang.string; import java.net.; public class log2xml { Replace a char by a string of char in the input string @param str1 the input string @param str2 the tring used to replace the input character @param c the character to be replaced public String replacestring(string str1, String str2, char c){ String str=""; for(int i=0; i<str1.length(); i++) if (str1.charat(i)==c) str+=str2; else str+=str1.charat(i); return str; }//replacestring Build a part of the XML data @param out the output stream writer of the XML file @param IP the string of the IP address @param accessdate the string of the access date @param request the string of the visitor request @param statuscode the string of the status code @param filesize the string of the file size @param referrer the string of the referrer @param useragent the string of the user agent public void buildxmldata(outputstreamwriter out, String IP, String accessdate, String request, String statuscode, String filesize, String referrer, String useragent){ try{ out.write("<visitor IP=\""+IP+"\" accessdate=\""+accessdate+"\" request=\""+request+"\" statuscode=\""+statuscode+"\" filesize=\""+filesize+"\" referrer=\""+referrer+"\" useragent=\""+useragent+"\" />\r\n"); }catch(exception e){

System.err.println("can't write the XML file: "+e); } }//end buildxmldata Extract the user agent information @param logline a line of the server log public String extractuseragent(string logline){ String useragent=""; int i,j,k,l,m; for(j=i; logline.charat(j)!='"' && j<logline.length(); j++); j+=2;//skip " " for(k=j; logline.charat(k)!=' ' && k<logline.length(); k++); k+=1;//skip " " for(l=k; logline.charat(l)!=' ' && l<logline.length(); l++); l+=2;//skip ' "' for(m=l; logline.charat(m)!='"' && m<logline.length(); m++); m+=3;//skip ' "' for(int n=m; logline.charat(n)!='"' && n<logline.length(); n++){useragent+=logline.charat(n);} return useragent; }//end extractuseragent Extract the referrer information @param logline a line of the server log public String extractreferrer(string logline){ String referrer=""; int i,j,k,l; for(j=i; logline.charat(j)!='"' && j<logline.length(); j++); j+=2;//skip " " for(k=j; logline.charat(k)!=' ' && k<logline.length(); k++); k+=1;//skip " " for(l=k; logline.charat(l)!=' ' && l<logline.length(); l++); l+=2;//skip ' "' for(int m=l; logline.charat(m)!='"' && m<logline.length(); m++){referrer+=logline.charat(m);} return referrer; }//end extractuseragent Extract the file size information @param logline a line of the server log public String extractfilesize(string logline){ String filesize=""; int i,j,k; for(j=i; logline.charat(j)!='"' && j<logline.length(); j++); j+=2;//skip " " for(k=j; logline.charat(k)!=' ' && k<logline.length(); k++); k+=1; for(int l=k; logline.charat(l)!=' ' && l<logline.length(); l++){filesize+=logline.charat(l);} return filesize; }//end extractuseragent Extract the status code information

@param logline a line of the server log public String extractstatuscode(string logline){ String statuscode=""; int i,j; for(j=i; logline.charat(j)!='"' && j<logline.length(); j++); j+=2;//skip " " for(int k=j; logline.charat(k)!=' ' && k<logline.length(); k++){statuscode+=logline.charat(k);} return statuscode; }//end extractuseragent Extract the request information @param logline a line of the server log public String extractrequest(string logline){ String request=""; int i; for(int j=i; logline.charat(j)!='"' && j<logline.length(); j++){request+=logline.charat(j);} return request; }//end extractrequest Exract the date information @param logline a line of the server log public String extractdate(string logline){ String extractdate=""; int i; i+=6; //skip "- - [" for(int j=i; logline.charat(j)!=']' && j<logline.length(); j++){extractdate+=logline.charat(j);} return extractdate; }//end extractdate Extract the IP information @param logline a line of the server log public String extractip(string logline){ }//end extractip String extractip=""; for(int i=0; logline.charat(i)!=' ' && i<logline.length(); i++) {extractip+=logline.charat(i);} return extractip; Create the log in XML Format: <?xml version=\"1.0\"?> <ServerLog> <Visitor IP="4.33.55.30" accessdate="30/jun/2002:04:02:27 +0200" request="get /people/tayeb.lemlouma/negotiationschema/index.htm HTTP/1.0" statuscode="200" filesize="2674" referrer="-" useragent="mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Fetch API Request" /> <Visitor.. />...

<Visitor.. /> </ServerLog> @param logfilename The file name of the log. @param xmlfilename The file name of the output XML file. @param servertype The type of the server that determines the format of the log public log2xml(string logfilename, String xmlfilename, String servertype){ try { String logline; String IP; String accessdate; String request; String statuscode; String filesize; String referrer; String useragent; if(servertype.equals("apache/1.3.20")){ OutputStreamWriter out; FileOutputStream fout = new FileOutputStream(xmlFileName); out = new OutputStreamWriter(fout, "ISO-8859-1"); FileReader fr = new FileReader(logFileName); BufferedReader br = new BufferedReader(fr); out.write("<?xml version=\"1.0\"?>\r\n"); out.write("<serverlog>\r\n"); while ((logline=br.readline())!=null){ IP = extractip(logline); accessdate = extractdate(logline); request = extractrequest(logline); statuscode = extractstatuscode(logline); filesize = extractfilesize(logline); referrer = extractreferrer(logline); useragent = extractuseragent(logline); request = replacestring(request,"&", '&'); referrer = replacestring(referrer, "&", '&'); buildxmldata(out, IP, accessdate, request,statuscode, filesize, referrer, useragent); }// end while out.write("</serverlog>\r\n"); out.close(); }else{system.err.println("the server log type: "+servertype+"is not yet supported");} }catch(exception e){ }//end catch }//end public } Written to test the log2xml method public static void main(string[] args) throws Exception { System.out.println("XML file creating..."); //new log2xml("log.txt","file.xml", "Apache/1.3.20"); System.out.println("XML file created."); }//end main

3 How to run the application? 1- Download the different resources: Log2XML.class, loganalyzer.xsl, loganalyzer2.xsl 2- To transform the server log file, access_log.1, (which must be compatible with Apache/1.3.20 log format), run: java Log2XML access_log.1 3- The generated file 'output.xml' represents the XML server log. It can be so processed and used to do many analyzes. 4- To transform the XML server log to an XML file in the form of the figure 3, apply the XSLT style sheet: loganalyzer.xsl 5- To transform the XML server log to an HTML page in the form of the figure 4, apply the style sheet: loganalyzer2.xsl References [1] W3C, Extensible Markup Language (XML) 1.0, W3C Recommendation: http://www.w3.org/tr/1998/rec-xml-19980210, 10 February 1998. [2] W3C, The Extensible Stylesheet Language (XSL), http://www.w3.org/style/xsl/. [3] W3C, HyperText Markup Language, http://www.w3.org/markup/.