2017-03-21 23 views
3

我在這裏遇到了試圖將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。這應該把它放到我的類路徑中,對吧?

+0

你運行的操作系統?哪個版本的log4j2? – Adonis

+0

Windows 10(1607),log4j2 2.8.1。 log4j 1.2.17。 – Jamie

+0

我的第一個問題是,爲什麼同時運行log4j和log4j2?至於你的問題,我已經遇到一些奇怪的問題(雖然不是相同的),而只通過MS DOS控制檯運行應用程序。你有沒有試過在Cygwin或Git bash中運行它? – Adonis

回答

2

先用POM文件的這裏面的依賴標籤:

<!-- Apache Cassandra --> 
<dependency> 
    <groupId>com.datastax.cassandra</groupId> 
    <artifactId>cassandra-driver-core</artifactId> 
    <version>3.1.4</version> 
</dependency> 

<!-- Log4j2 --> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.8.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.8.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-1.2-api</artifactId> 
    <version>2.8.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-jcl</artifactId> 
    <version>2.8.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-slf4j-impl</artifactId> 
    <version>2.8.1</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-nosql</artifactId> 
    <version>2.8.1</version> 
</dependency> 

其次在卡桑德拉創建表:

CREATE TABLE gii_event_log (
    id timeuuid PRIMARY KEY, 
    identifier text, 
    message text, 
    priority text, 
    scope text, 
    time_stamp timeuuid, 
    type text 
); 

第三次更新您的log4j2文件檢查主機的值,如果你沒有主機可用的錯誤。如果您收到Authentication ERROR,請在Cassandra標籤內添加用戶名和密碼。

Java代碼示例:

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

/** 
* 
* @author Ashraful Islam 
*/ 
public class CassandraLog { 

    private final static Logger LOGGER = LogManager.getLogger(); 

    public void printDemo() { 
     for (int i = 0; i < 10; i++) { 
      System.out.println(i); 
      LOGGER.info("Testing {}", i); 
      LOGGER.error("Testing {}", i); 
      LOGGER.debug("Testing {}", i); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     new CassandraLog().printDemo(); 
    } 

} 

輸出:

id         | identifier | message | priority | scope | time_stamp       | type 
--------------------------------------+------------+-----------+----------+-------+--------------------------------------+------- 
b85caa03-0ecb-11e7-af5e-b083fe92c73a |   | Testing 1 | ERROR | ERROR | b85222b2-0ecb-11e7-a374-55d83eefb705 | ERROR 
b85eccec-0ecb-11e7-af5e-b083fe92c73a |   | Testing 4 | DEBUG | DEBUG | b85222bb-0ecb-11e7-a374-55d83eefb705 | DEBUG 
b8602c83-0ecb-11e7-af5e-b083fe92c73a |   | Testing 6 | ERROR | ERROR | b85222c2-0ecb-11e7-a374-55d83eefb705 | ERROR 
b862285b-0ecb-11e7-af5e-b083fe92c73a |   | Testing 9 | DEBUG | DEBUG | b85222ca-0ecb-11e7-a374-55d83eefb705 | DEBUG 
+0

非常感謝,我會試試這個! – Jamie