如何获取log4j消息以登录Cassandra?

时间:2017-03-21 20:19:11

标签: maven logging cassandra log4j log4j2

我在这里试图将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条目是:

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

appender默认为“localhost”或“127.0.0.1”,我不记得是哪一个,我已经明确地尝试过了。它也默认为端口9042,这是我的Cassandra配置的。实际上,这是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,更新我们的代码库并非易事。也就是说,我运气不好。

我创建了一个小型测试项目,试图让一些工作正常。根据{{​​3}},在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://logging.apache.org/log4j/2.x/manual/appenders.html#CassandraAppender。这应该进入我的类路径,对吗?

2 个答案:

答案 0 :(得分:3)

首先使用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>

Cassandra中的第二个创建表:

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

答案 1 :(得分:0)

添加以下依赖项后,错误就解决了。

  

错误:,线程“ main”中的异常java.lang.NoClassDefFoundError:org / apache / logging / log4j / LogManager

依赖性:

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-cassandra</artifactId>
  <version>2.11.1</version>
</dependency>