Usando o SLF4J no Community Edition
O Simple Logging Facade for Java (SLF4J) serve como uma fachada simples para várias APIs de criação de log, que permite a conexão na implementação desejada no tempo de implementação. O SLF4j não inventa outra estrutura de criação de log, mas permite que o aplicativo use uma API padrão e seja conectado na implementação de criação de log real no tempo de implementação.
O SLF4j suporta vários sistemas de criação de log, tais como, NOP, Simple, Log4j versão 1.2, java.util.logging, JCL e logback. A distribuição SLF4j é fornecida com vários arquivos JAR:
-
slf4j-nop.jar
-
slf4j-simple.jar
-
slf4j-log4j12.jar
-
slf4j-log4j13.jar
-
slf4j-jdk14.jar
-
slf4j-jcl.jar.
Cada um destes arquivos jar é conectado fisicamente no tempo de compilação para usar apenas uma implementação. Todas as ligações fornecidas com o SLF4j dependem do slf4j-api.jar, que deve estar presente no caminho da classe para que a ligação funcione corretamente. Ele também fornece um caminho de migração para aplicativos que usam implementações de criação de log concretas usando módulos de ponte. O Community Edition é fornecido com estas bibliotecas que podem ser usadas em aplicativos:
-
slf4j-api-1.4.3.jar
-
slf4j-log4j12-1.4.3.jar
-
jcl104-over-slf4j-1.4.3.jar
Nesta seção, mostramos o uso do SLF4j das seguintes maneiras.
-
Configurar o SLF4j para usar a configuração de Log4j do servidor
-
Configurar o SLF4j usando Log4j no nível do aplicativo
Configurar o SLF4j para usar a configuração de Log4j do servidor
Nesta seção, usamos a API do SLF4j no servlet EMPDemo em vez da API Log4j.
No entanto, ele usa a implementação de Log4j configurada no nível do servidor para
implementação concreta. A Listagem 15 mostra o código do servlet:
Listagem 15. Esquema Servlet EMPDemo usando a API do SLF4j
Logger logger = LoggerFactory.getLogger(EMPDemo.class.getName());
Connection con = null;
Statement stmt = null;
PrintWriter out = response.getWriter();
logger.info("Created the PrintWriter on the Response object");
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:comp/env");
logger.info("Got environment context: "+envContext);
DataSource ds = (DataSource)envContext.lookup("jdbc/DataSource");
logger.info("Got DataSource: "+ds.toString());
con = ds.getConnection();
logger.info("Got Connection: "+con.toString() +"\n");
stmt = con.createStatement();
logger.info("Created the statement: " +stmt);
ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEE");
logger.info("Gto the result set: " +rs);
logger.info("Table EMP after SELECT:");
out.println("Your EMP table contains the following entries:<BR>");
out.println("<table>");
out.println("<tr>");
out.println("<th>Empno</th>");
out.println("<th>Name</th>");
out.println("<th>Job</th>");
out.println("<th>Manager</th>");
out.println("<th>Salary</th>");
out.println("<th>Commission</th>");
out.println("<th>Deptno</th>");
out.println("</tr>");
while (rs.next()) {
String emp = rs.getString("EMPNO");
String name = rs.getString("ENAME");
String job = rs.getString("JOB");
String mgr = rs.getString("MGR");
String sal = rs.getString("SAL");
String comm = rs.getString("COMM");
String dept = rs.getString("DEPTNO");
out.println("<tr>");
out.println("<td>"+emp+"</td>");
out.println("<td>"+name+"</td>");
out.println("<td>"+job+"</td>");
out.println("<td>"+mgr+"</td>");
out.println("<td>"+sal+"</td>");
out.println("<td>"+comm+"</td>");
out.println("<td>"+dept+"</td>");
out.println("</tr>");
logger.info(emp + " " + name + " " +job);
logger.info(" " + mgr + " " + dept);
}
out.println("</table>");
rs.close();
stmt.close();
con.close();
logger.trace("Trace");
logger.debug("Debug");
logger.info("Info");
logger.warn("Warn");
logger.error("Error");
}
catch(java.lang.Exception e) {
e.printStackTrace();
logger.error(e.getClass().getName());
logger.error(e.getMessage());
}
|
A Listagem 16 mostra as dependências declaradas para o SLF4j no plano de implementação do aplicativo do Community Edition (geronimo-web.xml).
Listagem 16. Função O arquivo geronimo-web.xml com dependências para SLF4j
<dependencies>
…………
…………
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.4.3</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.4.3</version>
<type>jar</type>
</dependency>
</dependencies>
|
Siga estas etapas para implementar e executar o aplicativo:
- A partir da amostra
faça download, descompacte o arquivo ZIP do aplicativo. O arquivo war é
Log4j-SLF4j-WEB.war.
-
Implemente o aplicativo.
<wasce_home>/bin>deploy --user system –-password manager deploy Log4j-SLF4j-WEB.war
-
Acesse o servlet EMPDemo em http://localhost:8080/Log4j-SLF4j-WEB/EMPDemo.
A Listagem 17 mostra as mensagens de log que são exibidas no console do servidor:
Listagem 17. Mensagens do console do servidor
10:25:18,593 WARN [EMPDemo] Warn
10:25:18,593 ERROR [EMPDemo] Error
|
Estas mensagens são exibidas porque o nível de log do ConsoleAppender está configurado como WARN no arquivo server-log4j.properties . Portanto, apenas as mensagens de log com o nível de log WARN ou acima são registradas no console. No entanto, é possível ver se todas as mensagens de log estão registradas no arquivo server.log .
Configurar o SLF4j usando Log4j no nível do aplicativo
Nesta seção, configuramos o SLF4j para usar a Log4j configurada no nível do aplicativo
para o servlet EMPDemo. O código do servlet na Listagem 13 não é alterado.
No entanto, o aplicativo é fornecido com um arquivo log4j.properties que substitui a configuração de Log4j no nível do servidor. O servlet EMPDemo usa a API do SLF4j para registrar as mensagens. A Listagem 18 mostra o arquivo log4j.properties :
Listagem 18. O arquivo log4j.properties
log4j.logger.com.ibm.sample=debug,applog
log4j.appender.applog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.applog.File=C:/temp/applevellogging/SLF4j/java.log
log4j.appender.applog.layout=org.apache.log4j.PatternLayout
log4j.appender.applog.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}] %m%n
|
Este arquivo log4j.properties configura o serviço de Log4j para usar DailyRollingFileAppender para registrar mensagens no arquivo C:/temp/applevellogging/SLF4j/java.log . Ele usa o formato do Community Edition usado para registrar mensagens.
A Listagem 19 mostra a parte relevante do plano de plano de implementação do Community Edition
(geronimo-web.xml) para o aplicativo:
Listagem 19. Plano de implementação do aplicativo do Community Edition
<dep:environment>
…………………
…………………
<dependencies>
…………………
…………………
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.4.3</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.4.3</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<type>jar</type>
</dependency>
</dependencies>
<hidden-classes>
<filter>org.apache.log4j</filter>
</hidden-classes>
</dep:environment>
|
O plano de implementação declara uma dependência das bibliotecas Log4j e SLF4j e oculta o pacote Log4j do carregador de classe pai. Siga estas etapas para implementar o aplicativo.
-
Faça download do aplicativo e salve-o em um diretório. O nome do arquivo WAR é
Log4j-SLF4j-AppLevel-WEB.war.
-
Implemente o aplicativo.
<wasce_home>/bin>deploy –user system –password manager deploy Log4j-SLF4j-AppLevel-WEB.war.
-
Acesse o servlet EMPDemo em http://localhost:8080/Log4j-SLF4j-WEB/EMPDemo.
É possível ver se não existem mensagens registradas no console do servidor ou no arquivo server.log . No entanto, o aplicativo cria o arquivo C:/temp/applevellogging/SLF4j/java.log e registra a mensagem conforme configurada.
|