Registrazione dei registri parametrizzati mantenendo la leggibilità

0

Ho una classe LogFormatter che appare come sotto

@Sl4j    
class LogFormatter {
        public static String format(String taskType, String taskId, String message) {
            return String.format("TaskType: %s, TaskId: %s, Message: %s",
                    taskType, taskId, message);
    }

Per lo più ci sono 4 tipi di compiti ma possono crescere in futuro. La maggior parte delle classi è dedicata a uno dei quattro tipi di attività.

Ora ogni volta, devo ottenere una linea di log, devo chiamare questo logFormatter e una tipica linea di log appare come sotto -

log.info(LogFormatter.format(
                    "StackOverflowTask",
                    "StackOverflowId",
                    "A long long message exceeding 50 characters"));

Ciascuna riga di registro spezza la leggibilità del codice per il lettore. Per lo meno, vorrei mantenere questa linea di log abbastanza breve per una sola riga.

Uno dei modi è quello di consentire in qualche modo al metodo LogFormatter di chiamare il tipo di attività per salvare la ripetizione in ogni riga.

Ho due percorsi da seguire -

Uno è quello di creare classi separate per ogni tipo di attività come

class StackOverflowTaskLogFormatter extends LogFormatter

o

crea metodi separati come

public void formatStackOverflowTaskLog()

La prima soluzione mi sembra migliore perché posso introdurre più di queste classi senza modificare quelle esistenti (principio Open-Closed) e la firma del metodo format rimarrà la stessa. Ma non sono ancora contento di scrivere così tante classi e poi molti altri @Autowired s in ogni classe, creando un bloatware di classe. Inoltre, posso vedere chiaramente che questo tipo di specializzazione aumenta anche la lunghezza della classe / metodo e supera lo scopo originale alla base della loro creazione.

Sono desideroso di capire se ci sono modi migliori per mantenere la leggibilità del codice in situazioni sopra.

    
posta comiventor 23.01.2018 - 11:15
fonte

1 risposta

0

Supponiamo che tu disponga di un'interfaccia che rappresenti un'attività e che tutte le attività del tuo sistema implementino tale interfaccia:

public interface Task {
    String getId();
    String getType();
}

Ora il tuo LogFormatter può essere semplificato prendendo 2 parametri:

@Sl4j
class LogFormatter {
    public static String format(Task task, String message) {
         return String.format("Task type: %s, Task Id: %s, Message: %s",
             task.getType(), task.getId(), message);
    }
}

La tua voce di registro dovrebbe essere un po 'più leggibile dal momento che puoi semplicemente fare riferimento al tuo oggetto compito.

Registrazione dall'interno dell'oggetto:

log.info(LogFormatter.format(this, "A long long message exceeding 50 characters"));

Registrazione dall'esterno dell'oggetto:

log.info(LogFormatter.format(taskObject, "A long long message exceeding 50 characters"));

Un'altra opzione è di importare staticamente le tue funzioni di formattazione:

import static LogFormatter.*;

// code follows inside the object...
log.info(format(this, "A long long message exceeding 50 characters"));

Nessuno di questi si discosta troppo dalla tua attuale progettazione e lavora con qualsiasi framework di registrazione.

    
risposta data 23.01.2018 - 15:52
fonte

Leggi altre domande sui tag