MICROGAMES.RU v.2

Новости, примеры, статьи о программировании

-10
-1
-6
-7
Java Java
up C++
up PHP
up Perl

Один из способов подключения Log4j к J2EE приложению на cервере JBoss 4.2 Страница 1.

Сервер приложений JBoss в качестве системы логирования использует framework Apache Log4j. Основные настройки сервиса Log4j находятся в файле jboss\server\default\conf\jboss-service.xml в разделе Log4j Initialization.

Здесь можно задать несколько важных параметров, в том числе и ConfigurationUrl — местонахождение файла конфигурации сервиса Log4j. Сам файл конфигурации по умолчанию называется jboss-log4j.xml и находится в этой же папке.

Если у Вас есть полный доступ к управлению сервером, то самым простым способом подключить Log4j к приложению будет добавление конфигурации логов в этот файл. В случае отсутствия доступа к конфигурации сервера или если необходимо запускать несколько приложений на одном сервере или другой причине, создать собственный файл конфигурации и подгружать его при запуске приложения.

Один из возможных способов это сделать, показан ниже. На примере сервлета, класса и бина управляемого сообщениями:

Итак, сервер приложений JBoss4.2, Среда разработки Eclipse Средство автоматической сборки приложений Apache Ant.

Создадим в Eclipse новый java проект. Я назвал его JBoss_Log4j. Исходники будут в папке src скомпилированные файлы в папке bin.

Создадим папку lib, скопируем в нее несколько библиотек из сервера JBoss

  1. jbossall-client.jar
  2. jboss-ejb3x.jar
  3. log4j.jar
  4. servlet-api.jar

Приступим.
Начнем, пожалуй, с бина управляемого сообщениями — JBossLog4jTestMDB — так как он самый простой.

	
 package jboss_log4j.ejb;

 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.ejb.ActivationConfigProperty;
 import javax.ejb.MessageDriven;
 import javax.jms.Message;
 import jboss_log4j.common.Log4jServletInit;
 import org.jboss.logging.Logger;

 @MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue="queue/JBossLog4jTestMDBQueue")}) 
	public class JBossLog4jTestMDB  implements javax.jms.MessageListener{

		private static final long serialVersionUID = 1L;
		private static Logger logger=Log4jServletInit.getLogger(JBossLog4jTestMDB.class,"/META-INF/log4j.xml");
		// hash code of this object:
		private int hashCode;

		@PostConstruct
		public void ejbCreate() {
			hashCode = this.hashCode();
			logger.info("JBossLog4jTestMDB created: " + hashCode);
		}

		@PreDestroy
		public void ejbRemove() {
			logger.info("JBossLog4jTestMDB removed: " + hashCode);
		}	

		public void onMessage(Message message) {
			logger.debug("->Start, thread ID: " + Thread.currentThread().getId());
			logger.info("Message received: "+message);
		}
	}

Строчки, которые относятся к Log4j и непосредственно логированию, в этом и последующих примерах выделены зеленым цветом.

Теперь добавим следующий класс:

	
 package jboss_log4j;

 import java.util.Hashtable;
 import java.util.Map;
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageProducer;
 import javax.jms.Queue;
 import javax.jms.QueueSession;
 import javax.jms.Session;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import jboss_log4j.common.Log4jServletInit;
 import org.jboss.logging.Logger;

 public class JBossLog4jTest {

  private static Logger logger = Log4jServletInit.getLogger(JBossLog4jTest.class, "/META-INF/log4j.xml");

  public JBossLog4jTest() {
   super();
  }

  public void sendMessage(String traced_value) {
   logger.info("sendMessage start..");

   // send the message via controller queue
   logger.info("Traced Value :"+traced_value);
   Map messageParams = new Hashtable();
   messageParams.put("traced_value", traced_value);
   messageParams.put("my_message", "Hello from JBossLog4jTest");
   // create a connection to a controller queue 
   Connection connection = null;
   Session session = null;
   MessageProducer producer = null;
   Context ctx;
   ConnectionFactory connectionFactory;
   Queue controllerQueue;
   try {

    ctx = new InitialContext();
    connectionFactory = (ConnectionFactory)ctx.lookup("ConnectionFactory");
    logger.debug("ConnectionFactory ready.");
    controllerQueue	= (Queue)ctx.lookup("queue/JBossLog4jTestMDBQueue");
    logger.debug("Queue ready.");
    connection 	= connectionFactory.createConnection();
    session	= connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    producer = session.createProducer(controllerQueue);	
    logger.debug("MessageProducer ready.");
    Message message	= session.createMessage();
    for (String key : messageParams.keySet()) {
     message.setStringProperty(key, messageParams.get(key));
    }
    // specify a message expiration
    int messageTTL		= 10*1000;	// 10 sec
    message.setJMSExpiration(messageTTL);

    // send a message
    producer.send(message);			
   } catch (NamingException e) {
    logger.error("NamingException: "+e.getMessage());
    e.printStackTrace();
   } catch (JMSException e) {
    logger.error("JMSException: "+e.getMessage());
    e.printStackTrace();
   }
   logger.info("Message successfully sent.");		
  }

 }

Как видим — из этого класса мы будем посылать сообщения ранее созданному бину управляемому сообщениями.

Ну и, наконец, напишем сервлет.

	
 package jboss_log4j.servlet;

 import java.io.IOException;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import jboss_log4j.JBossLog4jTest;
 import jboss_log4j.common.Log4jServletInit;
 import org.jboss.logging.Logger;

 public class JBossLog4jTestServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

  private static final long serialVersionUID = 1L;
  private static Logger logger = Log4jServletInit.getLogger(JBossLog4jTestServlet.class, "/WEB-INF/log4j.xml");

  public void init(ServletConfig config) throws ServletException {
   super.init(config);
   logger.info(config.getServletName() + " inited...");
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   logger.info("GEOServlet doGet started...");
   response.setContentType("text/html");
   ServletOutputStream out = response.getOutputStream();

   StringBuffer buff = new StringBuffer();
   buff.append("<html><head>");
   buff.append("<title>JBossLog4jTestServlet</title></head><body>");
   buff.append("<h2 style=\"color: #004E98;\">" 
   + "JBossLog4jTestServlet start..</h2>");
   buff.append("<form method=\"post\" action=\""
   + request.getContextPath()
   + "/JBossLog4jTestServlet\" style=\"width:100%;"
   +"padding:4px;margin:4pa;background-color:#eee\">"
   +"<p>Trace this value.</p><input type=\"text\" "
   +"name=\"traced_value\" value=\"777\" /><br />"
   + "<input type=\"submit\" value=\"submit\" /></form>");
   buff.append("</body></html>");
   out.println(buff.toString());
   out.close();
   logger.info("GEOServlet doGet finished...");
  }

  protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
   logger.info("JBossLog4jTestServlet doPost started...");
   String traced_value = request.getParameter("traced_value");
   logger.info("Traced value: " + traced_value);
   JBossLog4jTest jBossLog4jTest = new JBossLog4jTest();
   jBossLog4jTest.sendMessage(traced_value);
  }
 }

Страницы: 123

Новое сообщение

  Имя
  Email (не обязательно)
  Номер

Microgames.ru v.2 - Новости, примеры, статьи о программировании.
Сделано в 2006 году. Перевыпущен в 2008 году.
Сайт содержит оригинальные материалы и переводы.
Сообщения об ошибках просьба присылать по адресу: contact@microgames.ru