Не удалось получить события из Log4J в Flume

Я пытаюсь получить события из Log4J 1x в HDFS через Flume, используя приложение Log4J Flume. Создал два приложения FILE и flume. Это работает для приложения FILE, но с приложением flume программа просто зависает в Eclipse. Flume работает правильно, я могу отправлять сообщения на источник avro с помощью клиента avro и видеть сообщения в HDFS. Но он не интегрируется с Log4J 1x.

Я не вижу никаких исключений, кроме приведенного ниже в log.out.

Batch size string = null
Using Netty bootstrap options: {tcpNoDelay=true, connectTimeoutMillis=20000}
Connecting to localhost/127.0.0.1:41414
[id: 0x52a00770] OPEN

и из консоли Flume

2013-10-23 14:32:32,145 (pool-5-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 => /127.0.0.1:41414] OPEN
2013-10-23 14:32:32,148 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 => /127.0.0.1:41414] BOUND: /127.0.0.1:41414
2013-10-23 14:32:32,148 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 => /127.0.0.1:41414] CONNECTED: /127.0.0.1:46037
2013-10-23 14:32:43,086 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 :> /127.0.0.1:41414] DISCONNECTED
2013-10-23 14:32:43,096 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 :> /127.0.0.1:41414] UNBOUND
2013-10-23 14:32:43,096 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 :> /127.0.0.1:41414] CLOSED
2013-10-23 14:32:43,097 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.channelClosed(NettyServer.java:209)] Connection to /127.0.0.1:46037 disconnected.

Если это поможет, я запустил программу в режиме отладки, а когда она зависла, я сделал приостановку и взял трассировку стека. Пытался заглянуть в код, но не уверен, почему программа зависает с приложением flume.

Daemon Thread [Avro NettyTransceiver I/O Worker 1] (Suspended)  
Logger(Category).callAppenders(LoggingEvent) line: 205  
Logger(Category).forcedLog(String, Priority, Object, Throwable) line: 391  
Logger(Category).log(String, Priority, Object, Throwable) line: 856  
Log4jLoggerAdapter.debug(String) line: 209  
NettyTransceiver$NettyClientAvroHandler.handleUpstream(ChannelHandlerContext, ChannelEvent) line: 491  
DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline$DefaultChannelHandlerContext, ChannelEvent) line: 564  
DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(ChannelEvent) line: 792  
NettyTransportCodec$NettyFrameDecoder(SimpleChannelUpstreamHandler).channelBound(ChannelHandlerContext, ChannelStateEvent) line: 166  
NettyTransportCodec$NettyFrameDecoder(SimpleChannelUpstreamHandler).handleUpstream(ChannelHandlerContext, ChannelEvent) line: 98  
DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline$DefaultChannelHandlerContext, ChannelEvent) line: 564  
DefaultChannelPipeline.sendUpstream(ChannelEvent) line: 559  
Channels.fireChannelBound(Channel, SocketAddress) line: 199  
NioWorker$RegisterTask.run() line: 191  
NioWorker(AbstractNioWorker).processRegisterTaskQueue() line: 329  
NioWorker(AbstractNioWorker).run() line: 235  
NioWorker.run() line: 38  
DeadLockProofWorker$1.run() line: 42  
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1145  
ThreadPoolExecutor$Worker.run() line: 615  
Thread.run() line: 744

Вот программа на Java

import java.io.IOException;
import java.sql.SQLException;
import org.apache.log4j.Logger;
public class log4jExample {
    static Logger log = Logger.getRootLogger();
    public static void main(String[] args) throws IOException, SQLException {
       log.debug("Hello this is an debug message");
    }
}

Вот log4j.properties

# Define the root logger with appender file
log = /home/vm4learning/WorkSpace/BigData/Log4J-Example/log
log4j.rootLogger = DEBUG, FILE, flume

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

# Define the flume appender
log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Hostname = localhost
log4j.appender.flume.Port = 41414
log4j.appender.flume.UnsafeMode = false
log4j.appender.flume.layout=org.apache.log4j.PatternLayout
log4j.appender.flume.layout.ConversionPattern=%m%n

Вот зависимости в Eclipse

flume-ng-log4jappender-1.4.0.jar
log4j-1.2.17.jar
flume-ng-sdk-1.4.0.jar
avro-1.7.3.jar
netty-3.4.0.Final.jar
avro-ipc-1.7.3.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar

Вот содержимое flume.conf

# Tell agent1 which ones we want to activate.
agent1.channels = ch1
agent1.sources = avro-source1
agent1.sinks = hdfs-sink1

# Define a memory channel called ch1 on agent1
agent1.channels.ch1.type = memory

# Define an Avro source called avro-source1 on agent1 and tell it
# to bind to 0.0.0.0:41414. Connect it to channel ch1.
agent1.sources.avro-source1.type = avro
agent1.sources.avro-source1.bind = 0.0.0.0
agent1.sources.avro-source1.port = 41414

# Define a logger sink that simply logs all events it receives
# and connect it to the other end of the same channel.
agent1.sinks.hdfs-sink1.type = hdfs
agent1.sinks.hdfs-sink1.hdfs.path = hdfs://localhost:9000/flume/events/

agent1.sinks.hdfs-sink1.channel = ch1
agent1.sources.avro-source1.channels = ch1

Как обойти эту проблему?


person Praveen Sripati    schedule 23.10.2013    source источник


Ответы (3)


У меня была аналогичная проблема, решение:

  • изменить корневой регистратор log4j.properties с уровня отладки на информационный.

но я не знал, что произошло внутри flume-ng. я пытаюсь его отладить. Если кто знает, подскажите спасибо ~~

person edwardsbean    schedule 17.12.2013
comment
thnx - с корневым регистратором, измененным с отладки на информацию, log4j пытается отправить сообщение в Flume через порт 41414 (получая ошибку при подключении к localhost/127.0.0.1:41414 без запуска Flume) и просто зависает в eclipse. ничего не видит в флюме или hdfs. Пожалуйста, дайте мне знать, если вы добьетесь каких-либо успехов на стороне канала. Кроме того, почему этот корневой регистратор должен быть изменен с отладки на информацию? - person Praveen Sripati; 17.12.2013
comment
на информационном уровне я попробовал log4j -> агент flume -> перейти на hdfs, локальную файловую систему, RabbitMQ. Работает нормально. невозможно использовать режим уровня отладки в производственной среде, так что это не большая ошибка. - person edwardsbean; 18.12.2013
comment
Как я упоминал ранее, я могу использовать Flume независимо от Log4J. Основное использование log4j просто зависает с приложением Flume. Не могли бы вы поделиться всем проектом на github? - person Praveen Sripati; 18.12.2013
comment
эта проблема, вероятно, связана с зависимостью от jar. отлично. - person edwardsbean; 18.12.2013
comment
работает как шарм - спасибо - не смог получить толстую банку, поэтому скопировал все банки. Кроме того, hdfs.rollCount по умолчанию имеет значение 10, поэтому log.info приходилось 10 раз. - person Praveen Sripati; 18.12.2013

Я предполагаю, что вы пытаетесь регистрировать события Flume через Flume. Я видел эту проблему с другими приложениями, но не с Log4j1.

Я бы рассмотрел возможность изменения log4j.properties, чтобы исключить события Flume, Netty и Avro, и посмотреть, исправит ли это ситуацию.

person Sarge    schedule 24.10.2013
comment
Как я упоминал в OP, приложение FILE просто работает, если я включу приложение FLUME, программа в Eclipse просто зависнет, получая корневой регистратор. Он не достигает оператора журнала в клиенте. - person Praveen Sripati; 24.10.2013
comment
Возможно, потому что код логгера get root заблокирован при попытке войти в логгер, которого еще не существует. Вы пробовали мои предложения? - person Sarge; 27.10.2013
comment
Я уже пробовал - когда я использую этот log4j.properties log4j.rootLogger = DEBUG, FILE, он просто работает, когда я добавляю Flume, он просто зависает. - person Praveen Sripati; 27.10.2013

У меня была аналогичная проблема с использованием приложения Flume в log4j. Программа зависала всякий раз, когда я пытался создать экземпляр объекта Logger. Я помню, проблема была в том, что у меня не было всех необходимых библиотек в пути к классам, и как только я их добавил, все заработало нормально.

Я бы порекомендовал вам сначала заставить работать простой пример Майка Перси. Хотя pom.xml создает один файл JAR со всеми зависимостями, его редактирование для копирования зависимых файлов jar в другой каталог дает мне этот список:

avro-1.7.4.jar
avro-ipc-1.7.4.jar
commons-codec-1.3.jar
commons-collections-3.2.1.jar
commons-compress-1.4.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
flume-ng-log4jappender-1.4.0-cdh4.5.0.jar
flume-ng-sdk-1.4.0-cdh4.5.0.jar
hamcrest-core-1.1.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
jackson-core-asl-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
jetty-6.1.26.jar
jetty-util-6.1.26.jar
junit-4.10.jar
libthrift-0.7.0.jar
log4j-1.2.16.jar
netty-3.5.0.Final.jar
paranamer-2.3.jar
slf4j-api-1.7.2.jar
slf4j-jdk14-1.7.2.jar
snappy-java-1.0.4.1.jar
velocity-1.7.jar
xz-1.0.jar

Некоторые из этих библиотек (например, junit) могут быть на самом деле не нужны, но я бы посоветовал сначала использовать их все, чтобы увидеть, сможете ли вы заставить свой пример работать, а затем поэкспериментировать с определением минимально необходимого набора впоследствии.

person Tom Wheeler    schedule 09.12.2013
comment
Я добавил дополнительные банки и не имел значения. Программа log4j просто зависает в Eclipse. - person Praveen Sripati; 09.12.2013