2017-03-21 22 views
3

私はここで殺されて、log4jをCassandraデータベースにリダイレクトしようとしています。私は考えることができるすべてを試すために膨大な時間を費やしたので、私が試したことのすべてをカバーすることはできませんが、私がやろうとしていることと私が何をしているのかを説明しようとします私ができる限り簡潔に実行しています。log4jメッセージをCassandraにログするにはどうすればよいですか?

私たちのコードベースは現在log4j 1.2.17を使用していますので、私の最初の試みはcom.datastax.logging.appender.CassandraAppenderを動作させることです。
関連Mavenの依存性がこれです:のlog4j.xmlで

<dependency> 
    <groupId>com.datastax.logging</groupId> 
    <artifactId>cassandra-log4j-appender</artifactId> 
    <version>3.1.0</version> 
</dependency> 

関連アペンダエントリはこれです:

<appender name="cassandra" class="com.datastax.logging.appender.CassandraAppender"/> 

アペンダの「localhost」をデフォルト、または「127.0.0.1」、Iどちらを覚えていない、私は明示的に両方を試みた。また、ポート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のためだけであり、私たちのコードベースの更新は自明ではありません。それは、私はそれでさらに運が悪いと言いました。

小さなテストプロジェクトを作成して、何かを試してみました。 log4j2では、Cassandraはhttps://logging.apache.org/log4j/2.x/manual/appenders.html#CassandraAppenderによると、組み込みのappenderタイプとされています。しかし、それを私のlog4j2.xmlファイルで指定すると、絶対に見つけられません。

<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ここに私のポンポンファイルから該当する依存関係がある

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 

<?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> 

はここで何が起こるかです:ここに私のファイルです。これはクラスパスに入るはずですよね?

+0

あなたはOSを実行していますか?どのバージョンの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

まず使用ポンポンファイルのこの内部の依存性タグは:

<!-- 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ファイルのチェックホスト値を更新。認証エラーが発生した場合は、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

関連する問題