QueryController.java
package
information.sh.lp.web.controller;
import
information.sh.lp.infoBean.Log;
import
information.sh.lp.infoBean.LogFilter;
import
information.sh.lp.model.LogDAO;
import
information.sh.lp.web.service.BeanFactory;
import
information.sh.lp.web.service.LogReceiver;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.Calendar;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.multiaction.MultiActionController;
/**
*
*
@author
Li,
Chengri
*
*/
public
class QueryController extends
MultiActionController {
private String resultPage
;
private String detailPage
;
private String notFoundPage
;
private String invalidatePage
;
public void
setNotFoundPage(String notFoundPage){
this.notFoundPage
=notFoundPage;
}
public
String getNotFoundPage(){
return this.notFoundPage
;
}
public void
setDetailPage(String detailPage){
this.detailPage
=detailPage;
}
public
String getDetailPage(){
return this.detailPage
;
}
public void
setResultPage(String resultPage) {
this.resultPage
= resultPage;
}
public
String getResultPage() {
return this.resultPage
;
}
public
String getInvalidatePage(){
return this.invalidatePage
;
}
public void
setinvalidatePage(String invalidatePage){
this.invalidatePage
=invalidatePage;
}
/**
*
*
@param
req
*
@param
res
*
@return
Query logs according to the parameters in request.
*/
public
ModelAndView query(HttpServletRequest req, HttpServletResponse res) {
//make sure the user logged in.
String userName=(String)req.getSession().getAttribute(
"userName"
);
if(userName==null||""
.equals(userName)){
new ModelAndView(invalidatePage
);
}
long
st=Calendar.getInstance().getTimeInMillis();
ArrayList<Log> allLogs;
String order = req.getParameter(
"order"
);
String startTime = req.getParameter(
"startTime"
);
String endTime = req.getParameter(
"endTime"
);
String thread = req.getParameter(
"thread"
);
String level=
""
;
if(req.getParameter("cError")!=null
){
level+=req.getParameter(
"cError"
);
}
if(req.getParameter("cWarn")!=null
){
level+=req.getParameter(
"cWarn"
);
}
if(req.getParameter("cInfo")!=null
){
level+=req.getParameter(
"cInfo"
);
}
if(req.getParameter("cDebug")!=null
){
level+=req.getParameter(
"cDebug"
);
}
String message = req.getParameter(
"message"
);
String position = req.getParameter(
"position"
);
String pjName=req.getParameter(
"project"
);
if (startTime == null || ""
.equals(startTime)) {
startTime =
"1900-08-31 01:00:00"
;
}
if (endTime == null || ""
.equals(endTime)) {
endTime =
"2100-10-13 06:00:00"
;
}
LogFilter filter =
new
LogFilter(startTime, endTime, thread, level,message, position,order,pjName);
LogDAO lop =(LogDAO) BeanFactory.getBean(
"logDAO"
);
LogReceiver logReceiver=(LogReceiver)BeanFactory.getBean(
"logReceiver"
);
//Flush the messages in the cache
if (logReceiver.getEvents()!=null
&&!logReceiver.getEvents().isEmpty()) {
try
{
logReceiver.writeLogs(logReceiver.getEvents());
logReceiver.getEvents().clear();
}
catch
(IOException e) {
e.printStackTrace();
}
}
allLogs = lop.queryLog(filter);
if(allLogs==null
){
return new ModelAndView(this
.getNotFoundPage());
}
req.getSession().setAttribute(
"allLogs"
, allLogs);
ModelAndView mAndv =
new ModelAndView(this.getResultPage(), "allLogs"
,allLogs);
long
et=Calendar.getInstance().getTimeInMillis();
System.
out.println("Cost time:"+(et-st)/1000+"s"
);
return
mAndv;
}
public
ModelAndView list(HttpServletRequest req, HttpServletResponse res) {
ArrayList<Log> allLogs = (ArrayList<Log>) req.getSession().getAttribute(
"allLogs"
);
ModelAndView mAndv =
new ModelAndView(this.getResultPage(), "allLogs"
,allLogs);
return
mAndv;
}
public
ModelAndView detail(HttpServletRequest req, HttpServletResponse res) {
Integer recordIndex =
new Integer(req.getParameter("recordIndex"
));
ModelAndView mAndv =
new ModelAndView(this
.getDetailPage(),
"recordIndex"
, recordIndex);
return
mAndv;}}
BeanFactory.java
package
information.sh.lp.web.service;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public
class BeanFactory {
private static ApplicationContext context = null;
private static final String[] systemConfigFileName = {"citi/sh/lp/configFiles/springBean-config.xml"};
private static Exception exception;
private static synchronized ApplicationContext getApplicationContext(){
if(context==null){
try{
context=new ClassPathXmlApplicationContext(systemConfigFileName);
}
catch(Exception e){
e.printStackTrace();
exception = e;
}
}
return context;
}
public void setContext(ApplicationContext context){
BeanFactory.
context=context;
}
public static boolean isBeanExist(String beanName) {
return getApplicationContext().containsBean(beanName);
}
public static Object getBean(String beanName) {
if(exception!=null) {
return null;
}
return getApplicationContext().getBean(beanName);
}
}
LogReceiver.java
package
information.sh.lp.web.service;
import
information.sh.lp.infoBean.ContextInfo;
import
information.sh.lp.model.IndexDAO;
import
information.sh.lp.util.FileUtilTool;
import
java.io.BufferedWriter;
import
java.io.File;
import
java.io.FileWriter;
import
java.io.IOException;
import
java.text.SimpleDateFormat;
import
java.util.ArrayList;
import
java.util.Calendar;
import
java.util.HashMap;
import
java.util.Hashtable;
import
java.util.Iterator;
import
javax.jms.JMSException;
import
javax.jms.ObjectMessage;
import
javax.jms.Queue;
import
javax.jms.QueueConnection;
import
javax.jms.QueueConnectionFactory;
import
javax.jms.QueueReceiver;
import
javax.jms.QueueSession;
import
javax.jms.Session;
import
javax.naming.Context;
import
javax.naming.InitialContext;
import
javax.naming.NamingException;
public
class LogReceiver implements
Runnable {
private QueueConnectionFactory queueConnectionFactory
;
private QueueConnection queueConnection
;
private QueueSession queueSession
;
private Queue queue
;
private QueueReceiver receiver
;
private ArrayList<information.sh.lp.jms.JMSLoggingEvent> events
;
public
ArrayList<information.sh.lp.jms.JMSLoggingEvent> getEvents(){
return events
;
}
@Override
public void
run(){
Object obj;
events=new
ArrayList<information.sh.lp.jms.JMSLoggingEvent>();
System.
out.println("Starting receive log....."
);
try
{
initial();
receiver = queueSession.createReceiver(queue
);
while (true
) {
obj =
receiver
.receive();
if (obj instanceof
ObjectMessage) {
obj = ((ObjectMessage) obj).getObject();
if (obj instanceof
information.sh.lp.jms.JMSLoggingEvent) {
events
.add((information.sh.lp.jms.JMSLoggingEvent)obj);
}
if(events.size()>=ContextInfo.RECEIVER_CACHE_SIZE
){
writeLogs(
events
);
events
.clear();
}
}
}
}
catch
(NamingException namee) {
System.
out.println("naming exception"
);
namee.printStackTrace();
}
catch
(JMSException jmse) {
//If the server shutdown, there is no need to print the exception.
if(!(jmse instanceof
weblogic.jms.common.IllegalStateException)){
System.
out.println("jms exception is "
+ jmse);
jmse.printStackTrace();
}
}
catch
(IOException ioe) {
System.
out.println("io exception"
);
ioe.printStackTrace();
}
finally
{
try
{
//When the server shutdown, check the cache, if there is message then write them.
if(!events
.isEmpty()){
writeLogs(
events
);
events
.clear();
}
System.
out.println("Shut down server"
);
close();
}
catch
(JMSException e) {
e.printStackTrace();
}
catch
(IOException ioe){
ioe.printStackTrace();
}
}
}
/**
* Function: Initial queueConnectionFactory, queueConnection, queue and other variables.
*
@throws
NamingException
*
@throws
JMSException
*/
public void initial() throws
NamingException, JMSException {
Hashtable env =
new
Hashtable();
env.put(Context.
INITIAL_CONTEXT_FACTORY, ContextInfo.JNDI_FACTORY
);
env.put(Context.
PROVIDER_URL, ContextInfo.PROVIDER_URL
);
InitialContext ctx =
new
InitialContext(env);
queueConnectionFactory = (QueueConnectionFactory) ctx.lookup(ContextInfo.JMS_FACTORY
);
queueConnection = queueConnectionFactory
.createQueueConnection();
queueSession = queueConnection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE
);
queue = (Queue) ctx.lookup(ContextInfo.QUEUE
);
queueConnection
.start();
}
/**
* Function: store logs into local files
*
@param
events
*
@throws
IOException
*/
public void writeLogs(ArrayList<information.sh.lp.jms.JMSLoggingEvent> events) throws
IOException{
HashMap pjAndio=
new
HashMap();
ArrayList<File> logDirs=
new
ArrayList<File>();
Iterator i=events.iterator();
information.sh.lp.jms.JMSLoggingEvent e;
while
(i.hasNext()){
e=(information.sh.lp.jms.JMSLoggingEvent)i.next();
String projectName=e.getProjectName();
BufferedWriter bw=(BufferedWriter)pjAndio.get(projectName);
if(bw==null
){
SimpleDateFormat sdf=
new SimpleDateFormat(ContextInfo.DATE_FORMAT
);
Calendar cld=Calendar.getInstance();
cld.setTimeInMillis(e.getTimeStamp());
bw=locateFile(projectName,sdf.format(cld.getTime()));
pjAndio.put(projectName, bw);
logDirs.add(
new File(ContextInfo.DATA_DIR+"//"
+projectName));
}
String str=
""
;
String SPLITER=ContextInfo.
LOG_PROPER_SPLITER
;
SimpleDateFormat sdf=
new SimpleDateFormat(ContextInfo.DATE_FORMAT
);
Calendar cld=Calendar.getInstance();
cld.setTimeInMillis(e.getTimeStamp());
str =
""
+sdf.format(cld.getTime()) +
SPLITER+ e.getThreadName() +
SPLITER+ e.getLevel() +
SPLITER+ e.getLocationInformation().
fullInfo
+
SPLITER+ e.getMessage()+
"/n"
;
bw.write(str);
System.
out.println("Receive a message!"
+Calendar.getInstance().getTime());
}
i=pjAndio.keySet().iterator();
while
(i.hasNext()){
String value=(String)i.next();
BufferedWriter bw=(BufferedWriter)pjAndio.get(value);
bw.flush();
}
IndexDAO d=(IndexDAO)BeanFactory.getBean(
"indexDAO"
);
for(int
k=0;k<logDirs.size();k++){
File tempf=logDirs.get(k);
d.buildIndex(tempf);
}
}
/**
*
*
@param
projectName Project name
*
@param
date The current log`s start time, used to name file
*
@return
BufferedWriter, which is already wrapped by corresponding file
*
@throws
IOException
*/
public BufferedWriter locateFile(String projectName,String date) throws
IOException {
BufferedWriter bw;
File f;
f =
new File(ContextInfo.DATA_DIR
);
//root directory is not exist
if
(!f.exists()) {
//create root directory
f.mkdir();
ContextInfo.
DATA_DIR
=f.getAbsolutePath();
//create project directory
f=
new File(ContextInfo.DATA_DIR+"//"
+projectName);
f.mkdir();
String fileName=date.replace(
':', '-'
);
//create log file according to log date
f=
new File(ContextInfo.DATA_DIR+"//"+projectName+"//"+fileName+".txt"
);
bw=
new BufferedWriter(new FileWriter(f.getAbsolutePath(),true
));
}
else
{
f=
new File(ContextInfo.DATA_DIR+"//"
+projectName);
//if project directory is not exist
if
(!f.exists()||!f.isDirectory()){
f.mkdir();
String fileName=date.replace(
':', '-'
);
f=
new File(ContextInfo.DATA_DIR+"//"+projectName+"//"+fileName+".txt"
);
bw=
new BufferedWriter(new FileWriter(f.getAbsolutePath(),true
));
return
bw;
}
//find the last modified file in the project directory
ArrayList<File> files=FileUtilTool.subFiles(f);
int
index=0;
long
lastmodify=0;
for (int
i = 0; i < files.size(); i++) {
if
(files.get(index).isFile()&&files.get(i).lastModified() > lastmodify) {
lastmodify = files.get(i).lastModified();
index=i;
}
}
// if the last modified file is too large then create a new file.
if(files.get(index).length()>ContextInfo.LOG_FILE_SIZE
){
String fileName=date.replace(
':', '-'
);
f=
new File(ContextInfo.DATA_DIR+"//"+projectName+"//"+fileName+".txt"
);
bw=
new BufferedWriter(new FileWriter(f.getAbsolutePath(),true
));
return
bw;
}
bw=
new BufferedWriter(new FileWriter(files.get(index).getAbsolutePath(),true
));
}
return
bw;
}
/**
* Function: release source
*
@throws
JMSException
*/
public void close() throws
JMSException {
receiver
.close();
queueSession
.close();
queueConnection
.close();
}}
BuildIndexServlet.java
package
information.sh.lp.web.servlet;
import
information.sh.lp.model.IndexDAO;
import
information.sh.lp.web.service.BeanFactory;
import
javax.servlet.http.HttpServlet;
/**
* Servlet implementation class BuildIndexServlet
*/
public
class BuildIndexServlet extends HttpServlet {
public BuildIndexServlet() {
super();
IndexDAO indexDao=(IndexDAO)BeanFactory.getBean(
"indexDAO");
indexDao.buildIndex();
System.
out.println("Build indexes finish");
}
}
StartRecevierServlet.java
package
information.sh.lp.web.servlet;
import
information.sh.lp.web.service.BeanFactory;
import
information.sh.lp.web.service.LogReceiver;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
public
class StartRecevierServlet extends
HttpServlet {
public void init() throws
ServletException {
super
.init();
LogReceiver lr = (LogReceiver) BeanFactory.getBean(
"logReceiver"
);
Thread logReceiver =
new
Thread(lr);
System.
out.println("starting log receiver ....."
);
logReceiver.start();
System.
out.println("starting log receiver successfully"
);}}
WebInfoDispatcher.java
package
information.sh.lp.web.servlet;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.List;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
/**
* Function: Use to dispatch the request to the jsp which in the WEB
-INF file
*
@author cl69735
*
*/
public
class WebInfoDispatcher extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String jsp = request.getRequestURI();
int start = jsp.indexOf("dis_") + "dis_".length();
jsp = jsp.substring(start);
request.getRequestDispatcher(
"/WEB-INF/jsp/" + jsp).forward(request,
response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
FileAppTest.java
package
information.sh.lp;
import
information.sh.lp.jms.JMSQueueAppender;
import
information.sh.lp.jms.JmsLogger;
import
org.apache.log4j.Logger;
import
org.apache.log4j.PatternLayout;
public
class
FileAppTest {
public static Logger log
;
public static void
main(String args[]){
String pjName=
"Project12344"
;
PatternLayout layout =
new
PatternLayout();
layout.setConversionPattern(
"%5p %d (%F:%L) - %m%n"
);
JMSQueueAppender JMS_APPENDER =
new
JMSQueueAppender(layout, pjName);
JMS_APPENDER.setProviderUrl(
"t3://localhost:7001"
);
JMS_APPENDER.setInitialContextFactory(
"weblogic.jndi.WLInitialContextFactory"
);
JMS_APPENDER.setQueueBindingName(
"IbosQueue"
);
JMS_APPENDER.setQueueConnectionFactoryBindingName(
"IbosQueueConnectionFactory"
);
JMS_APPENDER.activateOptions();
log=JmsLogger.getLogger(FileAppTest.class
,JMS_APPENDER);
System.
out.println("Start"
);
for (int
i = 1; i <=10; i++) {
log.info("The info "
+ i);
}
System.
out.println("Finish"
);}}