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?
Welche OS sind Sie? Welche Version von log4j2? – Adonis
Windows 10 (1607), log4j2 2.8.1. log4j 1.2.17. – Jamie
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