I want all applications in a Glassfish server to have a single point on entry to the syslog output. I have found a library (https://github.com/CloudBees-community/syslog-java-client) that handles the Syslog output and I have made this work. But this required every application to have their own implementation of ILogger:
public interface ILogger extends Serializable {
public void alert(String message);
public void critical(String message);
public void debug(String message);
public void emergency(String message);
public void error(String message);
public void informational(String message);
public void notice(String message);
public void warning(String message);
public void exception(Exception e);
}
So I want to have a bean that return implementations of this ILogger, something like this:
public interface ILoggerFacade extends Serializable {
// beanName is the name of the bean requesting a Logger
public ILogger get(String beanName);
public void log(String beanName, int severity, String message);
}
So far my implementations result in exceptions:
javax.ejb.EJBException
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
at com.sun.ejb.containers.EJBContainerTransactionManager.checkExceptionNoTx(EJBContainerTransactionManager.java:638)
at com.sun.ejb.containers.EJBContainerTransactionManager.checkExceptionBeanMgTx(EJBContainerTransactionManager.java:597)
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:467)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:212)
at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
at com.sun.proxy.$Proxy528.getWlcById(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:239)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:150)
at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:226)
at xxx.interfaces.domain.__IOrmFacade_Remote_DynamicStub.method1(xxx/interfaces/domain/__IOrmFacade_Remote_DynamicStub.java)
at xxx.interfaces.domain._IOrmFacade_Wrapper.method1(xxx/interfaces/domain/_IOrmFacade_Wrapper.java)
at xxx.test.QcastInterfaces.OrmFacadeTest.getApsByStatus(OrmFacadeTest.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at xxx.test.TestBackend.testMethod(TestBackend.java:95)
at xxx.test.TestBackend.testClass(TestBackend.java:78)
at xxx.test.TestBackend.test(TestBackend.java:62)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:75)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at xxx.logger.Logger.debug(Logger.java:34)
at xxx.orm.beans.OrmFacadeBean.getWlcById(OrmFacadeBean.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4695)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:630)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
at sun.reflect.GeneratedMethodAccessor340.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
at sun.reflect.GeneratedMethodAccessor341.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4667)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4655)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:205)
... 53 more
Implementations so far:
Logger
@SuppressWarnings("serial")
public class Logger implements ILogger {
private final ILoggerFacade loggerFacade;
private final String bean;
public Logger(ILoggerFacade loggerFacade, String bean) throws NamingException {
//this.loggerFacade = InitialContext.doLookup("java:global/QcastORM/logger/LoggerBean");
//loggerFacade = null;
this.loggerFacade = loggerFacade;
this.bean = bean;
}
@Override
public void alert(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void critical(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void debug(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void emergency(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void error(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void informational(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void notice(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void warning(String message) {
loggerFacade.log(bean, Severity.ALERT.numericalCode(), message);
}
@Override
public void exception(Exception e) {
// TODO stacktrace uitschrijven
loggerFacade.log(bean, Severity.ALERT.numericalCode(), e.toString());
}
}
LoggerFacade
@SuppressWarnings("serial")
@EJB(name = "samename", beanInterface = ILoggerFacade.class)
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@Remote
public class LoggerFacade implements ILoggerFacade {
@Override
public ILogger get(String bean) {
// This is not ideal
try {
return new Logger(this, bean);
} catch (NamingException e) {
e.printStackTrace();
return null;
}
}
@Override
public void log(String bean, int severity, String message) {
// When this works, change syso into syslog
System.out.println(message);
}
}
I have searched Google and SO but so far I haven't found any solutions I am happy with. My question is if I should think differently about this or an example of how this is accomplished.
Thanks in advance!
Unless you absolutely need to use that library, I'd recommend looking at Logback or other libraries that support the Simple Logging Facade for Java. That will give you far more options and flexibility. The Syslog Appender is available out of the box for Logback.