Skip to content

Create @LogIgnore as Complement to @JsonIgnore #3

@vjkoskela

Description

@vjkoskela

Create an additional annotation @LogIgnore and associated filter to augment @JsonIgnore for logging. Additionally, the configuration for @LogIgnore should allow disabling of @JsonIgnore (e.g. to ignore @JsonIgnore).

This is similar to the relationship between @LogValue and @jsonvalue. The pattern allows developers to create a distinct serialization profile of a class for logging and another one for standard serialization/deserialization. It is particularly important when the existing serialization profile already exists and logging is being migrated to Logback-Steno.

Disabling @JsonIgnore and using @LogIgnore instead would accomplish at least part of this. We will still need to investigate how to support customized serialization and the annotations that come with it.

See: FasterXML/jackson-databind#133

Reference implementation of annotation:

package com.arpnetworking.logback.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Annotation that marks a field to be ignored by the RedactionFilter in StenoEncoder.
*
* @author Ville Koskela (vkoskela at groupon dot com)
* @see com.arpnetworking.logback.jackson.RedactionFilter
* @since 1.9.0
*/
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface LogIgnore {
}

Reference implementation of filter:

package com.arpnetworking.logback.jackson;
import java.util.Collections;
import java.util.Set;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.arpnetworking.logback.annotations.LogIgnore;

/**
 * Jackson property filter that suppresses fields annotated with @LogIgnore.
 *
 * @author Ville Koskela (vkoskela at groupon dot com)
 * @since 1.9.0
 */
public class IgnoreFilter extends SimpleBeanPropertyFilter.SerializeExceptFilter {
    private static final long serialVersionUID = -8732095428853471218L;
    public static final String IGNORE_FILTER_ID = "com.arpnetworking.logback.jackson.IgnoreFilterId";

    public IgnoreFilter() { 
        this(Collections.<String>emptySet()); 
    }

    public IgnoreFilter(final Set<String> properties) { 
        super(properties); 
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Deprecated
    public void serializeAsField(
            final Object pojo,
            final JsonGenerator jgen,
            final SerializerProvider prov,
            final BeanPropertyWriter writer) throws Exception {
        if (writer.getAnnotation(LogIgnore.class) == null) { 
            super.serializeAsField(pojo, jgen, prov, writer); 
        }
        // else: ignore field entirely
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void serializeAsField(
            final Object pojo,
            final JsonGenerator jgen,
            final SerializerProvider prov,
            final PropertyWriter writer) throws Exception {
        if (writer instanceof BeanPropertyWriter) { 
                final BeanPropertyWriter beanPropertyWriter = (BeanPropertyWriter) writer; 
                if (beanPropertyWriter.getAnnotation(LogIgnore.class) == null) { 
                    super.serializeAsField(pojo, jgen, prov, writer); 
                } 
                // else
        } else { 
            super.serializeAsField(pojo, jgen, prov, writer); 
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions