上下文:我们正在尝试使用 Flume NG 1.5.0.1 和 Log4j 2.0.2 中的 Log4jAppender 从应用程序流式传输日志事件以删除 FLume 代理。在远程 Flume 代理关闭之前,实际应用程序运行良好。我们遇到了显然没有在 Logger 的 info 方法中处理的 NPE。
我们希望以下两件事能够正常工作:
- 应用程序应处理远程水槽代理不可用并重新连接。
- 应用程序代码应该与 Log4j appender 内部隔离。
例外:
LOCAL COUNTER: 163
log4j:ERROR Flume append() failed.
LOCAL COUNTER: 164
log4j:ERROR RPC client creation failed! NettyAvroRpcClient { host: nyc-devintapp03.activehealth.loc, port: 41414 }: RPC connection error
Exception in thread "main" java.lang.NullPointerException
at org.apache.flume.clients.log4jappender.Log4jAppender.append(Log4jAppender.java:163)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:206)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.info(Category.java:666)
at net.ahm.ce.server.App.main(App.java:18)
资源:
public class App {
static final Logger logger = Logger.getLogger(App.class);
public static void main(String[] args) throws Exception {
String name = ManagementFactory.getRuntimeMXBean().getName();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
System.out.println("LOCAL COUNTER: " + i);
logger.info("PID: " + name + " | COUNTER: " + i);
Thread.sleep(100l);
}
}
}
log4j.properties:
log4j.appender.flume=org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Hostname=192.168.4.16
log4j.appender.flume.Port=41414
log4j.appender.flume.UnsafeMode=true
log4j.appender.flume.layout=org.apache.log4j.PatternLayout
log4j.appender.flume.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-4r [%t] %-5p %c{1} %x - %m%n
log4j.rootLogger=DEBUG,flume