Вход в систему dbAppender Custom SQL - PullRequest
2 голосов
/ 05 октября 2011

Есть ли способ изменить таблицы, в которые logback записывает свои данные, с использованием dbAppender. У него есть три таблицы по умолчанию, которые необходимо создать перед использованием dbAppender, но я хочу настроить его для записи в одну таблицу по своему выбору.Что-то похожее на Log4J, где я могу указать SQL, который выполняется при вставке журнала в базу данных.

Ответы [ 4 ]

4 голосов
/ 17 октября 2011

Томаш, может быть, я что-то упускаю, но я не понимаю, как простое использование собственного DBNameResolver могло бы стать ответом на вопрос, который спросил Магези.DBNameResolver используется DBAppender через SQLBuilder для создания 3 SQL-запросов на вставку - с помощью DBNameResolve можно влиять только на имена таблиц и столбцов, в которые будут вставляться данные, но нельзя ограничивать вставку только одной таблицей, не говоря уже о том, что просто реализовав там DBNameResolverнет средств для управления тем, что фактически вставляется.

Чтобы соответствовать IMO logDj, нужно расширить DBAppender или DBAppenderBase logback или, возможно, даже реализовать совершенно новый пользовательский Appender.

1 голос
/ 04 февраля 2012
<appender name="CUSTOM_DB_APPENDER" class="com.....MyDbAppender">
        <filter class="com......MyFilter"/>
        <param name="jndiLocation" value="java:/comp/env/jdbc/....MyPath"/> 
</appender>

А у вашего Java MyDbAppender должна быть строка jndiLocation с установщиком. Теперь выполните поиск jndi (см. Решение, полученное в 17.10.11 в 16:03)

1 голос
/ 17 октября 2011

Самым простым способом для меня было сделать аппендер с нуля.Я добавляю к одной таблице, используя Spring JDBC.Это работает примерно так:

public class MyAppender extends AppenderBase<ILoggingEvent>
{
  private String _jndiLocation;
  private JDBCTemplate _jt;

  public void setJndiLocation(String jndiLocation)
  {
    _jndiLocation = jndiLocation;
  }

  @Override
  public void start()
  {
    super.start();

    if (_jndiLocation == null)
    {
      throw new IllegalStateException("Must have the JNDI location");
    }
    DataSource ds;
    Context ctx;
    try
    {
      ctx = new InitialContext();
      Object obj = ctx.lookup(_jndiLocation);
      ds= (DataSource) obj;

      if (ds == null)
      {
        throw new IllegalStateException("Failed to obtain data source");
      }
      _jt = new JDBCTemplate(ds);
    }
    catch (Exception ex)
    {
      throw new IllegalStateException("Unable to obtain data source", ex);
    }

  }

  @Override
  protected void append(ILoggingEvent e)
  {
    // log to database here using my JDBCTemplate instance
  }
}

У меня возникла проблема с SLF4J - здесь описана ошибка замещающего регистратора: http://www.slf4j.org/codes.html#substituteLogger

Этот поток в многошаговой конфигурации позволил мне обойти эту проблему.

1 голос
/ 05 октября 2011

Вам необходимо реализовать ch.qos.logback.classic.db.names.DBNameResolver и использовать его в конфигурации:

<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
  <dbNameResolver class="com.example.MyDBNameResolver"/>
  <!-- ... -->
</appender>
...