Bootstrap listener for custom Log4J initialization in a web environment

Para aplicaciones web, Spring tiene un configurardor de log. Este se configura en el fichero web.xml. En el cual le dices:

  1. que fichero tiene la configuracion de log4j.
  2. Y cual es la clase de Spring que levanta la configuracion.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:web="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	version="2.4">
	<!-- ... -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j_pepito.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener
		</listener-class>
	</listener>
	<!-- ... -->
</web-app>
Bootstrap listener for custom Log4J initialization in a web environment

Problemas con el log en tomcat


Depuracion de log4j en el propio log


Para depurar log4j en Tomcat puedes usar -Dlog4j.debug al ejecutar tomcat.
En mi caso lo he añadido dentro de la variable JAVA_OPTS que esta en el fichero catalina.sh. Que es quien me arranca Tomcat.
Tambien se puede incluir como parte de la variable CATALINA_OPTS


ERROR Attempted to append to closed appender named


Cuando te da el error:

log4j:ERROR Attempted to append to closed appender named [pepito]

Pueden ocurrir dos cosas:

  1. has repetido el nombre de ese appender dentro de la configuracion del log.
  2. log4j se inicia dos veces. Al arrancar la primera vez, lanza el appender y le agrega los distintos loggers. Pero cuando se arranca por segunda vez… Se borra y carga de nuevo. Si tienes dos ficheros, por el motivo que sea, solo se va a cargar el que lea en 2º lugar. Evita este comportamiento.
    En mi caso, yo tenia mi fichero log4j.xml y luego mi aplicacion estaba configurada para que spring levantase el log. Aqui esta mi dualidad.
Problemas con el log en tomcat

Debuguear Tomcat en Eclipse

Necesidad:
Quiero poder debuguear los portlets que tengo en Tomcat-Liferay en mi Eclipse IDE.

Pasos:
1.- Arrancar tomcat con jpda activo:

# Arrancar tomcat con jpda activo:
/cygdrive/c/Software/liferay/liferay-portal-6.1.1-ce-ga2_depo/tomcat-7.0.27/bin/catalina.sh jpda start

2.- Configurar en eclipse en «Run Debug» un «Remote Java Aplication»:
Ir al boton Run Debug/Debug Configurations

En Remote Java Aplication boton derecho «New». En la pestaña conecction

En la pestaña source

En la pestaña common

Opciones:

# ver los logs de tomcat
tail -f /cygdrive/c/Software/liferay/liferay-portal-6.1.1-ce-ga2_depo/tomcat-7.0.27/logs/catalina.out
Debuguear Tomcat en Eclipse

Configurar Liferay para acceso SSL

Siguiendo el articulo anterior.

Tenemos que configurar [Liferay home]/webapps/ROOT/WEB-INF/web.xml. En web-app/security-constraint/user-data-constraint/transport-guarantee cambiar NONE por CONFIDENTIAL

	<security-constraint>
		<user-data-constraint>
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
		</user-data-constraint>
	</security-constraint>

Arrancar y comprueba que puedes acceder a https://localhost:8443

documentacion:
liferay

Configurar Liferay para acceso SSL

Configurar Tomcat para acceso https

1. Generamos el keystore:

keytool -genkey -v -alias tomcat -keyalg RSA -validity 3650 -keysize 2048 -keystore keystore_tomcat.jks -storepass changeit -keypass changeit

2. en $CATALINA_HOME/conf/server.xml:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" 
               redirectPort="8443" />
 		
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
        maxThreads="150" scheme="https" secure="true"
        keystoreFile="C:Softwareliferayliferay-portal-6.1.1-ce-ga2_depotomcat-7.0.27confkeystore_tomcat.jks"
        keystorePass="changeit"
        clientAuth="false" sslProtocol="TLS" />
   	
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />

ERRORES:

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-apr-8443"]
java.lang.Exception: El atribiuto del conector SSLCertificateFile debe de ser definido al usar SSL con APR
        at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:484)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:566)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:417)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:956)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:624)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:649)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:449)

abr 11, 2013 8:50:01 AM org.apache.catalina.core.StandardService initInternal
SEVERE: No pude inicializar el conector [Connector[HTTP/1.1-8443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:624)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:649)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:449)
Caused by: org.apache.catalina.LifecycleException: Falló la inicialización del manejador de protocolo
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:958)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        ... 12 more
Caused by: java.lang.Exception: El atribiuto del conector SSLCertificateFile debe de ser definido al usar SSL con APR
        at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:484)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:566)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:417)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:956)
        ... 13 more

Esto quiere decir que por defecto esta configurado el protocolo APR. Para dejar por defecto el protocolo JSSE tenemos que editar el fichero server.xml cambiando la etiqueta protocol:

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol"
               connectionTimeout="20000" 
               redirectPort="8443" />
 		
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
        maxThreads="150" scheme="https" secure="true"
        keystoreFile="C:Softwareliferayliferay-portal-6.1.1-ce-ga2_depotomcat-7.0.27confkeystore_tomcat.jks"
        keystorePass="changeit"
        clientAuth="false" sslProtocol="TLS" />
   	
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />

Arrancar y comprueba que puedes acceder a https://localhost:8443

documentacion:
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html
http://java.dzone.com/articles/ssl-your-tomcat-7

Configurar Tomcat para acceso https

java.lang.NoSuchMethodError: javax.xml.ws.WebFault.messageName()

Trabajando con Web Services me he encontrado con el siguiente error:

ERROR [http-apr-8080-exec-115][render_portlet_jsp:154] java.lang.NoSuchMethodError: javax.xml.ws.WebFault.messageName()Ljava/lang/String;

En dos proyectos identicos tengo un test en el cual en un proyecto se ejecuta sin problemas y en el otro ocurre lo de arriba. El problema proviene de las librerias que usan. En el que funciona, usa la 2.0 y en el que no funciona, la 2.7.0.

Solucion en este script:

cd $JAVA_HOME/jre/lib
mkdir endorsed
cd endorsed
wget http://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.2.7/jaxb-api-2.2.7.jar
wget http://repo1.maven.org/maven2/javax/xml/ws/jaxws-api/2.2.7/jaxws-api-2.2.7.jar

Puedes mirar en el siguiente articulo si tienes problemas con tomcat y los web services.

java.lang.NoSuchMethodError: javax.xml.ws.WebFault.messageName()