Код Java logger для создать отдельный журнал для каждого приложения


Я пытаюсь создать оболочку логгер, который будет использоваться вызывающего приложения, установленные на IBM был. Поскольку я с помощью Java утиль регистратор, я буду иметь, чтобы добавить обработчики для каждого регистратора программно.

Пожалуйста, поделитесь своим мнением. Я больше обеспокоен тем, как я использую обработчики файл и закрывая их.

Вот это класс TransactionLogger

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;

public class TransactionLogger
{
  private String appCode;
  private String externalKey;
  private String externalBatch;
  private String transactionId;
  private Date ruleExecutionStartTime;
  private Date ruleExecutionEndTime;
  private long ruleResponseTime;
  private Date DSStartTime;
  private Date DSEndTime;
  private long DSResponseTime;
  private Integer rulesFired;
  private Integer errors;
  private String userData;
  private String serverName;
  private Handler fh;



public String getAppCode()
  {
    return this.appCode;
  }

  public void setAppCode(String appCode)
  {
    this.appCode = appCode;
  }

  public String getExternalKey()
  {
    return this.externalKey;
  }

  public void setExternalKey(String externalKey)
  {
    this.externalKey = externalKey;
  }

  public String getExternalBatch()
  {
    return this.externalBatch;
  }

  public void setExternalBatch(String externalBatch)
  {
    this.externalBatch = externalBatch;
  }

  public String getTransactionId()
  {
    return this.transactionId;
  }

  public void setTransactionId(String transactionId)
  {
    this.transactionId = transactionId;
  }

  public Date getRuleExecutionStartTime()
  {
    return this.ruleExecutionStartTime;
  }

  public void setRuleExecutionStartTime(Date ruleExecutionStartTime)
  {
    this.ruleExecutionStartTime = ruleExecutionStartTime;
  }

  public Date getRuleExecutionEndTime()
  {
    return this.ruleExecutionEndTime;
  }

  public void setRuleExecutionEndTime(Date ruleExecutionEndTime)
  {
    this.ruleExecutionEndTime = ruleExecutionEndTime;
  }

  public long getRuleResponseTime()
  {
    return this.ruleResponseTime;
  }

  public void setRuleResponseTime(long ruleResponseTime)
  {
    this.ruleResponseTime = ruleResponseTime;
  }

  public Date getDSStartTime()
  {
    return this.DSStartTime;
  }

  public void setDSStartTime(Date startTime)
  {
    this.DSStartTime = startTime;
  }

  public Date getDSEndTime()
  {
    return this.DSEndTime;
  }

  public void setDSEndTime(Date endTime)
  {
    this.DSEndTime = endTime;
  }

  public long getDSResponseTime()
  {
    return this.DSResponseTime;
  }

  public void setDSResponseTime(long responseTime)
  {
    this.DSResponseTime = responseTime;
  }

  public Integer getRulesFired()
  {
    return this.rulesFired;
  }

  public void setRulesFired(Integer rulesFired)
  {
    this.rulesFired = rulesFired;
  }

  public Integer getErrors()
  {
    return this.errors;
  }

  public void setErrors(Integer errors)
  {
    this.errors = errors;
  }

  public String getUserData()
  {
    return this.userData;
  }

  public void setUserData(String userData)
  {
    this.userData = userData;
  }

  public String getServerName()
  {
    return this.serverName;
  }

  public void setServerName(String serverName)
  {
    this.serverName = serverName;
  }

  public String toString()
  {
    String hostName = "";
    try
    {
      String hostNameDerived = InetAddress.getLocalHost().getHostName();
      if (hostNameDerived.indexOf(".") > 0) {
        hostName = hostNameDerived.split("\\.")[0];
      }
    }
    catch (UnknownHostException uhe)
    {
      hostName = "Unknown";
    }
    if ((this.ruleExecutionEndTime != null) && (this.ruleExecutionStartTime != null)) {
      this.ruleResponseTime = (this.ruleExecutionEndTime.getTime() - this.ruleExecutionStartTime.getTime());
    }

    setServerName(hostName);

    if (this.ruleExecutionEndTime == null) {
      this.ruleExecutionEndTime = new Date();
    }
    if (this.ruleExecutionStartTime == null) {
      this.ruleExecutionStartTime = new Date();
    }
    if ((this.DSStartTime != null) && (this.DSEndTime != null)) {
      this.DSResponseTime = (this.DSStartTime.getTime() - this.DSEndTime.getTime());
    }
    if (this.DSStartTime == null) {
      this.DSStartTime = new Date();
    }
    if (this.DSEndTime == null) {
      this.DSEndTime = new Date();
    }
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
    return "," + this.appCode + "," + this.serverName + "," + this.externalKey + "," + this.externalBatch + "," + this.transactionId + "," + sdf.format(this.ruleExecutionStartTime) + 
      "," + sdf.format(this.ruleExecutionEndTime) + "," + this.ruleResponseTime + "," + sdf.format(this.DSStartTime) + "," + sdf.format(this.DSEndTime) + "," + this.DSResponseTime + "," + this.rulesFired + "," + this.errors + "," + this.userData;
  }

  public void logTransaction(Logger logger)
  {
    try
    {
      logger.info(this.toString());
      fh.close();

    }
    catch (Exception ex)
    {
      Logger errorLogger = Logger.getLogger("comcommon.logging.error");
      ex.printStackTrace();
      String message = "response Time log error:" + ex.getStackTrace();
      errorLogger.severe(message);
    }
  }

  // added this method to add file hander for each app.
  public void addFileHandler(Logger logger, String logFilePath)
  {
      try {
        //Handler fh = new FileHandler(logFilePath);
        fh = new FileHandler(logFilePath, 140000, 5, true);
        logger.addHandler(fh);



    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


  }


}

Вот как я называю этот регистратор из моего приложения.

transactionLog = new common.logging.TransactionLogger(); 
log = Logger.getLogger("com.app.cin.log");
transactionLog.appCode = "CompleteInvoiceWithNewLogger" ; // app mnemonic 
transactionLog.addFileHandler(log,"C:/tmp/cin-response-time.log");
// Some other calculations for calculating response time and add that to log
transactionLog.ruleExecutionStartTime = new Date();
transactionLog.ruleExecutionEndTime = new Date(); 
transactionLog.logTransaction(log);


145
0
задан 1 февраля 2018 в 03:02 Источник Поделиться
Комментарии
1 ответ

Вот мои комментарии:


  1. TransactionLogger служит как журнал сообщений структуры данных (с различными свойствами), а в качестве выходного обработчик писать журнал сообщений. Так что вы должны изменить класс всякий раз, когда вы изменить некоторые особенности распространения журнала, а также при изменении в процессе написания вывода. Лучше разделить обязанности на две категории, и preferebly с интерфейсами, которые определяют договор между этими двумя функциями, так что они могут быть расширены, чтобы удовлетворить будущие потребности (например, писать лог в БД или других направлений, разных лоф форматирование и т. д.)

  2. Приложения код, который использует TransactionLogger не вызывает сеттер методы. не только это плохой дизайн, но я не вижу, как это проходит компиляцию.

  3. Пока мы на этот вопрос: сообщение журнала имеет много свойств с сеттерами.
    а (работа) приложения код, который должен назвать каждый сеттер будет выглядеть длинно и коряво. Я предлагаю использовать Builder узор, или свободно method chaining техника

  4. В toString() делает много работы. опять же, это создает риск быть трудно поддерживать и расширять в будущем. Вы можете заказать отдельно getHostName() и продолжать ломать код на более мелкие куски, которые делают "атомарные" такие операции, как определение значения одного атрибута

  5. Даты: во-первых, вы инициализируете SimpleDateFormat С каждым вызовом toString(). Этот класс делает интенсивное использование дорогостоящей обработки регулярных выражений. Она должна быть перемещена, чтобы быть static final переменной.

  6. Во-вторых, в Java 8 содержит новую дату API времени, аналогичную той, в библиотеке Джода. он обрабатывает лучше времени, включая форматирование их в строки.

  7. Последнее, но не менее: закрыть обработчик файла, только если не excepption выбрасывается, создавая риск утечки ресурсов. Вы должны закрыть обработчик в finally п. или лучше все-таки использовать язык Java 7 попытки с ресурсами характеристика

1
ответ дан 1 февраля 2018 в 09:02 Источник Поделиться