<?xml version="1.0" encoding="UTF-8"?>
  <Configuration status="info" name="sd" packages="org.greycode.sd.base.log">
  <Properties>
  <Property name="logPattern">[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c] %m%n</Property>
  </Properties>
  <Appenders>
  <Console name="STDOUT" target="SYSTEM_OUT">
  <PatternLayout pattern="${logPattern}" />
  </Console>
   
  <NoSql name="redis">
  <!-- <Redis host="localhost" port="" timeout="" password="" database="" clientName=""/> -->
  <Redis host="localhost" />
  </NoSql>
   
  </Appenders>
  <Loggers>
  <asyncRoot level="info" includeLocation="true">
  <AppenderRef ref="STDOUT" />
  <AppenderRef ref="redis" />
  </asyncRoot>
  </Loggers>
  </Configuration>
Raw
  pom.xml
  <!-- LOG begin -->
  <dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>${log4j2.version}</version>
  </dependency>
  <dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-jcl</artifactId>
  <version>${log4j2.version}</version>
  </dependency>
  <dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-web</artifactId>
  <version>${log4j2.version}</version>
  </dependency>
  <dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>${log4j2.version}</version>
  </dependency>
  <dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-nosql</artifactId>
  <version>${log4j2.version}</version>
  </dependency>
  <!-- LOG end -->
   
  <dependency>
  <groupId>com.lmax</groupId>
  <artifactId>disruptor</artifactId>
  <version>${disruptor.version}</version>
  </dependency>
   
  <dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>${jedis.version}</version>
  </dependency>
Raw
  RedisConnection.java
  package org.greycode.sd.base.log;
   
  import java.util.Map;
  import java.util.concurrent.atomic.AtomicBoolean;
   
  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
  import org.apache.logging.log4j.nosql.appender.DefaultNoSqlObject;
  import org.apache.logging.log4j.nosql.appender.NoSqlConnection;
  import org.apache.logging.log4j.nosql.appender.NoSqlObject;
   
  import redis.clients.jedis.Jedis;
  import redis.clients.jedis.JedisPool;
   
  import com.fasterxml.jackson.databind.ObjectMapper;
   
  public class RedisConnection implements NoSqlConnection<Map<StringObject>DefaultNoSqlObject> {
  private static final ObjectMapper mapper = new ObjectMapper();
   
  private final JedisPool pool;
  private final Jedis jedis;
  private final AtomicBoolean closed = new AtomicBoolean(false);
   
  public RedisConnection (JedisPool pool) {
  this.jedis = pool.getResource();
  this.pool = pool;
  }
   
  @Override
  public DefaultNoSqlObject createObject() {
  return new DefaultNoSqlObject();
  }
   
  @Override
  public DefaultNoSqlObject[] createList(int length) {
  // TODO Auto-generated method stub
  return new DefaultNoSqlObject[length];
  }
   
  @Override
  public void insertObject(NoSqlObject<Map<StringObject>> object) {
  try {
  jedis.lpush("redis-log4j2", mapper.writeValueAsString(object.unwrap()));
  catch (Exception e) {
  throw new AppenderLoggingException("往Redis中插入数据时发生错误: " + e.getMessage(), e);
  }
  }
   
  @Override
  public void close() {
  if (closed.compareAndSet(falsetrue)) {
  this.pool.close();
  }
  }
   
  @Override
  public boolean isClosed() {
  return closed.get();
  }
   
  }
Raw
  RedisProvider.java
  package org.greycode.sd.base.log;
   
  import org.apache.logging.log4j.Logger;
  import org.apache.logging.log4j.core.config.plugins.Plugin;
  import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
  import org.apache.logging.log4j.core.config.plugins.PluginFactory;
  import org.apache.logging.log4j.nosql.appender.NoSqlProvider;
  import org.apache.logging.log4j.status.StatusLogger;
   
  import redis.clients.jedis.Jedis;
  import redis.clients.jedis.JedisPool;
  import redis.clients.jedis.JedisPoolConfig;
  import redis.clients.jedis.Protocol;
   
  @Plugin(name = "Redis", category = "Core", printObject = true)
  public class RedisProvider implements NoSqlProvider<RedisConnection> {
  private static final Logger LOGGER = StatusLogger.getLogger();
   
  private final JedisPool pool;
   
  private RedisProvider (JedisPool pool) {
  this.pool = pool;
  }
   
  @PluginFactory
  public static RedisProvider createNoSqlProvider (
  @PluginAttribute("host"final String host,
  @PluginAttribute("port"int port,
  @PluginAttribute("timeout"int timeout,
  @PluginAttribute("password"final String password,
  @PluginAttribute("database"int database,
  @PluginAttribute("clientName"final String clientName
  ) {
  if (host != null && host.length() > 0) {
  try {
  if (port <= 0) port = 6379;
  if (timeout <= 0) timeout = Protocol.DEFAULT_TIMEOUT;
  if (database <= 0) database = Protocol.DEFAULT_DATABASE;
   
  JedisPool pool = null;
   
  pool = new JedisPool(new JedisPoolConfig(), host, port, timeout, password, database, clientName);
   
  try (Jedis jedis = pool.getResource()) { }
   
  return new RedisProvider(pool);
  catch (Exception e) {
  LOGGER.error("与Redis服务器建立连接时发生错误[{}:{}]:{}",e.getMessage(), host, port);
  return null;
  }
  }
  LOGGER.error("Redis 服务器地址[host]不能为空");
  return null;
  }
   
  @Override
  public RedisConnection getConnection() {
  return new RedisConnection(pool);
  }
   
  }
Sign up for free  to join this conversation on GitHub. Already have an account? Sign in to comment