Classe helper comune per la registrazione

1

Ho poche classi che hanno usato System.out.println (che dovrebbe essere evitato) e ora sto cercando di spostarle in un logger.

Abbiamo già utilizzato il logger in alcuni altri moduli. Ma il modulo che sto lavorando non l'ha usato da nessuna parte. Quindi, ho pensato di creare una nuova classe comune e amp; inserisci una nuova voce nel file logback.xml per quella nuova classe.

<logger name="MyLogHelper" level="INFO" additivity="false">
  <!--appender-ref ref="STDOUT" /-->
  <appender-ref ref="LOG-FILE"/>
</logger>

<logger name="MyLogHelper" level="DEBUG" additivity="false">
  <!--appender-ref ref="STDOUT" /-->
  <appender-ref ref="LOG-FILE"/>
</logger>

<logger name="MyLogHelper" level="WARN" additivity="false">
  <!--appender-ref ref="STDOUT" /-->
  <appender-ref ref="LOG-FILE"/>
</logger>

<logger name="MyLogHelper" level="ERROR" additivity="false">
  <!--appender-ref ref="STDOUT" /-->
  <appender-ref ref="ERROR-FILE"/>
</logger>

Manteniamo solo LOG-FILE e ERROR-FILE . Entrambi sono due appenders definiti per i file utilizzati nel nostro sistema.

public class MyLogHelper
{
  private Logger logger = LoggerFactory.getLogger(MyLogHelper.class);

  private static MyLogHelper instance = new MyLogHelper();

  private MyLogHelper()
  {
  }

  public static MyLogHelper getInstance(){
    if(instance == null)
      instance = new MyLogHelper();
    return instance;
  }

  public void log(final String content, final LogLevel level)
  {
    switch (level)
    {
      case INFO:
        logger.info(content);
        break;
      case DEBUG:
        logger.debug(content);
        break;
      case WARN:
        logger.warn(content);
        break;
      case ERROR:
        logger.error(content);
        break;
      default:
        logger.debug(content);
    }
  }

  public enum LogLevel
  {
    INFO, DEBUG, WARN, ERROR
  }

Ed è così che sostituisco il mio System.out.println con il mio nuovo modo,

  /**Logger for logging within the class */
  private static final MyLogHelper logger = MyLogHelper.getInstance();
  ...
  logger.log(e.getMessage(), LogLevel.ERROR);

È un buon design? O possiamo migliorare questo con un design diverso?

EDIT: non posso semplicemente sostituire System.out.println con l'acquisizione di un logger e l'utilizzo. Perché per farlo devo aggiungere ogni classe come voci al file xml.

Ciò che cerco in realtà è che il mio attuale design è scalabile e il mio approccio di utilizzando un enum e un singolo pattern è la scelta migliore per questa situazione?

    
posta Jude Niroshan 23.08.2016 - 07:44
fonte

1 risposta

5

Questo

logger.error(e.getMessage());

è molto più leggibile e più veloce da scrivere di questo:

logger.log(e.getMessage(), LogLevel.ERROR);

Inoltre: se utilizzi un logger con la tua classe helper, i tuoi registri appariranno tutti come segue:

[MyLogHelper:XX] ERROR : blablalba // XX line of the switch case
[MyLogHelper:XX] WARN : foo

Invece di:

[FooClass:40] : ERROR : blablabla // logger.error in FooClass line 42
[BarClass:25] : WARN : foo

Quindi non solo il tuo codice è meno leggibile, ma perderai preziose informazioni su dove è stato attivato il log, il che potrebbe essere davvero fastidioso se hai lo stesso messaggio in classi diverse.

Infine non fare:

 logger.error(e.getMessage());

Fai

logger.error("an unexpeced error happened while doing foooo", e);

Quindi avrai la stampa stacktrace nei tuoi log che è davvero preziosa.

    
risposta data 23.08.2016 - 08:48
fonte

Leggi altre domande sui tag