DevMigration

Espacio web diseñado para ayudar a los demas

Logs en tu aplicacion Spring-boot con LogBook

Logging peticiones y respuestas es fácil pero algunas veces se puede tornar un poco complicado y necesitamos entender y buscar cuales archivos y métodos están imprimiendo nuestra data. Para este tipo de problemas ya existe una herramienta que nos ayuda con este problema llamada logbook. Logbook es excelente porque nos ayuda a crear filtros que podemos usar para filtrar información importante que no queremos mostrar en los logs.

Agregar dependencias en el archivo Pom.xml:

<!-- LogBook dependency -->
<dependency>
    <groupId>org.zalando</groupId>
    <artifactId>logbook-spring-boot-starter</artifactId>
    <version>2.4.2</version>
</dependency>

Agregar propiedades en el archivo de propiedades application.properties: aqui podemos configurar como logbook se va a comportar, el nivel de logging, cuales archivos excluir o cuáles filtros habilitar y muchos más.

### Logbook Configurations ###
logging.level.ROOT=INFO
logbook.filter.enabled=true
logbook.exclude=/actuator/**, /swagger-ui**, /api-docs**
logbook.format.style=json
logbook.secure-filter.enabled=true
logging.level.org.zalando.logbook=TRACE
### This property is not part of logbook but to have a cleaner support when masking 
fields we will use for our configuration ###
application.maskFields=my,field,to,mask

Nota: Con el paso de arriba podemos correr nuestro servicio y enviar peticiones para poder ver los logs mostrandose en la terminal del mismo con información referente a las peticiones pero si quieres saber más sobre cómo configurar nuestros filtros sigue leyendo.

Creando archivo de configuracion:

import com.macys.enclave.rest.tracing.LogbookMasking;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.zalando.logbook.BodyFilter;
import static org.zalando.logbook.BodyFilter.merge;
import static org.zalando.logbook.BodyFilters.defaultValue;

@Configuration
public class LogBookConfig extends LogbookMasking {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogBookConfig.class);

    @Value("${application.maskFields}")
    private String[] propertiesToMask;

    @Bean
    public BodyFilter bodyFilter() {
        BodyFilter bodyFilter = merge(defaultValue(), maskFieldsAndObjects());
        return bodyFilter;
    }

    private BodyFilter maskFieldsAndObjects() {
        return (contentType, body) -> {
            if (body != null && body.length() > 0) {
                try {
                    JSONObject json = new JSONObject(body);
                    maskJsonObject(json, propertiesToMask);
                    return ("\n" + json + "\n");
                } catch (JSONException e) {
                    if (LOGGER.isErrorEnabled())
                        LOGGER.error("error parsing body as json to pretty-print it", e);
                }
            }
            return (body);
        };
    }
}
comments powered by Disqus