getting the name of calling service

Is it possible to get the name of the service that invoked the current service?
I am using log4j and want the logger name to be the interface + service of the service that invoke the logging method.

something like:

                -> doStuff
                -> logging.logWARN

Instead of giving the logger name “myPackage.a.b:serviceC” as an argument, it would be nice if I inside logging.logWARN could programatically retrieve that info.

thanks Morten

Invesigate this java service.

import com.wm.util.JournalLogger

IDataCursor idcPipeline = pipeline.getCursor();  

com.wm.lang.ns.NSService  cs =;

String csStr = cs.toString();  

IData idataInput = IDataFactory.create(1);
IDataHashCursor idc = idataInput.getHashCursor();
idc.insertAfter("message", csStr);
idc.insertAfter("function", "");
idc.insertAfter("level", "4");
try {
   Service.doInvoke( "pub.flow", "debugLog", (IData)idataInput );
catch (Exception e) {

I think what you are loking for is stacktrace.
Try this Java code it works as service inside IS runtime but should also work within your logger.

		IDataHashCursor curs = pipeline.getHashCursor();
		String caller = "SVC - ";
			Thread t = Thread.currentThread(); st = (;
			java.util.Stack stack = st.getState().getCallStack();
			for (int i = 0; i < stack.size(); i++)
				if (i < stack.size() - 1)
					caller += stack.elementAt(i).toString();
					caller += " ";
		catch (Exception e) 
			caller = new String("non-determinable"); 
		curs.insertAfter("serviceName", caller);

Here is a much more slimed down approach…

  IDataCursor pipelineCursor = pipeline.getCursor();
catch (Exception e)
  throw new ServiceException(e.toString());

Thank you
Both methods work.

One interesting thing to notice is that if you use these methods in a debug mode (stepping through some service), the caller can’t be determined. Both methods (stack and callingService) returns wm.server.flow:stepFlow instead of the correct service name.

wm.server.flow:stepFlow is one of the Debug API services of the Flow engine, but they are just services like any other. The Developer drives a debug session through these services, so in this case stepFlow was the service executed, which in tern was passed information on what service/subservice to execute.

There are a few subtle behavior differences between stepping and running a Flow, but it means there is one code path to handle incoming service invocations. The debug interface goes through the same codepath.