This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new 9a73a2f9e14 Display dates in Quota and Usage messages according to the 
timezone configurations (#8230)
9a73a2f9e14 is described below

commit 9a73a2f9e1433103373e7bd9da8b5feef4479feb
Author: Fabricio Duarte <fabricio.duarte...@gmail.com>
AuthorDate: Mon Mar 4 08:44:03 2024 -0300

    Display dates in Quota and Usage messages according to the timezone 
configurations (#8230)
    
    Co-authored-by: Daniel Augusto Veronezi Salvador 
<38945620+gutoveron...@users.noreply.github.com>
---
 .../src/main/java/com/cloud/usage/UsageVO.java     | 11 +++-
 .../cloudstack/quota/QuotaAlertManagerImpl.java    |  7 ++-
 .../apache/cloudstack/quota/QuotaManagerImpl.java  | 69 ++++++++++------------
 .../apache/cloudstack/quota/vo/QuotaTariffVO.java  | 13 +++-
 .../api/response/QuotaResponseBuilderImpl.java     | 26 ++++----
 .../apache/cloudstack/quota/QuotaServiceImpl.java  | 18 +-----
 .../cloudstack/quota/QuotaServiceImplTest.java     |  1 -
 .../java/com/cloud/usage/UsageServiceImpl.java     | 17 +++---
 .../java/com/cloud/usage/UsageManagerImpl.java     | 60 +++++++++++--------
 .../cloud/usage/parser/IPAddressUsageParser.java   |  9 +--
 .../usage/parser/LoadBalancerUsageParser.java      |  9 +--
 .../usage/parser/NetworkOfferingUsageParser.java   |  9 +--
 .../com/cloud/usage/parser/NetworkUsageParser.java | 10 ++--
 .../usage/parser/PortForwardingUsageParser.java    |  9 +--
 .../usage/parser/SecurityGroupUsageParser.java     |  9 +--
 .../com/cloud/usage/parser/StorageUsageParser.java |  9 +--
 .../cloud/usage/parser/VMInstanceUsageParser.java  |  9 +--
 .../usage/parser/VMSnapshotOnPrimaryParser.java    |  9 +--
 .../cloud/usage/parser/VMSnapshotUsageParser.java  |  9 +--
 .../com/cloud/usage/parser/VPNUserUsageParser.java |  9 +--
 .../com/cloud/usage/parser/VmDiskUsageParser.java  | 11 ++--
 .../com/cloud/usage/parser/VolumeUsageParser.java  |  9 +--
 utils/src/main/java/com/cloud/utils/DateUtil.java  | 17 ++++--
 23 files changed, 196 insertions(+), 163 deletions(-)

diff --git a/engine/schema/src/main/java/com/cloud/usage/UsageVO.java 
b/engine/schema/src/main/java/com/cloud/usage/UsageVO.java
index 10b295f593c..50884e3c012 100644
--- a/engine/schema/src/main/java/com/cloud/usage/UsageVO.java
+++ b/engine/schema/src/main/java/com/cloud/usage/UsageVO.java
@@ -17,6 +17,7 @@
 package com.cloud.usage;
 
 import java.util.Date;
+import java.util.TimeZone;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -27,9 +28,11 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import com.cloud.utils.DateUtil;
 import org.apache.cloudstack.api.InternalIdentity;
 import org.apache.cloudstack.usage.Usage;
 import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
+import org.apache.commons.lang3.StringUtils;
 
 @Entity
 @Table(name = "cloud_usage")
@@ -400,6 +403,12 @@ public class UsageVO implements Usage, InternalIdentity {
 
     @Override
     public String toString() {
-        return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, 
"id", "usageId", "usageType", "startDate", "endDate");
+        return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, 
"id", "usageId", "usageType");
+    }
+
+    public String toString(TimeZone timeZone) {
+        String startDateString = DateUtil.displayDateInTimezone(timeZone, 
getStartDate());
+        String endDateString = DateUtil.displayDateInTimezone(timeZone, 
getEndDate());
+        return String.format("%s,\"startDate\":\"%s\",\"endDate\":\"%s\"}", 
StringUtils.chop(this.toString()), startDateString, endDateString);
     }
 }
diff --git 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
index 8d35bb9f434..ff41a8141d7 100644
--- 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
+++ 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
@@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.DateUtil;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.quota.constant.QuotaConfig;
 import 
org.apache.cloudstack.quota.constant.QuotaConfig.QuotaEmailTemplateTypes;
@@ -156,9 +157,9 @@ public class QuotaAlertManagerImpl extends ManagerBase 
implements QuotaAlertMana
                 if (account == null) {
                     continue; // the account is removed
                 }
-                if (logger.isDebugEnabled()) {
-                    logger.debug("checkAndSendQuotaAlertEmails: Check id=" + 
account.getId() + " bal=" + accountBalance + ", alertDate=" + alertDate + ", 
lockable=" + lockable);
-                }
+                logger.debug("checkAndSendQuotaAlertEmails: Check id={} 
bal={}, alertDate={}, lockable={}", account.getId(),
+                        accountBalance, 
DateUtil.displayDateInTimezone(QuotaManagerImpl.getUsageAggregationTimeZone(), 
alertDate),
+                        lockable);
                 if (accountBalance.compareTo(zeroBalance) < 0) {
                     if (_lockAccountEnforcement && (lockable == 1)) {
                         if (_quotaManager.isLockable(account)) {
diff --git 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
index 4293415755a..9c15a47444a 100644
--- 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
+++ 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
@@ -49,9 +49,9 @@ import org.apache.cloudstack.usage.UsageUnitTypes;
 import org.apache.cloudstack.utils.bytescale.ByteScaleUtils;
 import org.apache.cloudstack.utils.jsinterpreter.JsInterpreter;
 import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
-import org.apache.cloudstack.utils.usage.UsageUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.stereotype.Component;
@@ -85,8 +85,7 @@ public class QuotaManagerImpl extends ManagerBase implements 
QuotaManager {
     @Inject
     protected PresetVariableHelper presetVariableHelper;
 
-    private TimeZone _usageTimezone;
-    private int _aggregationDuration = 0;
+    private static TimeZone usageAggregationTimeZone = 
TimeZone.getTimeZone("GMT");
     static final BigDecimal GiB_DECIMAL = 
BigDecimal.valueOf(ByteScaleUtils.GiB);
     List<Account.Type> lockablesAccountTypes = 
Arrays.asList(Account.Type.NORMAL, Account.Type.DOMAIN_ADMIN);
 
@@ -112,24 +111,16 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
             mergeConfigs(configs, params);
         }
 
-        String aggregationRange = 
configs.get("usage.stats.job.aggregation.range");
-        String timeZoneStr = configs.get("usage.aggregation.timezone");
-
-        if (timeZoneStr == null) {
-            timeZoneStr = "GMT";
-        }
-        _usageTimezone = TimeZone.getTimeZone(timeZoneStr);
-
-        _aggregationDuration = Integer.parseInt(aggregationRange);
-        if (_aggregationDuration < UsageUtils.USAGE_AGGREGATION_RANGE_MIN) {
-            logger.warn("Usage stats job aggregation range is to small, using 
the minimum value of " + UsageUtils.USAGE_AGGREGATION_RANGE_MIN);
-            _aggregationDuration = UsageUtils.USAGE_AGGREGATION_RANGE_MIN;
-        }
-        logger.info("Usage timezone = " + _usageTimezone + " 
AggregationDuration=" + _aggregationDuration);
+        String usageAggregationTimeZoneStr = 
ObjectUtils.defaultIfNull(configs.get("usage.aggregation.timezone"), "GMT");
+        usageAggregationTimeZone = 
TimeZone.getTimeZone(usageAggregationTimeZoneStr);
 
         return true;
     }
 
+    public static TimeZone getUsageAggregationTimeZone() {
+        return usageAggregationTimeZone;
+    }
+
     @Override
     public boolean start() {
         if (logger.isInfoEnabled()) {
@@ -158,8 +149,9 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
         Date startDate = firstQuotaUsage.getStartDate();
         Date endDate = firstQuotaUsage.getStartDate();
 
-        logger.info(String.format("Processing quota balance for account [%s] 
between [%s] and [%s].", accountToString, startDate,
-                accountQuotaUsages.get(accountQuotaUsages.size() - 
1).getEndDate()));
+        logger.info("Processing quota balance for account [{}] between [{}] 
and [{}].", accountToString,
+                DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
startDate),
+                DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
accountQuotaUsages.get(accountQuotaUsages.size() - 1).getEndDate()));
 
         BigDecimal aggregatedUsage = BigDecimal.ZERO;
         long accountId = accountVo.getAccountId();
@@ -246,17 +238,20 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
 
     protected BigDecimal aggregateCreditBetweenDates(Long accountId, Long 
domainId, Date startDate, Date endDate, String accountToString) {
         List<QuotaBalanceVO> creditsReceived = 
_quotaBalanceDao.findCreditBalance(accountId, domainId, startDate, endDate);
-        logger.debug(String.format("Account [%s] has [%s] credit entries 
before [%s].", accountToString, creditsReceived.size(), endDate));
+        logger.debug("Account [{}] has [{}] credit entries before [{}].", 
accountToString, creditsReceived.size(),
+                DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
endDate));
 
         BigDecimal aggregatedUsage = BigDecimal.ZERO;
 
-        logger.debug(String.format("Aggregating the account [%s] credit 
entries before [%s].", accountToString, endDate));
+        logger.debug("Aggregating the account [{}] credit entries before 
[{}].", accountToString,
+                DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
endDate));
 
         for (QuotaBalanceVO credit : creditsReceived) {
             aggregatedUsage = aggregatedUsage.add(credit.getCreditBalance());
         }
 
-        logger.debug(String.format("The aggregation of the account [%s] credit 
entries before [%s] resulted in the value [%s].", accountToString, endDate, 
aggregatedUsage));
+        logger.debug("The aggregation of the account [{}] credit entries 
before [{}] resulted in the value [{}].",
+                accountToString, 
DateUtil.displayDateInTimezone(usageAggregationTimeZone, endDate), 
aggregatedUsage);
 
         return aggregatedUsage;
     }
@@ -306,7 +301,7 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
     protected List<QuotaUsageVO> 
createQuotaUsagesAccordingToQuotaTariffs(AccountVO account, List<UsageVO> 
usageRecords,
             Map<Integer, Pair<List<QuotaTariffVO>, Boolean>> 
mapQuotaTariffsPerUsageType) {
         String accountToString = account.reflectionToString();
-        logger.info(String.format("Calculating quota usage of [%s] usage 
records for account [%s].", usageRecords.size(), accountToString));
+        logger.info("Calculating quota usage of [{}] usage records for account 
[{}].", usageRecords.size(), accountToString);
 
         List<Pair<UsageVO, QuotaUsageVO>> pairsUsageAndQuotaUsage = new 
ArrayList<>();
 
@@ -314,7 +309,7 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
             for (UsageVO usageRecord : usageRecords) {
                 int usageType = usageRecord.getUsageType();
 
-                if 
(Boolean.FALSE.equals(shouldCalculateUsageRecord(account,usageRecord))) {
+                if (!shouldCalculateUsageRecord(account, usageRecord)) {
                     pairsUsageAndQuotaUsage.add(new Pair<>(usageRecord, null));
                     continue;
                 }
@@ -339,8 +334,8 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
 
     protected boolean shouldCalculateUsageRecord(AccountVO accountVO, UsageVO 
usageRecord) {
         if 
(Boolean.FALSE.equals(QuotaConfig.QuotaAccountEnabled.valueIn(accountVO.getAccountId())))
 {
-            logger.debug(String.format("Considering usage record [%s] as 
calculated and skipping it because account [%s] has the quota plugin disabled.",
-                    usageRecord, accountVO.reflectionToString()));
+            logger.debug("Considering usage record [{}] as calculated and 
skipping it because account [{}] has the quota plugin disabled.",
+                    usageRecord.toString(usageAggregationTimeZone), 
accountVO.reflectionToString());
             return false;
         }
         return true;
@@ -366,9 +361,8 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
 
     protected BigDecimal aggregateQuotaTariffsValues(UsageVO usageRecord, 
List<QuotaTariffVO> quotaTariffs, boolean hasAnyQuotaTariffWithActivationRule,
             JsInterpreter jsInterpreter, String accountToString) {
-        String usageRecordToString = usageRecord.toString();
-        logger.debug(String.format("Validating usage record [%s] for account 
[%s] against [%s] quota tariffs.", usageRecordToString, accountToString,
-                quotaTariffs.size()));
+        String usageRecordToString = 
usageRecord.toString(usageAggregationTimeZone);
+        logger.debug("Validating usage record [{}] for account [{}] against 
[{}] quota tariffs.", usageRecordToString, accountToString, 
quotaTariffs.size());
 
         PresetVariables presetVariables = 
getPresetVariables(hasAnyQuotaTariffWithActivationRule, usageRecord);
         BigDecimal aggregatedQuotaTariffsValue = BigDecimal.ZERO;
@@ -406,7 +400,7 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
     protected BigDecimal getQuotaTariffValueToBeApplied(QuotaTariffVO 
quotaTariff, JsInterpreter jsInterpreter, PresetVariables presetVariables) {
         String activationRule = quotaTariff.getActivationRule();
         BigDecimal quotaTariffValue = quotaTariff.getCurrencyValue();
-        String quotaTariffToString = quotaTariff.toString();
+        String quotaTariffToString = 
quotaTariff.toString(usageAggregationTimeZone);
 
         if (StringUtils.isEmpty(activationRule)) {
             logger.debug(String.format("Quota tariff [%s] does not have an 
activation rule, therefore we will use the quota tariff value [%s] in the 
calculation.",
@@ -468,10 +462,11 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
         Date quotaTariffEndDate = quotaTariff.getEndDate();
 
         if ((quotaTariffEndDate != null && 
usageRecordStartDate.after(quotaTariffEndDate)) || 
usageRecordEndDate.before(quotaTariffStartDate)) {
-            logger.debug(String.format("Not applying quota tariff [%s] in 
usage record [%s] of account [%s] due to it is out of the period to be applied. 
Period of the usage"
-                    + " record [startDate: %s, endDate: %s], period of the 
quota tariff [startDate: %s, endDate: %s].", quotaTariff, 
usageRecord.toString(), accountToString,
-                    DateUtil.getOutputString(usageRecordStartDate), 
DateUtil.getOutputString(usageRecordEndDate), 
DateUtil.getOutputString(quotaTariffStartDate),
-                    DateUtil.getOutputString(quotaTariffEndDate)));
+            logger.debug("Not applying quota tariff [{}] in usage record [{}] 
of account [{}] due to it is out of the period to be applied. Period of the 
usage"
+                            + " record [startDate: {}, endDate: {}], period of 
the quota tariff [startDate: {}, endDate: {}].", 
quotaTariff.toString(usageAggregationTimeZone),
+                    usageRecord.toString(usageAggregationTimeZone), 
accountToString, DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
usageRecordStartDate),
+                    DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
usageRecordEndDate), DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
quotaTariffStartDate),
+                    DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
quotaTariffEndDate));
 
             return false;
         }
@@ -497,11 +492,11 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
     }
 
     protected QuotaUsageVO createQuotaUsageAccordingToUsageUnit(UsageVO 
usageRecord, BigDecimal aggregatedQuotaTariffsValue, String accountToString) {
-        String usageRecordToString = usageRecord.toString();
+        String usageRecordToString = 
usageRecord.toString(usageAggregationTimeZone);
 
         if (aggregatedQuotaTariffsValue.equals(BigDecimal.ZERO)) {
-            logger.debug(String.format("Usage record [%s] for account [%s] 
does not have quota tariffs to be calculated, therefore we will mark it as 
calculated.",
-                    usageRecordToString, accountToString));
+            logger.debug("No tariffs were applied to usage record [{}] of 
account [{}] or they resulted in 0; We will only mark the usage record as 
calculated.",
+                    usageRecordToString, accountToString);
             return null;
         }
 
diff --git 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java
 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java
index 7bc2870e36a..5b07cadb94a 100644
--- 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java
+++ 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java
@@ -16,11 +16,13 @@
 //under the License.
 package org.apache.cloudstack.quota.vo;
 
+import com.cloud.utils.DateUtil;
 import org.apache.cloudstack.api.InternalIdentity;
 import org.apache.cloudstack.quota.constant.QuotaTypes;
 import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
 
 import com.cloud.utils.db.GenericDao;
+import org.apache.commons.lang3.StringUtils;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -33,6 +35,7 @@ import javax.persistence.TemporalType;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.TimeZone;
 import java.util.UUID;
 
 @Entity
@@ -261,6 +264,12 @@ public class QuotaTariffVO implements InternalIdentity {
 
     @Override
     public String toString() {
-        return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, 
"uuid", "name", "effectiveOn", "endDate");
-    };
+        return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, 
"uuid", "name", "usageName");
+    }
+
+    public String toString(TimeZone timeZone) {
+        String startDateString = DateUtil.displayDateInTimezone(timeZone, 
getEffectiveOn());
+        String endDateString = DateUtil.displayDateInTimezone(timeZone, 
getEndDate());
+        return String.format("%s,\"startDate\":\"%s\",\"endDate\":\"%s\"}", 
StringUtils.chop(this.toString()), startDateString, endDateString);
+    }
 }
diff --git 
a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
 
b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
index eb667b00c3b..d7f2832831a 100644
--- 
a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
+++ 
b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
@@ -34,6 +34,7 @@ import java.util.function.Consumer;
 
 import javax.inject.Inject;
 
+import com.cloud.utils.DateUtil;
 import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.command.QuotaBalanceCmd;
@@ -44,6 +45,7 @@ import org.apache.cloudstack.api.command.QuotaTariffCreateCmd;
 import org.apache.cloudstack.api.command.QuotaTariffListCmd;
 import org.apache.cloudstack.api.command.QuotaTariffUpdateCmd;
 import org.apache.cloudstack.quota.QuotaManager;
+import org.apache.cloudstack.quota.QuotaManagerImpl;
 import org.apache.cloudstack.quota.QuotaService;
 import org.apache.cloudstack.quota.QuotaStatement;
 import org.apache.cloudstack.quota.constant.QuotaConfig;
@@ -470,12 +472,14 @@ public class QuotaResponseBuilderImpl implements 
QuotaResponseBuilder {
         }
 
         if (endDate.compareTo(startDate) < 0) {
-            throw new InvalidParameterValueException(String.format("The quota 
tariff's end date [%s] cannot be less than the start date [%s]", endDate, 
startDate));
+            throw new InvalidParameterValueException(String.format("The quota 
tariff's end date [%s] cannot be less than the start date [%s].",
+                    endDate, startDate));
         }
 
         Date now = _quotaService.computeAdjustedTime(new Date());
         if (endDate.compareTo(now) < 0) {
-            throw new InvalidParameterValueException(String.format("The quota 
tariff's end date [%s] cannot be less than now [%s].", endDate, now));
+            throw new InvalidParameterValueException(String.format("The quota 
tariff's end date [%s] cannot be less than now [%s].",
+                    endDate, now));
         }
 
         newQuotaTariff.setEndDate(endDate);
@@ -487,7 +491,8 @@ public class QuotaResponseBuilderImpl implements 
QuotaResponseBuilder {
         QuotaBalanceVO qb = _quotaBalanceDao.findLaterBalanceEntry(accountId, 
domainId, despositedOn);
 
         if (qb != null) {
-            throw new InvalidParameterValueException("Incorrect deposit date: 
" + despositedOn + " there are balance entries after this date");
+            throw new InvalidParameterValueException(String.format("Incorrect 
deposit date [%s], as there are balance entries after this date.",
+                    despositedOn));
         }
 
         QuotaCreditsVO credits = new QuotaCreditsVO(accountId, domainId, new 
BigDecimal(amount), updatedBy);
@@ -500,9 +505,8 @@ public class QuotaResponseBuilderImpl implements 
QuotaResponseBuilder {
         }
         final boolean lockAccountEnforcement = 
"true".equalsIgnoreCase(QuotaConfig.QuotaEnableEnforcement.value());
         final BigDecimal currentAccountBalance = 
_quotaBalanceDao.lastQuotaBalance(accountId, domainId, startOfNextDay(new 
Date(despositedOn.getTime())));
-        if (logger.isDebugEnabled()) {
-            logger.debug("AddQuotaCredits: Depositing " + amount + " on 
adjusted date " + despositedOn + ", current balance " + currentAccountBalance);
-        }
+        logger.debug("Depositing [{}] credits on adjusted date [{}]; current 
balance is [{}].", amount,
+                
DateUtil.displayDateInTimezone(QuotaManagerImpl.getUsageAggregationTimeZone(), 
despositedOn), currentAccountBalance);
         // update quota account with the balance
         _quotaService.saveQuotaAccount(account, currentAccountBalance, 
despositedOn);
         if (lockAccountEnforcement) {
@@ -581,9 +585,10 @@ public class QuotaResponseBuilderImpl implements 
QuotaResponseBuilder {
         QuotaBalanceResponse resp = new QuotaBalanceResponse();
         BigDecimal lastCredits = new BigDecimal(0);
         for (QuotaBalanceVO entry : quotaBalance) {
-            if (logger.isDebugEnabled()) {
-                logger.debug("createQuotaLastBalanceResponse Date=" + 
entry.getUpdatedOn() + " balance=" + entry.getCreditBalance() + " credit=" + 
entry.getCreditsId());
-            }
+            logger.debug("createQuotaLastBalanceResponse Date={} balance={} 
credit={}",
+                    
DateUtil.displayDateInTimezone(QuotaManagerImpl.getUsageAggregationTimeZone(), 
entry.getUpdatedOn()),
+                    entry.getCreditBalance(), entry.getCreditsId());
+
             lastCredits = lastCredits.add(entry.getCreditBalance());
         }
         resp.setStartQuota(lastCredits);
@@ -638,7 +643,8 @@ public class QuotaResponseBuilderImpl implements 
QuotaResponseBuilder {
         }
 
         if (startDate.compareTo(now) < 0) {
-            throw new InvalidParameterValueException(String.format("The quota 
tariff's start date [%s] cannot be less than now [%s]", startDate, now));
+            throw new InvalidParameterValueException(String.format("The value 
passed as Quota tariff's start date is in the past: [%s]. " +
+                    "Please, inform a date in the future or do not pass the 
parameter to use the current date and time.", startDate));
         }
 
         return persistNewQuotaTariff(null, name, usageType, startDate, 
cmd.getEntityOwnerId(), endDate, value, description, activationRule);
diff --git 
a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
 
b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
index bd08f6afd7e..88a69c47e05 100644
--- 
a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
+++ 
b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
@@ -51,7 +51,7 @@ import org.apache.cloudstack.quota.dao.QuotaUsageDao;
 import org.apache.cloudstack.quota.vo.QuotaAccountVO;
 import org.apache.cloudstack.quota.vo.QuotaBalanceVO;
 import org.apache.cloudstack.quota.vo.QuotaUsageVO;
-import org.apache.cloudstack.utils.usage.UsageUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Component;
 
 import com.cloud.configuration.Config;
@@ -83,7 +83,6 @@ public class QuotaServiceImpl extends ManagerBase implements 
QuotaService, Confi
     private QuotaResponseBuilder _respBldr;
 
     private TimeZone _usageTimezone;
-    private int _aggregationDuration = 0;
 
     public QuotaServiceImpl() {
         super();
@@ -92,21 +91,10 @@ public class QuotaServiceImpl extends ManagerBase 
implements QuotaService, Confi
     @Override
     public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
         super.configure(name, params);
-        String timeZoneStr = 
_configDao.getValue(Config.UsageAggregationTimezone.toString());
-        String aggregationRange = 
_configDao.getValue(Config.UsageStatsJobAggregationRange.toString());
-        if (timeZoneStr == null) {
-            timeZoneStr = "GMT";
-        }
+
+        String timeZoneStr = 
ObjectUtils.defaultIfNull(_configDao.getValue(Config.UsageAggregationTimezone.toString()),
 "GMT");
         _usageTimezone = TimeZone.getTimeZone(timeZoneStr);
 
-        _aggregationDuration = Integer.parseInt(aggregationRange);
-        if (_aggregationDuration < UsageUtils.USAGE_AGGREGATION_RANGE_MIN) {
-            logger.warn("Usage stats job aggregation range is to small, using 
the minimum value of " + UsageUtils.USAGE_AGGREGATION_RANGE_MIN);
-            _aggregationDuration = UsageUtils.USAGE_AGGREGATION_RANGE_MIN;
-        }
-        if (logger.isDebugEnabled()) {
-            logger.debug("Usage timezone = " + _usageTimezone + " 
AggregationDuration=" + _aggregationDuration);
-        }
         return true;
     }
 
diff --git 
a/plugins/database/quota/src/test/java/org/apache/cloudstack/quota/QuotaServiceImplTest.java
 
b/plugins/database/quota/src/test/java/org/apache/cloudstack/quota/QuotaServiceImplTest.java
index 0b9d34daa70..fa58c35ea5d 100644
--- 
a/plugins/database/quota/src/test/java/org/apache/cloudstack/quota/QuotaServiceImplTest.java
+++ 
b/plugins/database/quota/src/test/java/org/apache/cloudstack/quota/QuotaServiceImplTest.java
@@ -99,7 +99,6 @@ public class QuotaServiceImplTest extends TestCase {
         QuotaResponseBuilderField.set(quotaService, respBldr);
 
         
Mockito.when(configDao.getValue(Mockito.eq(Config.UsageAggregationTimezone.toString()))).thenReturn("IST");
-        
Mockito.when(configDao.getValue(Mockito.eq(Config.UsageStatsJobAggregationRange.toString()))).thenReturn("1");
         quotaService.configure("randomName", null);
     }
 
diff --git a/server/src/main/java/com/cloud/usage/UsageServiceImpl.java 
b/server/src/main/java/com/cloud/usage/UsageServiceImpl.java
index 6d6a05cac19..3398e3ba571 100644
--- a/server/src/main/java/com/cloud/usage/UsageServiceImpl.java
+++ b/server/src/main/java/com/cloud/usage/UsageServiceImpl.java
@@ -27,6 +27,7 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import com.cloud.domain.Domain;
+import com.cloud.utils.DateUtil;
 import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
 import org.apache.cloudstack.api.command.admin.usage.ListUsageRecordsCmd;
 import org.apache.cloudstack.api.command.admin.usage.RemoveRawUsageRecordsCmd;
@@ -36,6 +37,7 @@ import 
org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.usage.Usage;
 import org.apache.cloudstack.usage.UsageService;
 import org.apache.cloudstack.usage.UsageTypes;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Component;
@@ -97,7 +99,7 @@ public class UsageServiceImpl extends ManagerBase implements 
UsageService, Manag
     private ConfigurationDao _configDao;
     @Inject
     private ProjectManager _projectMgr;
-    private TimeZone _usageTimezone;
+    private TimeZone _usageTimezone = TimeZone.getTimeZone("GMT");
     @Inject
     private AccountService _accountService;
     @Inject
@@ -127,10 +129,7 @@ public class UsageServiceImpl extends ManagerBase 
implements UsageService, Manag
     @Override
     public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
         super.configure(name, params);
-        String timeZoneStr = 
_configDao.getValue(Config.UsageAggregationTimezone.toString());
-        if (timeZoneStr == null) {
-           timeZoneStr = "GMT";
-        }
+        String timeZoneStr = 
ObjectUtils.defaultIfNull(_configDao.getValue(Config.UsageAggregationTimezone.toString()),
 "GMT");
         _usageTimezone = TimeZone.getTimeZone(timeZoneStr);
         return true;
     }
@@ -211,10 +210,10 @@ public class UsageServiceImpl extends ManagerBase 
implements UsageService, Manag
         Date adjustedStartDate = computeAdjustedTime(startDate, usageTZ);
         Date adjustedEndDate = computeAdjustedTime(endDate, usageTZ);
 
-        if (logger.isDebugEnabled()) {
-            logger.debug("getting usage records for account: " + accountId + 
", domainId: " + domainId + ", between " + adjustedStartDate + " and " + 
adjustedEndDate +
-                ", using pageSize: " + cmd.getPageSizeVal() + " and 
startIndex: " + cmd.getStartIndex());
-        }
+        logger.debug("Getting usage records for account ID [{}], domain ID 
[{}] between [{}] and [{}] using page size [{}] and start index [{}].",
+                accountId, domainId, 
DateUtil.displayDateInTimezone(_usageTimezone, adjustedStartDate),
+                DateUtil.displayDateInTimezone(_usageTimezone, 
adjustedEndDate), cmd.getPageSizeVal(),
+                cmd.getStartIndex());
 
         Filter usageFilter = new Filter(UsageVO.class, "id", true, 
cmd.getStartIndex(), cmd.getPageSizeVal());
 
diff --git a/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java 
b/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
index 10ca798a82c..a21fe6251de 100644
--- a/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
@@ -61,6 +61,7 @@ import com.cloud.user.VmDiskStatisticsVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserStatisticsDao;
 import com.cloud.user.dao.VmDiskStatisticsDao;
+import com.cloud.utils.DateUtil;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
@@ -172,7 +173,6 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
     private boolean _runQuota=false;
     String _hostname = null;
     int _pid = 0;
-    TimeZone _usageTimezone = TimeZone.getTimeZone("GMT");;
     private final GlobalLock _heartbeatLock = 
GlobalLock.getInternLock("usage.job.heartbeat.check");
     private final List<UsageNetworkVO> usageNetworks = new 
ArrayList<UsageNetworkVO>();
     private final List<UsageVmDiskVO> usageVmDisks = new 
ArrayList<UsageVmDiskVO>();
@@ -184,6 +184,7 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
     private Future _heartbeat = null;
     private Future _sanity = null;
     private boolean  usageSnapshotSelection = false;
+    private static TimeZone usageAggregationTimeZone = 
TimeZone.getTimeZone("GMT");
 
     public UsageManagerImpl() {
     }
@@ -226,7 +227,7 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
         String execTime = configs.get("usage.stats.job.exec.time");
         String aggregationRange = 
configs.get("usage.stats.job.aggregation.range");
         String execTimeZone = configs.get("usage.execution.timezone");
-        String aggreagationTimeZone = 
configs.get("usage.aggregation.timezone");
+        String aggregationTimeZone = configs.get("usage.aggregation.timezone");
         String sanityCheckInterval = 
configs.get("usage.sanity.check.interval");
         String quotaEnable = configs.get("quota.enable.service");
         _runQuota = Boolean.valueOf(quotaEnable == null ? "false" : 
quotaEnable );
@@ -235,10 +236,9 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
             _sanityCheckInterval = Integer.parseInt(sanityCheckInterval);
         }
 
-        if (aggreagationTimeZone != null && !aggreagationTimeZone.isEmpty()) {
-            _usageTimezone = TimeZone.getTimeZone(aggreagationTimeZone);
+        if (aggregationTimeZone != null && !aggregationTimeZone.isEmpty()) {
+            usageAggregationTimeZone = 
TimeZone.getTimeZone(aggregationTimeZone);
         }
-        logger.debug("Usage stats aggregation time zone: " + 
aggreagationTimeZone);
 
         try {
             if ((execTime == null) || (aggregationRange == null)) {
@@ -254,25 +254,27 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
             }
             int hourOfDay = Integer.parseInt(execTimeSegments[0]);
             int minutes = Integer.parseInt(execTimeSegments[1]);
-            _jobExecTime.setTime(new Date());
+
+            Date currentDate = new Date();
+            _jobExecTime.setTime(currentDate);
 
             _jobExecTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
             _jobExecTime.set(Calendar.MINUTE, minutes);
             _jobExecTime.set(Calendar.SECOND, 0);
             _jobExecTime.set(Calendar.MILLISECOND, 0);
-            if (execTimeZone != null && !execTimeZone.isEmpty()) {
-                _jobExecTime.setTimeZone(TimeZone.getTimeZone(execTimeZone));
-            }
+
+            TimeZone jobExecTimeZone = execTimeZone != null ? 
TimeZone.getTimeZone(execTimeZone) : Calendar.getInstance().getTimeZone();
+            _jobExecTime.setTimeZone(jobExecTimeZone);
 
             // if the hour to execute the job has already passed, roll the day 
forward to the next day
-            Date execDate = _jobExecTime.getTime();
-            if (execDate.before(new Date())) {
+            if (_jobExecTime.getTime().before(currentDate)) {
                 _jobExecTime.roll(Calendar.DAY_OF_YEAR, true);
             }
 
-            logger.debug("Execution Time: " + execDate.toString());
-            Date currentDate = new Date(System.currentTimeMillis());
-            logger.debug("Current Time: " + currentDate.toString());
+            logger.info("Usage is configured to execute in time zone [{}], at 
[{}], each [{}] minutes; the current time in that timezone is [{}] and the " +
+                            "next job is scheduled to execute at [{}]. During 
its execution, Usage will aggregate stats according to the time zone [{}] 
defined in global setting [usage.aggregation.timezone].",
+                    jobExecTimeZone.getID(), execTime, aggregationRange, 
DateUtil.displayDateInTimezone(jobExecTimeZone, currentDate),
+                    DateUtil.displayDateInTimezone(jobExecTimeZone, 
_jobExecTime.getTime()), usageAggregationTimeZone.getID());
 
             _aggregationDuration = Integer.parseInt(aggregationRange);
             if (_aggregationDuration < UsageUtils.USAGE_AGGREGATION_RANGE_MIN) 
{
@@ -298,6 +300,10 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
         return true;
     }
 
+    public static TimeZone getUsageAggregationTimeZone() {
+        return usageAggregationTimeZone;
+    }
+
     @Override
     public boolean start() {
         if (logger.isInfoEnabled()) {
@@ -380,7 +386,7 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
             // For executing the job, we treat hourly and daily as special 
time ranges, using the previous full hour or the previous
             // full day.  Otherwise we just subtract off the aggregation range 
from the current time and use that as start date with
             // current time as end date.
-            Calendar cal = Calendar.getInstance(_usageTimezone);
+            Calendar cal = Calendar.getInstance(usageAggregationTimeZone);
             cal.setTime(new Date());
             long startDate = 0;
             long endDate = 0;
@@ -488,9 +494,8 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
             }
             Date startDate = new Date(startDateMillis);
             Date endDate = new Date(endDateMillis);
-            if (logger.isInfoEnabled()) {
-                logger.info("Parsing usage records between " + startDate + " 
and " + endDate);
-            }
+            logger.info("Parsing usage records between [{}] and [{}].", 
DateUtil.displayDateInTimezone(usageAggregationTimeZone, startDate),
+                    DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
endDate));
 
             List<AccountVO> accounts = null;
             List<UserStatisticsVO> userStats = null;
@@ -705,7 +710,7 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
                 // get user stats in order to compute network usage
                 networkStats = _usageNetworkDao.getRecentNetworkStats();
 
-                Calendar recentlyDeletedCal = 
Calendar.getInstance(_usageTimezone);
+                Calendar recentlyDeletedCal = 
Calendar.getInstance(usageAggregationTimeZone);
                 recentlyDeletedCal.setTimeInMillis(startDateMillis);
                 recentlyDeletedCal.add(Calendar.MINUTE, -1 * 
THREE_DAYS_IN_MINUTES);
                 Date recentlyDeletedDate = recentlyDeletedCal.getTime();
@@ -814,7 +819,7 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
                 Date currentEndDate = endDate;
                 Date tempDate = endDate;
 
-                Calendar aggregateCal = Calendar.getInstance(_usageTimezone);
+                Calendar aggregateCal = 
Calendar.getInstance(usageAggregationTimeZone);
 
                 while ((tempDate.after(startDate)) && ((tempDate.getTime() - 
startDate.getTime()) > 60000)) {
                     currentEndDate = tempDate;
@@ -1850,8 +1855,9 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
                 deleteUsageVpnUser(event, account);
                 break;
             default:
-                logger.debug(String.format("The event [type=%s, zoneId=%s, 
accountId=%s, userId=%s, resourceName=%s, createDate=%s] is neither of type 
[%s] nor [%s]",
-                        event.getType(), zoneId, accountId, userId, 
event.getResourceName(), event.getCreateDate(), EventTypes.EVENT_VPN_USER_ADD, 
EventTypes.EVENT_VPN_USER_REMOVE));
+                logger.debug("The event [type={}, zoneId={}, accountId={}, 
userId={}, resourceName={}, createDate={}] is neither of type [{}] nor [{}].",
+                        event.getType(), zoneId, accountId, userId, 
event.getResourceName(), 
DateUtil.displayDateInTimezone(usageAggregationTimeZone, event.getCreateDate()),
+                        EventTypes.EVENT_VPN_USER_ADD, 
EventTypes.EVENT_VPN_USER_REMOVE);
         }
     }
 
@@ -1967,8 +1973,10 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
                 deleteUsageVMSnapshot(event);
                 break;
             default:
-                logger.debug(String.format("The event [type=%s, zoneId=%s, 
accountId=%s, resourceName=%s, diskOfferingId=%s, createDate=%s] is neither of 
type [%s] nor [%s]",
-                        event.getType(), event.getZoneId(), 
event.getAccountId(), event.getResourceName(), event.getOfferingId(), 
event.getCreateDate(), EventTypes.EVENT_VM_SNAPSHOT_CREATE, 
EventTypes.EVENT_VM_SNAPSHOT_DELETE));
+                logger.debug("The event [type={}, zoneId={}, accountId={}, 
resourceName={}, diskOfferingId={}, createDate={}] is neither of type [{}] nor 
[{}].",
+                        event.getType(), event.getZoneId(), 
event.getAccountId(), event.getResourceName(), event.getOfferingId(),
+                        
DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
event.getCreateDate()), EventTypes.EVENT_VM_SNAPSHOT_CREATE,
+                        EventTypes.EVENT_VM_SNAPSHOT_DELETE);
         }
     }
 
@@ -1992,8 +2000,8 @@ public class UsageManagerImpl extends ManagerBase 
implements UsageManager, Runna
             String snapId = detailVO.getValue();
             vmSnapshotId = Long.valueOf(snapId);
         }
-        logger.debug(String.format("Creating usage VM Snapshot for VM id [%s] 
assigned to account [%s] domain [%s], zone [%s], and created at [%s]", vmId, 
accountId, domainId, zoneId,
-                event.getCreateDate()));
+        logger.debug("Creating usage VM Snapshot for VM id [{}] assigned to 
account [{}] domain [{}], zone [{}], and created at [{}].",
+                vmId, accountId, domainId, zoneId, 
DateUtil.displayDateInTimezone(usageAggregationTimeZone, 
event.getCreateDate()));
         UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, 
accountId, domainId, vmId, offeringId, size, created, null);
         vsVO.setVmSnapshotId(vmSnapshotId);
         _usageVMSnapshotDao.persist(vsVO);
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java
index 5e516231f0d..516f58a0a7b 100644
--- a/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -149,10 +151,9 @@ public class IPAddressUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating IP usage record with id: " + ipId + ", 
usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate 
+
-                ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating IP usage record with id [{}], usage [{}], 
startDate [{}], and endDate [{}], for account [{}].",
+                ipId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         String usageDesc = "IPAddress: " + ipAddress;
 
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/LoadBalancerUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/LoadBalancerUsageParser.java
index 77cdbfb8a4e..3d02419aec8 100644
--- a/usage/src/main/java/com/cloud/usage/parser/LoadBalancerUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/LoadBalancerUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -146,10 +148,9 @@ public class LoadBalancerUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating Volume usage record for load balancer: " + 
lbId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " 
+
-                endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating usage record for load balancer with id [{}], 
usage [{}], startDate [{}], and endDate [{}], for account [{}].",
+                lbId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "Load Balancing Policy: " + lbId + " usage time";
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/NetworkOfferingUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/NetworkOfferingUsageParser.java
index 8ec46416272..b0fc6c2df95 100644
--- a/usage/src/main/java/com/cloud/usage/parser/NetworkOfferingUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/NetworkOfferingUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -148,10 +150,9 @@ public class NetworkOfferingUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating network offering:" + noId + " usage record 
for Vm : " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate +
-                ", endDate: " + endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating network offering usage record for id [{}], vm 
[{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
+                noId, vmId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "Network offering:" + noId + " for Vm : " + vmId + 
" usage time";
diff --git a/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java
index 7b530b9a3b3..912c2b58cb8 100644
--- a/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -103,10 +105,10 @@ public class NetworkUsageParser {
             long totalBytesReceived = networkInfo.getBytesRcvd();
 
             if ((totalBytesSent > 0L) || (totalBytesReceived > 0L)) {
-                if (LOGGER.isDebugEnabled()) {
-                    LOGGER.debug("Creating usage record, total bytes sent: " + 
toHumanReadableSize(totalBytesSent) + ", total bytes received: " + 
toHumanReadableSize(totalBytesReceived) + " for account: " +
-                        account.getId() + " in availability zone " + 
networkInfo.getZoneId() + ", start: " + startDate + ", end: " + endDate);
-                }
+                LOGGER.debug("Creating usage record, total bytes sent [{}], 
total bytes received [{}], startDate [{}], and endDate [{}], for account [{}] 
in " +
+                                "availability zone [{}].", 
toHumanReadableSize(totalBytesSent), toHumanReadableSize(totalBytesReceived),
+                        
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                        
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId(), networkInfo.getZoneId());
 
                 Long hostId = null;
 
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/PortForwardingUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/PortForwardingUsageParser.java
index e746284b3a3..fce2f6f8a9c 100644
--- a/usage/src/main/java/com/cloud/usage/parser/PortForwardingUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/PortForwardingUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -146,10 +148,9 @@ public class PortForwardingUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating usage record for port forwarding rule: " + 
pfId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " 
+
-                endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating usage record for port forwarding rule [{}], 
usage [{}], startDate [{}], and endDate [{}], for account [{}].",
+                pfId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "Port Forwarding Rule: " + pfId + " usage time";
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/SecurityGroupUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/SecurityGroupUsageParser.java
index bec14bae230..4bb146b7763 100644
--- a/usage/src/main/java/com/cloud/usage/parser/SecurityGroupUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/SecurityGroupUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -147,10 +149,9 @@ public class SecurityGroupUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating security group:" + sgId + " usage record 
for Vm : " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate +
-                ", endDate: " + endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating security group usage record for id [{}], vm 
[{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
+                sgId, vmId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "Security Group: " + sgId + " for Vm : " + vmId + " 
usage time";
diff --git a/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java
index 6684ae03e43..62d1a429ae3 100644
--- a/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -159,10 +161,9 @@ public class StorageUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating Storage usage record for type: " + type + " 
with id: " + storageId + ", usage: " + usageDisplay + ", startDate: " + 
startDate +
-                ", endDate: " + endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating Storage usage record for type [{}], with id 
[{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
+                type, storageId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         String usageDesc = "";
         Long tmplSourceId = null;
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/VMInstanceUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/VMInstanceUsageParser.java
index 56ee3282afc..b261cc717e6 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VMInstanceUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VMInstanceUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -173,10 +175,9 @@ public class VMInstanceUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating VM usage record for vm: " + vmName + ", 
type: " + type + ", usage: " + usageDisplay + ", startDate: " + startDate + ", 
endDate: " +
-                endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating VM usage record for vm [{}], type [{}], usage 
[{}], startDate [{}], and endDate [{}], for account [{}].",
+                vmName, type, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = vmName;
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/VMSnapshotOnPrimaryParser.java 
b/usage/src/main/java/com/cloud/usage/parser/VMSnapshotOnPrimaryParser.java
index ad2fdd93cfa..d59d3c741f1 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VMSnapshotOnPrimaryParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VMSnapshotOnPrimaryParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -115,10 +117,9 @@ public class VMSnapshotOnPrimaryParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating VMSnapshot Id: " + vmSnapshotId + " On 
Primary usage record for vm: " + vmId + ", usage: " + usageDisplay + ", 
startDate: " + startDate + ", endDate: " + endDate
-                    + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating usage record for VMSnapshot with id [{}] in 
primary, vm [{}], usage [{}], startDate [{}], and endDate [{}], for account 
[{}].",
+                vmSnapshotId, vmId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "VMSnapshot Id: " + vmSnapshotId + " On Primary 
Usage: VM Id: " + vmId;
diff --git 
a/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java
index 2cf538cc31a..63fc213f4aa 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -134,10 +136,9 @@ public class VMSnapshotUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating VMSnapshot Id:" + vmSnapshotId + " Volume 
usage record for vol: " + volId + ", usage: " + usageDisplay + ", startDate: " 
+ startDate + ", endDate: " +
-                endDate + ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating usage record for VMSnapshot with id [{}], vol 
[{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
+                vmSnapshotId, volId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "VMSnapshot Id: " + vmSnapshotId + " Usage: " + "VM 
Id: " + vmId + " Volume Id: " + volId + " ";
diff --git a/usage/src/main/java/com/cloud/usage/parser/VPNUserUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/VPNUserUsageParser.java
index c983457cf59..d5eac4fea20 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VPNUserUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VPNUserUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -142,10 +144,9 @@ public class VPNUserUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating VPN user:" + userId + " usage record, 
usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate 
+
-                ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating usage record for VPN user [{}], usage [{}], 
startDate [{}], and endDate [{}], for account [{}].",
+                userId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "VPN User: " + userName + ", Id: " + userId + " 
usage time";
diff --git a/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java
index 0d04fe39339..a5b537b8ffd 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -108,11 +110,10 @@ public class VmDiskUsageParser {
             long bytesWrite = vmDiskInfo.getBytesWrite();
 
             if ((ioRead > 0L) || (ioWrite > 0L) || (bytesRead > 0L) || 
(bytesWrite > 0L)) {
-                if (LOGGER.isDebugEnabled()) {
-                    LOGGER.debug("Creating vm disk usage record, io read:" + 
toHumanReadableSize(ioRead) + ", io write: " + toHumanReadableSize(ioWrite) + 
", bytes read:" + toHumanReadableSize(bytesRead) + ", bytes write: " +
-                            toHumanReadableSize(bytesWrite) + " for account: " 
+ account.getId() + " in availability zone " + vmDiskInfo.getZoneId() + ", 
start: " + startDate + ", end: " +
-                        endDate);
-                }
+                LOGGER.debug("Creating vm disk usage record, io read [{}], io 
write [{}], bytes read [{}], bytes write [{}], startDate [{}], and endDate 
[{}], " +
+                                "for account [{}] in availability zone [{}].", 
toHumanReadableSize(ioRead), toHumanReadableSize(ioWrite), 
toHumanReadableSize(bytesRead),
+                        toHumanReadableSize(bytesWrite), 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                        
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId(), vmDiskInfo.getZoneId());
 
                 Long vmId = null;
                 Long volumeId = null;
diff --git a/usage/src/main/java/com/cloud/usage/parser/VolumeUsageParser.java 
b/usage/src/main/java/com/cloud/usage/parser/VolumeUsageParser.java
index a63d0df00bd..a5b6d77e9ab 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VolumeUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VolumeUsageParser.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import com.cloud.usage.UsageManagerImpl;
+import com.cloud.utils.DateUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.stereotype.Component;
@@ -153,10 +155,9 @@ public class VolumeUsageParser {
         DecimalFormat dFormat = new DecimalFormat("#.######");
         String usageDisplay = dFormat.format(usage);
 
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Creating Volume usage record for vol: " + volId + ", 
usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate 
+
-                ", for account: " + account.getId());
-        }
+        LOGGER.debug("Creating Volume usage record for vol [{}], usage [{}], 
startDate [{}], and endDate [{}], for account [{}].",
+                volId, usageDisplay, 
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
startDate),
+                
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), 
endDate), account.getId());
 
         // Create the usage record
         String usageDesc = "Volume Id: " + volId + " usage time";
diff --git a/utils/src/main/java/com/cloud/utils/DateUtil.java 
b/utils/src/main/java/com/cloud/utils/DateUtil.java
index 39ea60dae18..fdf2ba8fe01 100644
--- a/utils/src/main/java/com/cloud/utils/DateUtil.java
+++ b/utils/src/main/java/com/cloud/utils/DateUtil.java
@@ -48,11 +48,12 @@ public class DateUtil {
 
     public static final TimeZone GMT_TIMEZONE = TimeZone.getTimeZone("GMT");
     public static final String YYYYMMDD_FORMAT = "yyyyMMddHHmmss";
-    private static final DateFormat s_outputFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
+    private static final String ZONED_DATETIME_FORMAT = 
"yyyy-MM-dd'T'HH:mm:ssZ";
+    private static final DateFormat ZONED_DATETIME_SIMPLE_FORMATTER = new 
SimpleDateFormat(ZONED_DATETIME_FORMAT);
 
     private static final DateTimeFormatter[] parseFormats = new 
DateTimeFormatter[]{
         DateTimeFormatter.ISO_OFFSET_DATE_TIME,
-        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"),
+        DateTimeFormatter.ofPattern(ZONED_DATETIME_FORMAT),
         DateTimeFormatter.ISO_INSTANT,
         // with milliseconds
         DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"),
@@ -95,7 +96,7 @@ public class DateUtil {
     }
 
     public static String displayDateInTimezone(TimeZone tz, Date time) {
-        return getDateDisplayString(tz, time, "yyyy-MM-dd HH:mm:ss z");
+        return getDateDisplayString(tz, time, ZONED_DATETIME_FORMAT);
     }
 
     public static String getDateDisplayString(TimeZone tz, Date time) {
@@ -103,6 +104,10 @@ public class DateUtil {
     }
 
     public static String getDateDisplayString(TimeZone tz, Date time, String 
formatString) {
+        if (time == null) {
+            return null;
+        }
+
         DateFormat df = new SimpleDateFormat(formatString);
         df.setTimeZone(tz);
 
@@ -113,9 +118,9 @@ public class DateUtil {
         if (date == null) {
             return "";
         }
-        String formattedString = null;
-        synchronized (s_outputFormat) {
-            formattedString = s_outputFormat.format(date);
+        String formattedString;
+        synchronized (ZONED_DATETIME_SIMPLE_FORMATTER) {
+            formattedString = ZONED_DATETIME_SIMPLE_FORMATTER.format(date);
         }
         return formattedString;
     }

Reply via email to