博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
log4j2的GelfAppender
阅读量:7233 次
发布时间:2019-06-29

本文共 8060 字,大约阅读时间需要 26 分钟。

GelfAppender

@Override    public void append(LogEvent event) {        final Layout
layout = getLayout(); final String formattedMessage; if (layout == null) { formattedMessage = event.getMessage().getFormattedMessage(); } else { formattedMessage = new String(layout.toByteArray(event), StandardCharsets.UTF_8); } final GelfMessageBuilder builder = new GelfMessageBuilder(formattedMessage, hostName) .timestamp(event.getTimeMillis() / 1000d) .level(GelfMessageLevel.fromNumericLevel(Severity.getSeverity(event.getLevel()).getCode())) .additionalField("loggerName", event.getLoggerName()) .additionalField("threadName", event.getThreadName()); final Marker marker = event.getMarker(); if (marker != null) { builder.additionalField("marker", marker.getName()); } if (includeThreadContext) { for (Map.Entry
entry : event.getContextMap().entrySet()) { builder.additionalField(entry.getKey(), entry.getValue()); } // Guard against https://issues.apache.org/jira/browse/LOG4J2-1530 final ThreadContext.ContextStack contextStack = event.getContextStack(); if (contextStack != null) { final List
contextStackItems = contextStack.asList(); if (contextStackItems != null && !contextStackItems.isEmpty()) { builder.additionalField("contextStack", contextStackItems.toString()); } } } if (includeSource) { final StackTraceElement source = event.getSource(); if (source != null) { builder.additionalField("sourceFileName", source.getFileName()); builder.additionalField("sourceMethodName", source.getMethodName()); builder.additionalField("sourceClassName", source.getClassName()); builder.additionalField("sourceLineNumber", source.getLineNumber()); } } @SuppressWarnings("all") final Throwable thrown = event.getThrown(); if (includeStackTrace && thrown != null) { String stackTrace; if (includeExceptionCause) { final StringWriter stringWriter = new StringWriter(); final PrintWriter printWriter = new PrintWriter(stringWriter); thrown.printStackTrace(printWriter); stackTrace = stringWriter.toString(); } else { stackTrace = getSimpleStacktraceAsString(thrown); } builder.additionalField("exceptionClass", thrown.getClass().getCanonicalName()); builder.additionalField("exceptionMessage", thrown.getMessage()); builder.additionalField("exceptionStackTrace", stackTrace); builder.fullMessage(formattedMessage); } if (!additionalFields.isEmpty()) { builder.additionalFields(additionalFields); } final GelfMessage gelfMessage = builder.build(); try { final boolean sent = client.trySend(gelfMessage); if (!sent) { LOG.debug("Couldn't send message: {}", gelfMessage); } } catch (Exception e) { throw new AppenderLoggingException("failed to write log event to GELF server: " + e.getMessage(), e); } }

gelfclient

基于netty来实现

public class GelfTcpTransport extends AbstractGelfTransport {    private static final Logger LOG = LoggerFactory.getLogger(GelfTcpTransport.class);    /**     * Creates a new TCP GELF transport.     *     * @param config the GELF client configuration     */    public GelfTcpTransport(GelfConfiguration config) {        super(config);    }    @Override    protected void createBootstrap(final EventLoopGroup workerGroup) {        final Bootstrap bootstrap = new Bootstrap();        final GelfSenderThread senderThread = new GelfSenderThread(queue, config.getMaxInflightSends());        bootstrap.group(workerGroup)                .channel(NioSocketChannel.class)                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, config.getConnectTimeout())                .option(ChannelOption.TCP_NODELAY, config.isTcpNoDelay())                .option(ChannelOption.SO_KEEPALIVE, config.isTcpKeepAlive())                .remoteAddress(config.getRemoteAddress())                .handler(new ChannelInitializer
() { @Override protected void initChannel(SocketChannel ch) throws Exception { if (config.isTlsEnabled()) { LOG.debug("TLS enabled."); final SslContext sslContext; if (!config.isTlsCertVerificationEnabled()) { // If the cert should not be verified just use an insecure trust manager. LOG.debug("TLS certificate verification disabled!"); sslContext = SslContext.newClientContext(InsecureTrustManagerFactory.INSTANCE); } else if (config.getTlsTrustCertChainFile() != null) { // If a cert chain file is set, use it. LOG.debug("TLS certificate chain file: {}", config.getTlsTrustCertChainFile()); sslContext = SslContext.newClientContext(config.getTlsTrustCertChainFile()); } else { // Otherwise use the JVM default cert chain. sslContext = SslContext.newClientContext(); } ch.pipeline().addLast(sslContext.newHandler(ch.alloc())); } // The graylog2-server uses '\0'-bytes as delimiter for TCP frames. ch.pipeline().addLast(new GelfTcpFrameDelimiterEncoder()); // We cannot use GZIP encoding for TCP because the headers contain '\0'-bytes then. ch.pipeline().addLast(new GelfMessageJsonEncoder()); ch.pipeline().addLast(new SimpleChannelInboundHandler
() { @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { // We do not receive data. } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { senderThread.start(ctx.channel()); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { LOG.info("Channel disconnected!"); senderThread.stop(); scheduleReconnect(ctx.channel().eventLoop()); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { LOG.error("Exception caught", cause); } }); } }); if (config.getSendBufferSize() != -1) { bootstrap.option(ChannelOption.SO_SNDBUF, config.getSendBufferSize()); } bootstrap.connect().addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { LOG.debug("Connected!"); } else { LOG.error("Connection failed: {}", future.cause().getMessage()); scheduleReconnect(future.channel().eventLoop()); } } }); }}

docs

转载地址:http://fyvfm.baihongyu.com/

你可能感兴趣的文章
xdebug php 运行效率分析工具
查看>>
在laravel框架中使用ajax请求报错419
查看>>
shell用法 (cat << EOF)
查看>>
Shell脚本实现在Linux系统中自动安装JDK
查看>>
chrome浏览器新建标签打开页面【学习笔记】
查看>>
基于ET框架和UGUI的简单UI框架实现(转)
查看>>
es6的模块化;js的模块化
查看>>
显示所有环境变量:env 或者 printenv
查看>>
程序员也需要的软技能,既为了生存,也为了早日财务自由
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix
查看>>
Java中可变长参数的使用及注意事项
查看>>
lucene源码分析(4)Similarity相似度算法
查看>>
LESS+to+MCSS
查看>>
ASP.NET CORE 中用单元测试测试控制器
查看>>
2018入门微单相机推荐
查看>>
ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法
查看>>
Jmeter之csv参数化
查看>>
J2EE程序员应该要掌握的linux知识
查看>>
MySQL中select * for update锁表的范围
查看>>
Python与Microsoft Office自动化操作
查看>>