Simple logback appender for Fluentd, ready to use with Play2 application
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.zaptravel.logback.fluentd; | |
import java.net.InetAddress; | |
import java.net.UnknownHostException; | |
import java.util.HashMap; | |
import java.util.Map; | |
import ch.qos.logback.classic.spi.LoggingEvent; | |
import ch.qos.logback.core.UnsynchronizedAppenderBase; | |
import org.apache.commons.lang3.StringEscapeUtils; | |
import org.apache.commons.lang3.StringUtils; | |
import org.fluentd.logger.FluentLogger; | |
import org.slf4j.MDC; | |
/** | |
* A simple logback appender for FluentD. | |
* | |
* @author nmartignole | |
*/ | |
public class FluentdLogbackAppenderBase<E> extends UnsynchronizedAppenderBase<E> { | |
private FluentLogger fluentdLogger; | |
@Override | |
public void start() { | |
super.start(); | |
fluentdLogger = FluentLogger.getLogger(tagprefix, fluentdHost, port); | |
String msg = "App starting "; | |
try { | |
msg = msg + InetAddress.getLocalHost().toString(); | |
} catch (UnknownHostException e) { | |
} | |
Map<String, Object> data = new HashMap<String, Object>(); | |
data.put("level", "INFO"); | |
data.put("logger", "root"); | |
data.put("thread", Thread.currentThread().getName()); | |
data.put("uri", null); | |
data.put("msg", msg); | |
fluentdLogger.log(clientid, data); | |
} | |
@Override | |
public void stop() { | |
super.stop(); | |
fluentdLogger.close(); | |
} | |
@Override | |
protected void append(E event) { | |
String cleanMsg = StringEscapeUtils.escapeEcmaScript(event.toString()); | |
if (cleanMsg != null && cleanMsg.length() > MSG_SIZE_LIMIT) { | |
cleanMsg = StringUtils.abbreviate(cleanMsg, MSG_SIZE_LIMIT); | |
} | |
if (event instanceof LoggingEvent) { | |
ch.qos.logback.classic.spi.LoggingEvent loggingEvent = (ch.qos.logback.classic.spi.LoggingEvent) event; | |
Map<String, Object> data = new HashMap<String, Object>(); | |
data.put("level", loggingEvent.getLevel()); | |
data.put("logger", loggingEvent.getLoggerName()); | |
data.put("thread", loggingEvent.getThreadName()); | |
data.put("msg", cleanMsg); | |
String uri = MDC.get("URL"); | |
if (uri != null) { | |
data.put("uri", uri); | |
} else { | |
Map mdcMap = loggingEvent.getMDCPropertyMap(); | |
if (mdcMap != null && mdcMap.containsKey("URL")) { | |
data.put("uri", mdcMap.get("URL")); | |
} else { | |
data.put("uri", "unknown"); | |
} | |
} | |
fluentdLogger.log(clientid, data); | |
} | |
} | |
public String getTagprefix() { | |
return tagprefix; | |
} | |
public void setTagprefix(String tagprefix) { | |
this.tagprefix = tagprefix; | |
} | |
public String getClientid() { | |
return clientid; | |
} | |
public void setClientid(String clientid) { | |
this.clientid = clientid; | |
} | |
public String getFluentdHost() { | |
return fluentdHost; | |
} | |
public void setFluentdHost(String fluentdHost) { | |
this.fluentdHost = fluentdHost; | |
} | |
public int getPort() { | |
return port; | |
} | |
public void setPort(int port) { | |
this.port = port; | |
} | |
private String tagprefix; | |
private String clientid; | |
private String fluentdHost; | |
private int port; | |
private static final int MSG_SIZE_LIMIT = 65535; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<configuration info="true" scan="false" scanPeriod="30 seconds"> | |
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel"/> | |
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |
<encoder> | |
<pattern>%coloredLevel %d{HH:mm:ss,SSS} %X{URL} %logger: %message%n%ex{10}</pattern> | |
</encoder> | |
</appender> | |
<appender name="FLUENTD" class="org.zaptravel.logback.fluentd.FluentdLogbackAppenderBase"> | |
<tagprefix>amazon.rds</tagprefix> | |
<clientid>MacbookPro</clientid> | |
<port>24224</port> | |
<fluentdHost>127.0.0.1</fluentdHost> | |
</appender> | |
<logger name="play" level="WARN"/> | |
<logger name="application" level="INFO"/> | |
<logger name="net.sf.ehcache.sizeof.verboseDebugLogging" level="INFO"/> | |
<logger name="net.sf.ehcache" level="WARN"/> | |
<logger name="org.fluentd.logger.sender.RawSocketSender" level="INFO"/> | |
<logger name="org.apache.commons.pool" level="INFO"/> | |
<root level="INFO"> | |
<appender-ref ref="STDOUT"/> | |
<appender-ref ref="FLUENTD"/> | |
</root> | |
</configuration> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment