45.8.1Transaction Logging Processors

 

When transaction logging is globally enabled, a new transaction log can be started for a route by adding a smile:camel/txLogStart processor before the first node in which a transaction log step should be added.

After a new transaction log is created for a route, Smile processors will automatically add a log step for each subsequent node (unless explicitly disabled by the txLogStep parameter). This will occur regardless of whether a node executes successfully or if a node fails with an Exception.

Once a new transaction log is created for a route, custom processors have two alternatives to add transaction log steps:

  1. Add a smile:camel/txLogAddStep processor after the node which output logging is desired.
  2. Autowire an ICamelProcessorTxLogHelper (IHl7V2CamelProcessorTxLogHelper for Hl7V2 processors) bean which provides transaction logging functionality.

Transaction log and log steps are accumulated during route execution in a CamelExchangeRequestDetails object which is stored in the exchange-request Camel Exchange Property. After a route is terminated (either successfully or from an Exception) the transaction log steps inside the CamelExchangeRequestDetails are automatically persisted.

In order to automatically commit transaction log steps, Smile adds a global onCompletion handler. Because route-specific `onCompletion` handlers override global handlers, you should **not** add a local `onCompletion` handler. Doing so will result in transaction logs that will not be committed. If you have a route that requires an `onCompletion` handler, it must include a `smile://camel/onCompletionProcessor` processor in order for transaction logs to be committed.

Hl7V2 intermediate route processors will add log steps if the intermediate_logging_enabled property is set to true.

45.8.2Start Transaction Log Processor

 
  • Example URI: smile:camel/txLogStart
  • Description: Starts transaction logging for the route.

45.8.3Add Trabsaction Log Step Processor

 
  • Example URI: smile:camel/txLogAddStep
  • Description: Request step logging for previous route node. Used mainly for custom processor route-triggered logging, as smile processors generate log steps automatically.

45.8.3.1Transaction Logging Parameters

Logging Parameter Used In Function Default Value
txLogStep Smile processors (false value) disable automatic logging for processor true
showMsgBody Smile processors (false value) avoid adding message body to log step true
rawMsg Smile Hl7V2 processors (false value) disable raw input message body to log step true
loggerUri All processors Used to override the processor uri identifier in the transaction log steps[^1] NONE

[^1]: If your route has more than one processor with the same URI, (which could be the case when using multiple smile:camel/txLogAddStep processors), the automatic detection of the previous processor label could fail, which would result in a logging step with an empty URI. To avoid transaction log steps with empty URIs, the desired logging step URI can be specified using this parameter.

45.8.3.2Transaction Logging Example Route combining smile and custom processors

The following route produces one transaction log with six associated log steps as commented:

<route>
	<from uri="direct:start" />
	<!-- following processor doesn't log because no tx log initiated -->
	<to uri="smile:endpoint_hl7v2_in/hl7v2ToFhirPreConvertScriptProcessor" />
	<!-- initiate tx logging -->
	<to uri="smile:camel/txLogStart" />
	<!-- log step with raw input msg (step 0) + step for processed msg (step 1) -->
	<to uri="smile:endpoint_hl7v2_in/hl7v2ToFhirPreConvertMapperBeanProcessor" />
	<to uri="bean:customBeanProcessor1" />
	<!-- tx log requested for previous step not including msg body (step 2) -->
	<to uri="smile:camel/txLogAddStep?showMsgBody=false" />
	<!-- automatic tx log (step 3) -->
	<to uri="smile:endpoint_hl7v2_in/hl7v2ToFhirPreConvertInterceptorProcessor?txLogStep=false" />
	<!-- "automatic" tx log, no body (step 4) -->
	<to uri="smile:endpoint_hl7v2_in/hl7v2ToFhirProcessor" />
	<!-- custom processor with no tx log step requested -->
	<to uri="bean:customBeanProcessor2" />
	<!-- "automatic" tx log, no body (step 5) -->	
	<to uri="smile:endpoint_hl7v2_in/hl7v2ToFhirPostConvertScriptProcessor?showMsgBody=false" />
	<!-- "automatic" tx log show body (step 6) -->
	<to uri="smile:endpoint_hl7v2_in/hl7v2ToFhirPostConvertInterceptorProcessor" /> 				
	<to uri="mock:result" />
</route>

45.8.3.3Transaction Logging Example Custom Processors

The following custom Camel processor adds an eagerly generated transaction log step if a transaction log was created earlier within the route:

/**
 * Custom processor showing transaction log step addition
 */
public class SampleCustomProcessorAddingTxLogSteps implements Processor {
	@Autowired
	private ICamelProcessorTxLogHelper myTransactionLogHelper;

	@Override
	public void process(Exchange exchange) throws Exception {
		// if transaction log was already started, adds provided step to it, otherwise do nothing
		// steps are eagerly generated
		myTransactionLogHelper.addStepIfTxLogActive(exchange, buildTxLogSteps(exchange));
	}

	public List<TransactionLogStepJson> buildTxLogSteps(Exchange theExchange) {
		TransactionLogStepJson step = new TransactionLogStepJson();
		step.setInitialTimestamp(new Date());
		step.setType(TransactionLogStepTypeEnum.PROCESSING);
		step.setOutcome(TransactionLogOutcomeEnum.SUCCESS);
		step.setBody(theExchange.getMessage().getBody(String.class));
		step.setBodyType(TransactionLogBodyTypeEnum.JSON);

		// a string you provide to identify your processor in the transaction log step
		step.setRequestUrl(this.getClass().getSimpleName());

		return List.of(step);
	}
}

The following custom Camel processor adds a lazily generated transaction log step if a transaction log was created earlier within the route:

/**
 * Custom processor showing lazily generated transaction log step addition
 */
public class SampleCustomProcessorAddingTxLogStepsLazily implements Processor, ITxLogStepsProvider {
	@Autowired
	private ICamelProcessorTxLogHelper myTransactionLogHelper;

	@Override
	public void process(Exchange exchange) throws Exception {
		// if transaction log was already started, adds provided step to it, otherwise do nothing
		myTransactionLogHelper.addStepIfTxLogActive(exchange, this);
	}

	// this method is invoked lazily. Useful when steps generation involve heavy process
	@Override
	public List<TransactionLogStepJson> provideTxLogSteps(Exchange theExchange) {
		TransactionLogStepJson step = new TransactionLogStepJson();
		step.setInitialTimestamp(new Date());
		step.setType(TransactionLogStepTypeEnum.PROCESSING);
		step.setOutcome(TransactionLogOutcomeEnum.SUCCESS);
		step.setBody(theExchange.getMessage().getBody(String.class));
		step.setBodyType(TransactionLogBodyTypeEnum.JSON);

		// a string you provide to identify your processor in the transaction log step
		step.setRequestUrl(this.getClass().getSimpleName());

		return List.of(step);
	}
}