JsonEmitter.java

package pro.verron.officestamper;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.jspecify.annotations.Nullable;

import java.util.LinkedHashMap;
import java.util.Map;

import static java.time.OffsetDateTime.now;

class JsonEmitter implements Emitter {
    // Minimal structured logging when --log-format=json
    @Override
    public void emit(String level, String message, @Nullable Map<String, ?> fields) {
        try {
            var map = new LinkedHashMap<String, Object>();
            map.put("ts", now().toString());
            map.put("level", level.toLowerCase());
            map.put("msg", message);
            if (fields != null && !fields.isEmpty()) map.put("fields", fields);
            var json = new ObjectMapper().writeValueAsString(map);
            System.out.println(json);
        } catch (Exception ignored) {
            System.out.println("{\"level\":\"error\",\"msg\":\"failed to emit json log\"}");
        }
    }
}