killbill-aplcache

Fixes #542

5/18/2016 3:37:12 PM

Details

diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
index 74cc2d1..671a9d1 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
@@ -17,102 +17,23 @@
 
 package org.killbill.billing.payment.api;
 
-import java.math.BigDecimal;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.UUID;
-
-import javax.annotation.Nullable;
 
 import org.killbill.billing.ErrorCode;
-import org.killbill.billing.account.api.Account;
-import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
 import org.killbill.billing.util.config.PaymentConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 
 public class DefaultApiBase {
 
-    private static final Logger log = LoggerFactory.getLogger(DefaultApiBase.class);
-    private static final Joiner JOINER = Joiner.on(",");
-
     private final PaymentConfig paymentConfig;
 
     public DefaultApiBase(final PaymentConfig paymentConfig) {
         this.paymentConfig = paymentConfig;
     }
 
-    protected void logAPICall(final String transactionType,
-                              final Account account,
-                              final UUID paymentMethodId,
-                              @Nullable final UUID paymentId,
-                              @Nullable final UUID transactionId,
-                              @Nullable final BigDecimal amount,
-                              @Nullable final Currency currency,
-                              @Nullable final String paymentExternalKey,
-                              @Nullable final String paymentTransactionExternalKey,
-                              @Nullable final TransactionStatus transactionStatus,
-                              @Nullable final List<String> paymentControlPluginNames) {
-        if (log.isInfoEnabled()) {
-            final StringBuilder logLine = new StringBuilder();
-            logLine.append("PaymentApi: transactionType='")
-                   .append(transactionType)
-                   .append("', accountId='")
-                   .append(account.getId())
-                   .append("'");
-            if (paymentMethodId != null) {
-                logLine.append(", paymentMethodId='")
-                       .append(paymentMethodId)
-                       .append("'");
-            }
-            if (paymentExternalKey != null) {
-                logLine.append(", paymentExternalKey='")
-                       .append(paymentExternalKey)
-                       .append("'");
-            }
-            if (paymentTransactionExternalKey != null) {
-                logLine.append(", paymentTransactionExternalKey='")
-                       .append(paymentTransactionExternalKey)
-                       .append("'");
-            }
-            if (paymentId != null) {
-                logLine.append(", paymentId='")
-                       .append(paymentId)
-                       .append("'");
-            }
-            if (transactionId != null) {
-                logLine.append(", transactionId='")
-                       .append(transactionId)
-                       .append("'");
-            }
-            if (amount != null) {
-                logLine.append(", amount='")
-                       .append(amount)
-                       .append("'");
-            }
-            if (currency != null) {
-                logLine.append(", currency='")
-                       .append(currency)
-                       .append("'");
-            }
-            if (transactionStatus != null) {
-                logLine.append(", transactionStatus='")
-                       .append(transactionStatus)
-                       .append("'");
-            }
-            if (paymentControlPluginNames != null) {
-                logLine.append(", paymentControlPluginNames='")
-                       .append(JOINER.join(paymentControlPluginNames))
-                       .append("'");
-            }
-            log.info(logLine.toString());
-        }
-    }
-
     protected List<String> toPaymentControlPluginNames(final PaymentOptions paymentOptions) {
         // Special path for JAX-RS InvoicePayment endpoints (see JaxRsResourceBase)
         if (paymentConfig.getPaymentControlPluginNames() != null &&
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
index 2ce8fe5..385f2e2 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
@@ -42,11 +42,14 @@ import org.killbill.billing.util.entity.Pagination;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 
 public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
 
+    private static final Joiner JOINER = Joiner.on(",");
+
     private static final boolean SHOULD_LOCK_ACCOUNT = true;
     private static final boolean IS_API_PAYMENT = true;
     private static final UUID NULL_ATTEMPT_ID = null;
@@ -79,26 +82,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.AUTHORIZE.name();
-        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createAuthorization(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                                     SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createAuthorization(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                         SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -119,26 +125,30 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.AUTHORIZE.name();
-        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = pluginControlPaymentProcessor.createAuthorization(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                                                  properties, paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
 
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = pluginControlPaymentProcessor.createAuthorization(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                                      properties, paymentControlPluginNames, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
     }
 
     @Override
@@ -152,26 +162,30 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.CAPTURE.name();
-        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createCapture(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                                               SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createCapture(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                                   SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -189,26 +203,30 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.CAPTURE.name();
-        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = pluginControlPaymentProcessor.createCapture(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                                                            properties, paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = pluginControlPaymentProcessor.createCapture(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                                                properties, paymentControlPluginNames, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
 
-        return payment;
     }
 
     @Override
@@ -223,26 +241,30 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.PURCHASE.name();
-        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createPurchase(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                                SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createPurchase(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                    SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -270,25 +292,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
                                            paymentMethodProcessor.createOrGetExternalPaymentMethod(UUIDs.randomUUID().toString(), account, properties, callContext, internalCallContext);
 
         final String transactionType = TransactionType.PURCHASE.name();
-        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
-
-        final Payment payment = pluginControlPaymentProcessor.createPurchase(IS_API_PAYMENT, account, nonNulPaymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                                             properties, paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+
+        try {
+            logEnterAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            payment = pluginControlPaymentProcessor.createPurchase(IS_API_PAYMENT, account, nonNulPaymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                                 properties, paymentControlPluginNames, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
     }
 
     @Override
@@ -300,26 +326,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.VOID.name();
-        logAPICall(transactionType, account, null, paymentId, null, null, null, null, paymentTransactionExternalKey, null, null);
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, null, null, null, paymentTransactionExternalKey, null, null);
 
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createVoid(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey,
-                                                            SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createVoid(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey,
+                                                                SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
 
     }
 
@@ -335,26 +364,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.VOID.name();
-        logAPICall(transactionType, account, null, paymentId, null, null, null, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, null, null, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
 
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = pluginControlPaymentProcessor.createVoid(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey,
-                                                                         properties, paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
-
-        return payment;
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = pluginControlPaymentProcessor.createVoid(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey,
+                                                                             properties, paymentControlPluginNames, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
     }
 
     @Override
@@ -368,26 +400,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.REFUND.name();
-        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createRefund(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                                              SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createRefund(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                                  SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -407,26 +442,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.REFUND.name();
-        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = pluginControlPaymentProcessor.createRefund(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                                                           properties, paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = pluginControlPaymentProcessor.createRefund(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                                               properties, paymentControlPluginNames, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
     }
 
     @Override
@@ -442,26 +480,30 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.CREDIT.name();
-        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createCredit(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                              SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createCredit(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                  SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -482,26 +524,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
 
         final String transactionType = TransactionType.CREDIT.name();
-        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = pluginControlPaymentProcessor.createCredit(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                                           properties, paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = pluginControlPaymentProcessor.createCredit(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                               properties, paymentControlPluginNames, callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
     }
 
     @Override
@@ -510,31 +555,35 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentTransactionId, "paymentTransactionId");
 
         final String transactionType = "NOTIFY_STATE_CHANGE";
-        logAPICall(transactionType, account, null, null, paymentTransactionId, null, null, null, null, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.notifyPendingPaymentOfStateChanged(account, paymentTransactionId, isSuccess, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = Iterables.<PaymentTransaction>tryFind(payment.getTransactions(),
-                                                                                            new Predicate<PaymentTransaction>() {
-                                                                                                @Override
-                                                                                                public boolean apply(final PaymentTransaction transaction) {
-                                                                                                    return transaction.getId().equals(paymentTransactionId);
-                                                                                                }
-                                                                                            }).orNull();
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction == null ? null : paymentTransaction.getId(),
-                   paymentTransaction == null ? null : paymentTransaction.getProcessedAmount(),
-                   paymentTransaction == null ? null : paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction == null ? null : paymentTransaction.getExternalKey(),
-                   paymentTransaction == null ? null : paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, null, paymentTransactionId, null, null, null, null, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.notifyPendingPaymentOfStateChanged(account, paymentTransactionId, isSuccess, callContext, internalCallContext);
+
+            paymentTransaction = Iterables.<PaymentTransaction>tryFind(payment.getTransactions(),
+                                                                                                new Predicate<PaymentTransaction>() {
+                                                                                                    @Override
+                                                                                                    public boolean apply(final PaymentTransaction transaction) {
+                                                                                                        return transaction.getId().equals(paymentTransactionId);
+                                                                                                    }
+                                                                                                }).orNull();
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -550,26 +599,29 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentId, "paymentId");
 
         final String transactionType = TransactionType.CHARGEBACK.name();
-        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = paymentProcessor.createChargeback(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey, amount, currency, true,
-                                                                  callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   null);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = paymentProcessor.createChargeback(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey, amount, currency, true,
+                                                                      callContext, internalCallContext);
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           null);
+        }
     }
 
     @Override
@@ -585,26 +637,30 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentId, "paymentId");
 
         final String transactionType = TransactionType.CHARGEBACK.name();
-        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
-
-        final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        final Payment payment = pluginControlPaymentProcessor.createChargeback(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey, amount, currency,
-                                                                               paymentControlPluginNames, callContext, internalCallContext);
-
-        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
-        logAPICall(transactionType,
-                   account,
-                   payment.getPaymentMethodId(),
-                   payment.getId(),
-                   paymentTransaction.getId(),
-                   paymentTransaction.getProcessedAmount(),
-                   paymentTransaction.getProcessedCurrency(),
-                   payment.getExternalKey(),
-                   paymentTransaction.getExternalKey(),
-                   paymentTransaction.getTransactionStatus(),
-                   paymentControlPluginNames);
-
-        return payment;
+        Payment payment = null;
+        PaymentTransaction paymentTransaction = null;
+        try {
+            logEnterAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+            payment = pluginControlPaymentProcessor.createChargeback(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey, amount, currency,
+                                                                                   paymentControlPluginNames, callContext, internalCallContext);
+
+            paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+            return payment;
+        } finally {
+            logExitAPICall(transactionType,
+                           account,
+                           payment != null ? payment.getPaymentMethodId() : null,
+                           payment != null ? payment.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getId() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedAmount() : null,
+                           paymentTransaction != null ? paymentTransaction.getProcessedCurrency() : null,
+                           payment != null ? payment.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getExternalKey() : null,
+                           paymentTransaction != null ? paymentTransaction.getTransactionStatus() : null,
+                           paymentControlPluginNames);
+        }
     }
 
     @Override
@@ -728,4 +784,124 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
 
         return paymentMethods;
     }
+
+    private void logEnterAPICall(final String transactionType,
+                                   final Account account,
+                                   @Nullable final UUID paymentMethodId,
+                                   @Nullable final UUID paymentId,
+                                   @Nullable final UUID transactionId,
+                                   @Nullable final BigDecimal amount,
+                                   @Nullable final Currency currency,
+                                   @Nullable final String paymentExternalKey,
+                                   @Nullable final String paymentTransactionExternalKey,
+                                   @Nullable final TransactionStatus transactionStatus,
+                                   @Nullable final List<String> paymentControlPluginNames) {
+        logAPICallInternal("ENTERING ",
+                           transactionType,
+                           account,
+                           paymentMethodId,
+                           paymentId,
+                           transactionId,
+                           amount,
+                           currency,
+                           paymentExternalKey,
+                           paymentTransactionExternalKey,
+                           transactionStatus,
+                           paymentControlPluginNames);
+    }
+
+    private void logExitAPICall(final String transactionType,
+                                  final Account account,
+                                  @Nullable final UUID paymentMethodId,
+                                  @Nullable final UUID paymentId,
+                                  @Nullable final UUID transactionId,
+                                  @Nullable final BigDecimal amount,
+                                  @Nullable final Currency currency,
+                                  @Nullable final String paymentExternalKey,
+                                  @Nullable final String paymentTransactionExternalKey,
+                                  @Nullable final TransactionStatus transactionStatus,
+                                  @Nullable final List<String> paymentControlPluginNames) {
+        logAPICallInternal("EXITING ",
+                           transactionType,
+                           account,
+                           paymentMethodId,
+                           paymentId,
+                           transactionId,
+                           amount,
+                           currency,
+                           paymentExternalKey,
+                           paymentTransactionExternalKey,
+                           transactionStatus,
+                           paymentControlPluginNames);
+    }
+
+
+
+    private void logAPICallInternal(final String prefixMsg,
+                                    final String transactionType,
+                                    final Account account,
+                                    final UUID paymentMethodId,
+                                    @Nullable final UUID paymentId,
+                                    @Nullable final UUID transactionId,
+                                    @Nullable final BigDecimal amount,
+                                    @Nullable final Currency currency,
+                                    @Nullable final String paymentExternalKey,
+                                    @Nullable final String paymentTransactionExternalKey,
+                                    @Nullable final TransactionStatus transactionStatus,
+                                    @Nullable final List<String> paymentControlPluginNames) {
+        if (log.isInfoEnabled()) {
+            final StringBuilder logLine = new StringBuilder(prefixMsg);
+            logLine.append("PaymentApi: transactionType='")
+                   .append(transactionType)
+                   .append("', accountId='")
+                   .append(account.getId())
+                   .append("'");
+            if (paymentMethodId != null) {
+                logLine.append(", paymentMethodId='")
+                       .append(paymentMethodId)
+                       .append("'");
+            }
+            if (paymentExternalKey != null) {
+                logLine.append(", paymentExternalKey='")
+                       .append(paymentExternalKey)
+                       .append("'");
+            }
+            if (paymentTransactionExternalKey != null) {
+                logLine.append(", paymentTransactionExternalKey='")
+                       .append(paymentTransactionExternalKey)
+                       .append("'");
+            }
+            if (paymentId != null) {
+                logLine.append(", paymentId='")
+                       .append(paymentId)
+                       .append("'");
+            }
+            if (transactionId != null) {
+                logLine.append(", transactionId='")
+                       .append(transactionId)
+                       .append("'");
+            }
+            if (amount != null) {
+                logLine.append(", amount='")
+                       .append(amount)
+                       .append("'");
+            }
+            if (currency != null) {
+                logLine.append(", currency='")
+                       .append(currency)
+                       .append("'");
+            }
+            if (transactionStatus != null) {
+                logLine.append(", transactionStatus='")
+                       .append(transactionStatus)
+                       .append("'");
+            }
+            if (paymentControlPluginNames != null) {
+                logLine.append(", paymentControlPluginNames='")
+                       .append(JOINER.join(paymentControlPluginNames))
+                       .append("'");
+            }
+            log.info(logLine.toString());
+        }
+    }
 }