Blog

Liferay/Tomcat Bundle – Logging mal richtig

Wer möchte wissen, wie man Liferay und Tomcat in Punkto Logging richtig verbindet? Jeder vernünftig denkende Mensch, der gerade wissen möchte, wie man Liferay und Tomcat in Punkto Logging richtig verbindet.

Ganz generell

Also, ich habe mich mal mit den Logging-Details von Liferay und Tomcat beschäftigt und muss sagen: das geht besser! Evaluiert habe ich Liferay 6.0.6 im Bundle mit Tomcat 6.0.29. Eine momentan sehr gängige Kompilation, da Liferay 6.1 noch sehr jung ist und man sich Kinderkrankheiten nicht gerne mit an Bord holt.

Tomcat

Sehr interessant. Tomcat ist aus dem Hause Apache. Der wahrscheinliche gängigste Logger ist log4j und kommt aus dem Hause… Apache. Also wird Tomcat ausgeliefert mit… richtig, java.util.logging. [Metapher von der Redaktion zensiert.] In Tomcat ist das Logging über eine dünne Zwischenschicht realisiert – JULI. JULI ist eigentlich nur das bekannte Commons Logging aus dem Hause… Apache – allerdings in einem anderen Java Package, damit auch ja jeder sein eigenes Commons Logging mitbringt und ja nichts modular ist. Was soll’s, der Tomcat ist trotzdem recht gut. Außerdem gibt es ja die „Extras“, in denen eine JULI –Variante existiert, mit der auch log4j funktioniert.

Liferay

Liferay bringt sein eigenes Logging mit – natürlich Apache log4j. Aber ich wäre nicht ich, wenn ich hier nichts Negatives anzumerken hätte: Wenn man Liferay im Bundle mit Tomcat ausliefert und Tomcat von Haus aus nur java.util.logging mitbringt, wobei aber log4j als Logger möglich ist, und Liferay eh log4j enthält, warum kann man das nicht alles verbinden und Liferay im Bundle mit Tomcat gleich mit einem schlüssigen Logging-Gesamtkonzept ausliefern? Richtig, weil Liferay in Wahrheit die Eierlegende-Wollmilchsau-Web-Applikation sein soll. Und trotzdem sind Mühen in Anpassungen des Tomcats im Bundle geflossen. Huch, den letzten Satz streichen!

Und jetzt zusammen

Nun, die Richtung ist soweit klar: Tomcat und Liferay sollen beide mit log4j arbeiten, und am besten noch mit demselben, d.h., die log4j-Bibliothek soll nur einmal in der gesamten ClassLoader-Hierarchie existieren. Dafür muss man nicht viel machen, man verschiebt einfach nur die entsprechende Jar-Datei von $CATALINA_HOME/webapps/ROOT/WEB-INF/lib/log4j.jar nach $CATALINA_HOME/lib. Als nächstes brauchen wir die alternative JULI-Variante aus den Tomcat-Extras, damit log4j auch von Tomcat und nicht nur von Liferay erkannt wird. Zwei Dateien sind notwendig:

  • tomcat-juli.jar -> $CATALINA_HOME/bin
  • tomcat-juli-adapters.jar -> $CATALINA_HOME/lib

Und für die Funktionstüchtigkeit von log4j brauchen wir noch eine log4j.properties-Datei. Diese legen wir ebenfalls in $CATALINA_HOME/lib. Hier habe ich mal eine Beispieldatei:

#
# Default properties (can be referenced)
#

default.DatePattern='.'yyyy-MM-dd
default.ConversionPattern=%d{HH:mm:ss.SSS} %p [%c{1}:%L] %m%n

#
# Appenders
#

log4j.appender.ROOT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROOT.File=${catalina.base}/logs/root.log
log4j.appender.ROOT.Append=true
log4j.appender.ROOT.Encoding=UTF-8
log4j.appender.ROOT.DatePattern=${default.DatePattern}
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=${default.ConversionPattern}

# The appender below is an example for a special purpose logger
#log4j.appender.CATALINE/LOCALHOST=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.CATALINE/LOCALHOST.File=${catalina.base}/logs/catalina-localhost.log
#log4j.appender.CATALINE/LOCALHOST.Append=true
#log4j.appender.CATALINE/LOCALHOST.Encoding=UTF-8
#log4j.appender.CATALINE/LOCALHOST.DatePattern=${default.DatePattern}
#log4j.appender.CATALINE/LOCALHOST.layout=org.apache.log4j.PatternLayout
#log4j.appender.CATALINE/LOCALHOST.layout.ConversionPattern=${default.ConversionPattern}

#
# Loggers
#

log4j.rootLogger=INFO, ROOT

# The logger below is an example for a special purpose
#log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, CATALINE/LOCALHOST
#log4j.additivity.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=false

Ok, fast geschafft. In Liferay ist natürlich noch eine unglaublich clevere log4j-Konfigurationslogik hinterlegt, die es auszuhebeln gilt. In der system.properties-Datei in $CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar ist ein Property zu finden, das dafür sorgt, dass log4j von Liferay konfiguriert wird: „log4j.configure.on.startup“. Natürlich setzen wir dieses auf „false“. Wir kommen einem schlüssigen Gesamtkonzept immer näher. Um java.util.logging daran zu hindern, für Tomcat initialisiert zu werden, muss noch die Datei $CATALINA_HOME/conf/logging.properties entfernt werden.

Wenn man jetzt Tomcat startet, dann bekommt man… 500kB Log-Nachrichten? Ja, heutige Applikationen sind unglaublich geschwätzig. Als wir Liferay daran gehindert haben, log4j für sich zu konfigurieren, haben wir auch die Priority pro Logger auf Standard gelassen (INFO). Mit einem kleinen Tool können wir sämtliche Priority- und Logger-Einstellungen aus der META-INF/portal-log4j.xml-Datei in $CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar extrahieren.

package noorg;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Iterator;

import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Log4jXml2Properties {

	public static void main(String[] args) throws Exception {
		InputStream in = null;
		try {
			in = new FileInputStream("portal-log4j.xml");
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			dbf.setNamespaceAware(true);
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document d = db.parse(in);
			XPathFactory xpf = XPathFactory.newInstance();
			XPath xp = xpf.newXPath();
			xp.setNamespaceContext(new NamespaceContext() {

				@Override
				public String getNamespaceURI(String prefix) {
					return "http://jakarta.apache.org/log4j/";
				}

				@Override
				public String getPrefix(String namespaceURI) {
					return "log4j";
				}

				@Override
				public Iterator<String> getPrefixes(String namespaceURI) {
					return Arrays.asList("log4j").iterator();
				}
			});
			NodeList categories = (NodeList) xp.evaluate("/log4j:configuration/category", d, XPathConstants.NODESET);
			for (int i = 0; i < categories.getLength(); ++i) {
				Node category = categories.item(i);
				String name = (String) xp.evaluate("@name", category, XPathConstants.STRING);
				String priority = (String) xp.evaluate("priority/@value", category, XPathConstants.STRING);
				System.out.println("log4j.logger." + name + "=" + priority);
			}
		} finally {
			if (in != null)
				try {
					in.close();
				} catch (IOException ignore) {}
		}
	}
}

Und hier das Endergebnis als log4j.properties:

#
# Default properties (can be referenced)
#

default.DatePattern='.'yyyy-MM-dd
default.ConversionPattern=%d{HH:mm:ss.SSS} %p [%c{1}:%L] %m%n

#
# Appenders
#

log4j.appender.ROOT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROOT.File=${catalina.base}/logs/root.log
log4j.appender.ROOT.Append=true
log4j.appender.ROOT.Encoding=UTF-8
log4j.appender.ROOT.DatePattern=${default.DatePattern}
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=${default.ConversionPattern}

# The appender below is an example for a special purpose logger
#log4j.appender.CATALINE/LOCALHOST=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.CATALINE/LOCALHOST.File=${catalina.base}/logs/catalina-localhost.log
#log4j.appender.CATALINE/LOCALHOST.Append=true
#log4j.appender.CATALINE/LOCALHOST.Encoding=UTF-8
#log4j.appender.CATALINE/LOCALHOST.DatePattern=${default.DatePattern}
#log4j.appender.CATALINE/LOCALHOST.layout=org.apache.log4j.PatternLayout
#log4j.appender.CATALINE/LOCALHOST.layout.ConversionPattern=${default.ConversionPattern}

#
# Loggers
#

log4j.rootLogger=INFO, ROOT

# The logger below is an example for a special purpose
#log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, CATALINE/LOCALHOST
#log4j.additivity.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=false

#
# Categories and priorities
#

log4j.logger.com.ecyrd.jspwiki=ERROR
log4j.logger.com.germinus.easyconf=ERROR
log4j.logger.com.liferay=ERROR
log4j.logger.com.liferay.documentlibrary=ERROR
log4j.logger.com.liferay.documentlibrary.util=ERROR
log4j.logger.com.liferay.documentlibrary.util.CMISHook=INFO
log4j.logger.com.liferay.documentlibrary.util.DLIndexer=ERROR
log4j.logger.com.liferay.documentlibrary.util.HookFactory=ERROR
log4j.logger.com.liferay.jdbc=ERROR
log4j.logger.com.liferay.mail.service.impl.MailServiceImpl=ERROR
log4j.logger.com.liferay.mail.util=ERROR
log4j.logger.com.liferay.mail.util.DummyHook=ERROR
log4j.logger.com.liferay.mail.util.HookFactory=ERROR
log4j.logger.com.liferay.mail.util.MailSessionFactoryBean=ERROR
log4j.logger.com.liferay.portal.action.JSONServiceAction=INFO
log4j.logger.com.liferay.portal.action.LayoutAction=WARN
log4j.logger.com.liferay.portal.bean.BeanLocatorImpl=WARN
log4j.logger.com.liferay.portal.cache=WARN
log4j.logger.com.liferay.portal.cache.ehcache.EhcachePortalCacheManager=ERROR
log4j.logger.com.liferay.portal.cache.ehcache.LiferayBootstrapCacheLoaderFactory=INFO
log4j.logger.com.liferay.portal.cache.ehcache.LiferayCacheEventListenerFactory=INFO
log4j.logger.com.liferay.portal.cache.ehcache.LiferayCacheManagerPeerProviderFactory=INFO
log4j.logger.com.liferay.portal.captcha.CaptchaImpl=INFO
log4j.logger.com.liferay.portal.cluster=INFO
log4j.logger.com.liferay.portal.convert=DEBUG
log4j.logger.com.liferay.portal.dao.db=INFO
log4j.logger.com.liferay.portal.dao.db.BaseDB=INFO
log4j.logger.com.liferay.portal.dao.jdbc.aop=ERROR
log4j.logger.com.liferay.portal.dao.jdbc.pool=ERROR
log4j.logger.com.liferay.portal.dao.jdbc.util.DataSourceFactoryBean=INFO
log4j.logger.com.liferay.portal.dao.orm.common.SQLTransformer=ERROR
log4j.logger.com.liferay.portal.dao.orm.hibernate.SessionFactoryImpl=ERROR
log4j.logger.com.liferay.portal.dao.shard=ERROR
log4j.logger.com.liferay.portal.deploy=INFO
log4j.logger.com.liferay.portal.deploy.hot.HookHotDeployListener=INFO
log4j.logger.com.liferay.portal.deploy.hot.PluginPackageHotDeployListener=ERROR
log4j.logger.com.liferay.portal.deploy.hot.ThemeLoaderHotDeployListener=ERROR
log4j.logger.com.liferay.portal.deploy.hot.messaging.HotDeployMessageListener=ERROR
log4j.logger.com.liferay.portal.editor=ERROR
log4j.logger.com.liferay.portal.editor.fckeditor.ConnectorAction=ERROR
log4j.logger.com.liferay.portal.events.EventsProcessor=ERROR
log4j.logger.com.liferay.portal.events.FixOracleAction=INFO
log4j.logger.com.liferay.portal.events.GarbageCollectorAction=ERROR
log4j.logger.com.liferay.portal.events.LogMemoryUsageAction=DEBUG
log4j.logger.com.liferay.portal.events.LoginPostAction=ERROR
log4j.logger.com.liferay.portal.events.LoginPreAction=ERROR
log4j.logger.com.liferay.portal.events.LogoutPostAction=ERROR
log4j.logger.com.liferay.portal.events.LogoutPreAction=ERROR
log4j.logger.com.liferay.portal.events.LogSessionIdAction=DEBUG
log4j.logger.com.liferay.portal.events.LogThreadCountAction=DEBUG
log4j.logger.com.liferay.portal.events.ServicePreAction=ERROR
log4j.logger.com.liferay.portal.events.ShutdownHook=ERROR
log4j.logger.com.liferay.portal.events.StartupAction=ERROR
log4j.logger.com.liferay.portal.events.StartupHelper=INFO
log4j.logger.com.liferay.portal.image.HookFactory=ERROR
log4j.logger.com.liferay.portal.image.ImageProcessorImpl=ERROR
log4j.logger.com.liferay.portal.image.SpriteProcessorImpl=WARN
log4j.logger.com.liferay.portal.kernel.bean.PortalBeanLocatorUtil=ERROR
log4j.logger.com.liferay.portal.kernel.cache.cluster.BasePortalCacheClusterChannel=WARN
log4j.logger.com.liferay.portal.kernel.dao.orm.QueryUtil=WARN
log4j.logger.com.liferay.portal.kernel.deploy=INFO
log4j.logger.com.liferay.portal.kernel.servlet.PortletContextListener=INFO
log4j.logger.com.liferay.portal.kernel.servlet.ServletContextPool=ERROR
log4j.logger.com.liferay.portal.kernel.servlet.ServletContextUtil=INFO
log4j.logger.com.liferay.portal.kernel.upgrade=INFO
log4j.logger.com.liferay.portal.kernel.util.JavaProps=ERROR
log4j.logger.com.liferay.portal.kernel.util.ServerDetector=INFO
log4j.logger.com.liferay.portal.lar=ERROR
log4j.logger.com.liferay.portal.lucene=INFO
log4j.logger.com.liferay.portal.lucene.IndexWriterFactory=INFO
log4j.logger.com.liferay.portal.lucene.LuceneFileExtractor=ERROR
log4j.logger.com.liferay.portal.model.Image=ERROR
log4j.logger.com.liferay.portal.model.ModelHintsImpl=ERROR
log4j.logger.com.liferay.portal.plugin.PluginPackageUtil=INFO
log4j.logger.com.liferay.portal.pop=ERROR
log4j.logger.com.liferay.portal.sanitizer.DummySanitizerImpl=ERROR
log4j.logger.com.liferay.portal.scheduler.quartz.PortalJobStore=ERROR
log4j.logger.com.liferay.portal.search.lucene.LuceneIndexSearcherImpl=ERROR
log4j.logger.com.liferay.portal.security.auth.CASAutoLogin=WARN
log4j.logger.com.liferay.portal.security.auth.LDAPAuth=WARN
log4j.logger.com.liferay.portal.security.auth.OpenSSOAutoLogin=WARN
log4j.logger.com.liferay.portal.security.auth.PrincipalThreadLocal=ERROR
log4j.logger.com.liferay.portal.security.auth.ScreenNameGeneratorFactory=ERROR
log4j.logger.com.liferay.portal.security.auth.ScreenNameValidatorFactory=ERROR
log4j.logger.com.liferay.portal.security.auth.SiteMinderAutoLogin=WARN
log4j.logger.com.liferay.portal.security.ldap=ERROR
log4j.logger.com.liferay.portal.security.ldap.PortalLDAPUtil=ERROR
log4j.logger.com.liferay.portal.security.permission.AdvancedPermissionChecker=ERROR
log4j.logger.com.liferay.portal.security.permission.BasicPermissionChecker=INFO
log4j.logger.com.liferay.portal.security.permission.ResourceActionsUtil=WARN
log4j.logger.com.liferay.portal.security.pwd.RegExpToolkit=WARN
log4j.logger.com.liferay.portal.service.impl.LayoutLocalServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.impl.PermissionLocalServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.impl.PortalLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.PortalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.PortletLocalServiceImpl=WARN
log4j.logger.com.liferay.portal.service.impl.ReleaseLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.ResourceLocalServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.impl.ServiceComponentLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.ThemeLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.ThemeServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.persistence.PermissionPool=ERROR
log4j.logger.com.liferay.portal.service.persistence.ResourcePool=ERROR
log4j.logger.com.liferay.portal.servlet=ERROR
log4j.logger.com.liferay.portal.servlet.FriendlyURLServlet=ERROR
log4j.logger.com.liferay.portal.servlet.ImageServlet=ERROR
log4j.logger.com.liferay.portal.servlet.LanguageServlet=WARN
log4j.logger.com.liferay.portal.servlet.LuceneServlet=INFO
log4j.logger.com.liferay.portal.servlet.MainServlet=ERROR
log4j.logger.com.liferay.portal.servlet.PortalSessionCreator=ERROR
log4j.logger.com.liferay.portal.servlet.PortalSessionDestroyer=ERROR
log4j.logger.com.liferay.portal.servlet.SharedSessionUtil=ERROR
log4j.logger.com.liferay.portal.servlet.SoftwareCatalogServlet=ERROR
log4j.logger.com.liferay.portal.servlet.filters=ERROR
log4j.logger.com.liferay.portal.servlet.filters.autologin.AutoLoginFilter=ERROR
log4j.logger.com.liferay.portal.servlet.filters.cache=ERROR
log4j.logger.com.liferay.portal.servlet.filters.doubleclick=ERROR
log4j.logger.com.liferay.portal.servlet.filters.fragment=ERROR
log4j.logger.com.liferay.portal.servlet.filters.gzip=ERROR
log4j.logger.com.liferay.portal.servlet.filters.language=ERROR
log4j.logger.com.liferay.portal.servlet.filters.minifier=ERROR
log4j.logger.com.liferay.portal.servlet.filters.sessionid.SessionIdFilter=ERROR
log4j.logger.com.liferay.portal.servlet.filters.sessionid.SessionIdServletRequest=ERROR
log4j.logger.com.liferay.portal.servlet.filters.strip=ERROR
log4j.logger.com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter=ERROR
log4j.logger.com.liferay.portal.spring=ERROR
log4j.logger.com.liferay.portal.spring.context.ArrayApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.context.PortalApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.context.PortletApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.context.TunnelApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.hibernate.DialectDetector=INFO
log4j.logger.com.liferay.portal.spring.jpa.DatabaseDetector=INFO
log4j.logger.com.liferay.portal.spring.jpa.LocalContainerEntityManagerFactoryBean=INFO
log4j.logger.com.liferay.portal.struts=ERROR
log4j.logger.com.liferay.portal.struts.MultiMessageResources=ERROR
log4j.logger.com.liferay.portal.struts.PortalRequestProcessor=ERROR
log4j.logger.com.liferay.portal.struts.PortletRequestProcessor=WARN
log4j.logger.com.liferay.portal.struts.StrutsURLEncoder=ERROR
log4j.logger.com.liferay.portal.struts.StrutsUtil=ERROR
log4j.logger.com.liferay.portal.theme.ThemeLoader=INFO
log4j.logger.com.liferay.portal.tools.BaseDeployer=INFO
log4j.logger.com.liferay.portal.tools.DBUpgrader=ERROR
log4j.logger.com.liferay.portal.tools.PortletDeployer=INFO
log4j.logger.com.liferay.portal.tools.ThemeDeployer=INFO
log4j.logger.com.liferay.portal.tools.sql=INFO
log4j.logger.com.liferay.portal.upgrade=INFO
log4j.logger.com.liferay.portal.upgrade.UpgradeProcessUtil=INFO
log4j.logger.com.liferay.portal.util=ERROR
log4j.logger.com.liferay.portal.util.CookieKeys=ERROR
log4j.logger.com.liferay.portal.util.EntityResolver=ERROR
log4j.logger.com.liferay.portal.util.FileImpl=WARN
log4j.logger.com.liferay.portal.util.HttpImpl=INFO
log4j.logger.com.liferay.portal.util.MaintenanceUtil=DEBUG
log4j.logger.com.liferay.portal.util.MimeTypesUtil=ERROR
log4j.logger.com.liferay.portal.util.PortalInstances=ERROR
log4j.logger.com.liferay.portal.util.PortalImpl=INFO
log4j.logger.com.liferay.portal.velocity=ERROR
log4j.logger.com.liferay.portal.velocity.ClassLoaderVelocityResourceListener=ERROR
log4j.logger.com.liferay.portal.velocity.LiferayResourceLoader=ERROR
log4j.logger.com.liferay.portal.velocity.ServletVelocityResourceListener=ERROR
log4j.logger.com.liferay.portal.verify=INFO
log4j.logger.com.liferay.portal.verify.VerifyUser=INFO
log4j.logger.com.liferay.portal.webdav=ERROR
log4j.logger.com.liferay.portal.xml.SAXReaderImpl=WARN
log4j.logger.com.liferay.portlet.InvokerPortlet=ERROR
log4j.logger.com.liferay.portlet.PortletPreferencesImpl=ERROR
log4j.logger.com.liferay.portlet.RenderRequestFactory=ERROR
log4j.logger.com.liferay.portlet.RenderResponseFactory=ERROR
log4j.logger.com.liferay.portlet.admin=ERROR
log4j.logger.com.liferay.portlet.admin.action.EditServerAction=INFO
log4j.logger.com.liferay.portlet.asset.util.AssetUtil=ERROR
log4j.logger.com.liferay.portlet.blogs.service.impl.BlogsEntryLocalServiceImpl=INFO
log4j.logger.com.liferay.portlet.blogs.util=INFO
log4j.logger.com.liferay.portlet.documentlibrary.lar=WARN
log4j.logger.com.liferay.portlet.documentlibrary.webdav=WARN
log4j.logger.com.liferay.portlet.enterpriseadmin.action.EditUserPortraitAction=ERROR
log4j.logger.com.liferay.portlet.enterpriseadmin.util.OrganizationIndexer=WARN
log4j.logger.com.liferay.portlet.enterpriseadmin.util.OrganizationSearchTerms=WARN
log4j.logger.com.liferay.portlet.journal=ERROR
log4j.logger.com.liferay.portlet.journal.lar=WARN
log4j.logger.com.liferay.portlet.journal.service.impl.JournalContentSearchLocalServiceImpl=INFO
log4j.logger.com.liferay.portlet.journal.util.JournalUtil=ERROR
log4j.logger.com.liferay.portlet.journal.util.PropertiesTransformerListener=WARN
log4j.logger.com.liferay.portlet.journal.util.RegexTransformerUtil=INFO
log4j.logger.com.liferay.portlet.journalcontent.JournalContentPortletLayoutListener=ERROR
log4j.logger.com.liferay.portlet.journalcontent.util.JournalContentUtil=ERROR
log4j.logger.com.liferay.portlet.mail=WARN
log4j.logger.com.liferay.portlet.messageboards.pop.MessageListenerImpl=ERROR
log4j.logger.com.liferay.portlet.messageboards.service.impl.MBCategoryLocalServiceImpl=ERROR
log4j.logger.com.liferay.portlet.messageboards.service.impl.MBMessageLocalServiceImpl=ERROR
log4j.logger.com.liferay.portlet.messageboards.util.MBUtil=ERROR
log4j.logger.com.liferay.portlet.portletconfiguration.action=ERROR
log4j.logger.com.liferay.portlet.shopping.action.PayPalNotificationAction=DEBUG
log4j.logger.com.liferay.portlet.webproxy=INFO
log4j.logger.com.liferay.portlet.wiki.importers=WARN
log4j.logger.com.liferay.samplestruts=INFO
log4j.logger.com.liferay.sampletest=INFO
log4j.logger.com.liferay.testhook=INFO
log4j.logger.com.liferay.util.JNDIUtil=ERROR
log4j.logger.com.liferay.util.dao=ERROR
log4j.logger.com.liferay.util.dao.orm.CustomSQLUtil=INFO
log4j.logger.com.liferay.util.mail=WARN
log4j.logger.com.liferay.util.portlet.PortletRequestUtil=INFO
log4j.logger.com.liferay.util.servlet.ServletRequestUtil=INFO
log4j.logger.com.liferay.util.servlet.ServletResponseUtil=ERROR
log4j.logger.com.mchange=WARN
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.com.opensymphony.oscache.plugins.clustersupport.JavaGroupsBroadcastingListener=ERROR
log4j.logger.com.sample=INFO
log4j.logger.com.sun=ERROR
log4j.logger.com.sun.faces=ERROR
log4j.logger.de.hunsicker=ERROR
log4j.logger.de.nava.informa=ERROR
log4j.logger.httpclient.wire=ERROR
log4j.logger.net.htmlparser.jericho=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.logger.net.sf.ehcache.config.ConfigurationFactory=INFO
log4j.logger.net.sf.ehcache.config.DiskStoreConfiguration=ERROR
log4j.logger.net.sf.hibernate=ERROR
log4j.logger.org.apache.axis=INFO
log4j.logger.org.apache.bsf=FATAL
log4j.logger.org.apache.commons.digester=ERROR
log4j.logger.org.apache.commons.beanutils=ERROR
log4j.logger.org.apache.commons.fileupload=ERROR
log4j.logger.org.apache.commons.httpclient=ERROR
log4j.logger.org.apache.commons.validator=ERROR
log4j.logger.org.apache.jackrabbit=ERROR
log4j.logger.org.apache.myfaces=ERROR
log4j.logger.org.apache.struts=ERROR
log4j.logger.org.apache.struts.action.RequestProcessor=ERROR
log4j.logger.org.apache.struts.tiles.TilesRequestProcessor=ERROR
log4j.logger.org.apache.velocity=ERROR
log4j.logger.org.apache.xbean=ERROR
log4j.logger.org.hibernate=ERROR
log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=OFF
log4j.logger.org.hibernate.util.JDBCExceptionReporter=ERROR<a class="edit-timestamp hide-if-no-js" tabindex="4" href="http://blog.holisticon.de/wp-admin/post.php?post=5067&action=edit#edit_timestamp">Bearbeiten</a>
log4j.logger.org.jabsorb=ERROR
log4j.logger.org.jgroups=ERROR
log4j.logger.org.openid4java=ERROR
log4j.logger.org.pdfbox=INFO
log4j.logger.org.portletbridge=INFO
log4j.logger.org.quartz=ERROR
log4j.logger.org.springframework=ERROR

So, nun werden nur die Nachrichten protokolliert, die auch gewünscht sind. Leider hat diese Konfiguration einen Nachteil, der aber nicht an der Konfiguration selbst liegt, sondern (wieder einmal) an Liferay, denn in Liferay werden manche Nachrichten und Fehler in System.out bzw. System.err geschrieben. Ja, ein solides System in der Version 6.0.6 schreibt schon mal direkt in die Konsole – ganz normal.

Das Wort zum Abschluss

Ich hoffe, dass damit dem einen oder anderen geholfen ist. Wenn jemand noch Verbesserungsvorschläge hat oder der Meinung ist, dass das totaler Käse sei, der möge doch bitte einen Kommentar hinterlassen.

Über den Autor

Kommentare

  1. Hi und danke für diesen hilfreichen Beitrag.
    Leider hat diese globale log4j Konfiguration einen Nachteil (zumindest bei mir).
    Ich kann nicht mehr in meinen Portlets das Logging für das jeweilige Portlet konfigurieren, sondern muss die globale log4.properties Datei anpassen und den Server neustarten um Änderungen zu übernehmen.
    Hast du vielleicht einen Tip, wie man Log4j dazu bewegen könnte seine Properties zu kaskadieren und die Portlet-eigenen log4j.properties auch zu laden?

Hinterlasse einen Kommentar