我在這裏遇到了試圖將log4j重定向到Cassandra數據庫的問題。我花了很多時間嘗試我能想到的所有事情,所以我無法覆蓋我嘗試過的所有事情,但我會盡力描述我想要做什麼以及我要做什麼儘可能簡潔地運行。如何獲取log4j消息以登錄到Cassandra?
我們的代碼庫目前使用log4j 1.2.17,所以我的第一個嘗試是讓com.datastax.logging.appender.CassandraAppender工作。
有關Maven的依賴關係是這樣的:
<dependency>
<groupId>com.datastax.logging</groupId>
<artifactId>cassandra-log4j-appender</artifactId>
<version>3.1.0</version>
</dependency>
中的log4j.xml相關的附加器入口是這樣的:
<appender name="cassandra" class="com.datastax.logging.appender.CassandraAppender"/>
的附加器默認爲「localhost」或「127.0.0.1」,我不記得哪一個,我已經明確地嘗試過了。它也默認爲端口9042,這是我的Cassandra配置的。事實上,這裏有從卡桑德拉的控制檯輸出:
Binding thrift service to localhost/127.0.0.1:9160
我能走出這是一個例外:
log4j:ERROR Error
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (null))
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:196)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:80)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1145)
at com.datastax.driver.core.Cluster.init(Cluster.java:149)
at com.datastax.driver.core.Cluster.connect(Cluster.java:225)
at com.datastax.logging.appender.CassandraAppender.initClient(CassandraAppender.java:141)
at com.datastax.logging.appender.CassandraAppender.append(CassandraAppender.java:97)
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)
<snip>
log4j:ERROR Error setting up cassandra logging schema: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (null))
敲我的頭撞在牆上之後,我想我會嘗試讓Apache Cassandra appender工作。不幸的是,它只適用於log4j2,並且更新我們的代碼庫並不重要。也就是說,我的運氣更少。
我創建了一個小型測試項目,試圖找到一些工作。根據https://logging.apache.org/log4j/2.x/manual/appenders.html#CassandraAppender,在log4j2中,Cassandra應該是一個內置的appender類型。但是,當我在log4j2.xml文件中指定它時,它絕對找不到它。這是我的文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<Cassandra name="Cassandra" clusterName="Test Cluster" keyspace="gii" table="gii_event_log" bufferSize="10" batched="true">
<SocketAddress host="localhost" port="9042"/>
<ColumnMapping name="id" pattern="%uuid{TIME}" type="java.util.UUID"/>
<ColumnMapping name="identifier" pattern="%marker"/>
<ColumnMapping name="message" pattern="%message"/>
<ColumnMapping name="priority" pattern="%level"/>
<ColumnMapping name="scope" pattern="%level"/>
<ColumnMapping name="time_stamp" literal="now()"/>
<ColumnMapping name="type" pattern="%level"/>
</Cassandra>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="MyFile"/>
<AppenderRef ref="Cassandra"/>
</Root>
</Loggers>
</Configuration>
這裏發生了什麼:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
at com.ge.enconn.TestClass.<init>(TestClass.java:10)
at com.ge.enconn.App.main(App.java:11)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more
下面是我的POM文件相關的依存關係:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-nosql</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.1.0</version>
</dependency>
爲的log4j的NoSQL POM的是在這裏:https://github.com/apache/logging-log4j2/blob/master/log4j-nosql/pom.xml。這應該把它放到我的類路徑中,對吧?
你運行的操作系統?哪個版本的log4j2? – Adonis
Windows 10(1607),log4j2 2.8.1。 log4j 1.2.17。 – Jamie
我的第一個問題是,爲什麼同時運行log4j和log4j2?至於你的問題,我已經遇到一些奇怪的問題(雖然不是相同的),而只通過MS DOS控制檯運行應用程序。你有沒有試過在Cygwin或Git bash中運行它? – Adonis