package me.osm.gazetteer.web; import java.io.Serializable; import org.apache.commons.lang3.StringUtils; import org.restexpress.Request; import org.restexpress.Response; import org.restexpress.pipeline.MessageObserver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; import org.slf4j.helpers.BasicMarkerFactory; public final class HttpLogger extends MessageObserver { private static final BasicMarkerFactory BASIC_MARKER_FACTORY = new BasicMarkerFactory(); private static final Logger logger = LoggerFactory.getLogger(HttpLogger.class); private static final Logger accLog = LoggerFactory.getLogger(HttpLogger.class.getName() + ".AccessLog"); private static final Marker HUMAN = BASIC_MARKER_FACTORY.getMarker("HUMAN"); private static final Marker BOT_GOOGLE = BASIC_MARKER_FACTORY.getMarker("BOT.GOOGLE"); private static final Marker BOT_YANDEX = BASIC_MARKER_FACTORY.getMarker("BOT.YANDEX"); private static final Marker BOT_BING = BASIC_MARKER_FACTORY.getMarker("BOT.BING"); @Override protected void onException(Throwable exception, Request request, Response response) { logger.error("{} {} threw exception: {}", request.getEffectiveHttpMethod(), request.getUrl(), exception.getMessage(), exception); } @Override protected void onComplete(Request request, Response response) { String realIp = request.getHeader("X-Real-IP"); Serializable ipAddr = realIp == null ? request.getRemoteAddress().getAddress() : realIp; String userAgent = request.getHeader("User-Agent"); Marker marker = HUMAN; if(StringUtils.contains(userAgent, "Googlebot")) { marker = BOT_GOOGLE; } else if(StringUtils.contains(userAgent, "YandexBot")) { marker = BOT_YANDEX; } else if(StringUtils.contains(userAgent, "msnbot") || StringUtils.contains(userAgent, "BingPreview") || StringUtils.contains(userAgent, "bingbot")) { marker = BOT_BING; } accLog.trace(marker, "{} - {} {} {} User-Agent: {} ", ipAddr, response.getResponseStatus().getCode(), request.getEffectiveHttpMethod(), request.getUrl(), userAgent); if(response.getResponseStatus().getCode() != 200) { logger.warn("{} {} responded with {}", new Object[]{ request.getEffectiveHttpMethod().toString(), request.getUrl(), response.getResponseStatus().toString()}); } } }