- Статьи и примеры
- | Логирование
- | Один из способов подключения log4j к j2ee приложению на cервере jboss 4.2
Один из способов подключения Log4j к J2EE приложению на cервере JBoss 4.2
Сервер приложений 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
- jbossall-client.jar
- jboss-ejb3x.jar
- log4j.jar
- 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;
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.");
}
}

