2017-03-21 5 views
3

Ich werde hier getötet, um Log4j in eine Cassandra-Datenbank umzuleiten. Ich habe sehr viel Zeit damit verbracht, alles zu versuchen, was ich mir vorstellen kann, also werde ich nicht alles abdecken können, was ich versucht habe, aber ich werde versuchen zu beschreiben, was ich versuche und was ich bin so präzise wie möglich hineinzulaufen.Wie bekomme ich Log4j-Nachrichten, um sich bei Cassandra einzuloggen?

Unsere Codebase verwendet derzeit log4j 1.2.17, also ist mein erster Versuch, com.datastax.logging.appender.CassandraAppender funktioniert zu bekommen. Diese
Die relevante Maven Abhängigkeit:

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

Der relevante appender Eintrag in log4j.xml ist dies:

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

Die appender standardmäßig auf „localhost“ oder „127.0.0.1“, I erinnere mich nicht an was, und ich habe beides explizit versucht. Es ist auch standardmäßig Port 9042, für den meine Cassandra konfiguriert ist. In der Tat, hier ist die Ausgabekonsole von Cassandra:

Binding thrift service to localhost/127.0.0.1:9160 

Alles, was ich daraus herauskommen kann, ist eine Ausnahme:

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

Nach schlug meinen Kopf gegen die Wand, ich dachte, ich würde versuchen, zu erhalten der Apache Cassandra Appender arbeitet. Leider ist es nur für log4j2, und die Aktualisierung unserer Codebasis ist nicht trivial. Das heißt, ich habe noch weniger Glück damit.

Ich habe ein kleines Testprojekt erstellt, um etwas zum Laufen zu bringen. In log4j2 soll Cassandra ein eingebauter Appendertyp sein, gemäß https://logging.apache.org/log4j/2.x/manual/appenders.html#CassandraAppender. Allerdings kann es absolut nicht gefunden werden, wenn ich es in meiner log4j2.xml-Datei angeben. Hier ist meine Datei:

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

Hier ist, was passiert:

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 

Hier sind die entsprechenden Abhängigkeiten von meiner pom-Datei:

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

Die pom für log4j-nosql ist hier: https://github.com/apache/logging-log4j2/blob/master/log4j-nosql/pom.xml. Das sollte es in meinen Klassenpfad bringen, richtig?

+0

Welche OS sind Sie? Welche Version von log4j2? – Adonis

+0

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

+0

Meine erste Frage wäre, warum Log4j und Log4j2 gleichzeitig laufen? Was Ihr Problem anbelangt, habe ich bereits ein seltsames Problem (wenn auch nicht das gleiche) bei der Ausführung einer Anwendung über eine MS DOS-Konsole festgestellt. Hast du es in Cygwin oder Git Bash versucht? – Adonis

Antwort

2

der ersten Verwendung dieses innerhalb Abhängigkeiten Tag der pom-Datei:

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

An zweiter Stelle in Cassandra erstellen Tabelle:

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

Third Aktualisieren Sie Ihre log4j2 Datei Prüfwert Host, wenn Sie kein Host vorhanden ERROR erhalten . Fügen Sie Benutzername und Kennwort in das Cassandra-Tag ein, wenn Sie den Authentifizierungsfehler erhalten.

Beispiel Java-Code:

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(); 
    } 

} 

Ausgang:

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

Vielen Dank, ich werde es versuchen! – Jamie

Verwandte Themen