powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Log4j + clickhouse
25 сообщений из 34, страница 1 из 2
Log4j + clickhouse
    #40114209
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую! Подскажите, как перенаправить логи приложения посредством log4j на clickhouse.
Пробовал через mysql и pgsql протоколы. В локальные БД MySql и PostgreSQL записи пишутся нормально, а в Clickhouse не хотят писаться.

Настройки делал согласно описанию JDBCAppender через ConnectionFactory. Ни в какую не лезут
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114215
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажи свой конфиг. Особенно ignoreExceptions.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114232
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

На самом деле ignoreException не использовал, так как делал по инструкции с сайта

log4j2.xml
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
    <Appenders>
        <JDBC name="databaseAppender" tableName="requests">
            <ConnectionFactory class="request.ConnectionFactory" method="getDatabaseConnection"/>
            <Column name="log_date" isEventTimestamp="true"/>
            <Column name="body" pattern="%message" isUnicode="false"/>
        </JDBC>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="databaseAppender"/>
        </Root>
    </Loggers>
</Configuration>



Ошибка, которая выдается при запуске программы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
2021-11-23 19:00:47,759 main ERROR Unable to write to database [JdbcManager{name=databaseAppender, bufferSize=0, tableName=requests, columnConfigs=[{ name=log_date, layout=null, literal=null, timestamp=true }, { name=body, layout=%message, literal=null, timestamp=false }], columnMappings=[]}] for appender [databaseAppender]. org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_date, layout=null, literal=null, timestamp=true }, { name=body, layout=%message, literal=null, timestamp=false }], sqlStatement=insert into requests (log_date,body) values (?,?), factoryData=FactoryData [connectionSource=factory{ public static java.sql.Connection request.ConnectionFactory.getDatabaseConnection() }, tableName=requests, columnConfigs=[{ name=log_date, layout=null, literal=null, timestamp=true }, { name=body, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=jdbc:mysql://127.0.0.1:15004/chatserver, UserName=htzsg2, MySQL Connector/J, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into requests (log_date,body) values (** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector=null, isBatchSupported=true, columnMetaData={LOG_DATE=ColumnMetaData [schemaName=, catalogName=, tableName=, name=log_date, nameKey=LOG_DATE, label=log_date, displaySize=0, type=1, typeName=CHAR, className=java.lang.String, precision=0, scale=0, isStringType=true], BODY=ColumnMetaData [schemaName=, catalogName=, tableName=, name=body, nameKey=BODY, label=body, displaySize=0, type=1, typeName=CHAR, className=java.lang.String, precision=0, scale=0, isStringType=true]}]
	at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:564)
	at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeThrough(JdbcDatabaseManager.java:900)
	at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:264)
	at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:540)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:498)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:481)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:410)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
	at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
	at org.apache.log4j.Category.maybeLog(Category.java:512)
	at org.apache.log4j.Category.info(Category.java:294)
	at request.Request.main(Request.java:16)
Caused by: java.sql.SQLException: Code: 62. DB::Exception: Syntax error: failed at position 1 ('commit'): commit. Expected one of: ALTER query, Query with output, ALTER PROFILE, RENAME DATABASE, SHOW PRIVILEGES query, TRUNCATE, KILL, KILL QUERY query, SELECT query, possibly with UNION, list of union elements, ALTER ROLE, SELECT subquery, DESCRIBE query, SELECT query, subquery, possibly with UNION, SHOW GRANTS, SHOW CREATE, CREATE SETTINGS PROFILE or ALTER SETTINGS PROFILE query, WATCH, SHOW PROCESSLIST query, ALTER POLICY, ALTER USER, CREAT
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:806)
	at org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334)
	at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:211)
	at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:560)
	... 16 more

2021-11-23 19:00:47,760 main ERROR An exception occurred processing Appender databaseAppender org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed to commit transaction logging event or flushing buffer [columnConfigs=[{ name=log_date, layout=null, literal=null, timestamp=true }, { name=body, layout=%message, literal=null, timestamp=false }], sqlStatement=insert into requests (log_date,body) values (?,?), factoryData=FactoryData [connectionSource=factory{ public static java.sql.Connection request.ConnectionFactory.getDatabaseConnection() }, tableName=requests, columnConfigs=[{ name=log_date, layout=null, literal=null, timestamp=true }, { name=body, layout=%message, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=jdbc:mysql://127.0.0.1:15004/chatserver, UserName=htzsg2, MySQL Connector/J, statement=com.mysql.cj.jdbc.ClientPreparedStatement: insert into requests (log_date,body) values (** NOT SPECIFIED **,** NOT SPECIFIED **), reconnector=null, isBatchSupported=true, columnMetaData={LOG_DATE=ColumnMetaData [schemaName=, catalogName=, tableName=, name=log_date, nameKey=LOG_DATE, label=log_date, displaySize=0, type=1, typeName=CHAR, className=java.lang.String, precision=0, scale=0, isStringType=true], BODY=ColumnMetaData [schemaName=, catalogName=, tableName=, name=body, nameKey=BODY, label=body, displaySize=0, type=1, typeName=CHAR, className=java.lang.String, precision=0, scale=0, isStringType=true]}]
	at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:564)
	at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeThrough(JdbcDatabaseManager.java:900)
	at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:264)
	at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:540)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:498)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:481)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:410)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
	at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:153)
	at org.apache.log4j.Category.maybeLog(Category.java:512)
	at org.apache.log4j.Category.info(Category.java:294)
	at request.Request.main(Request.java:16)
Caused by: java.sql.SQLException: Code: 62. DB::Exception: Syntax error: failed at position 1 ('commit'): commit. Expected one of: ALTER query, Query with output, ALTER PROFILE, RENAME DATABASE, SHOW PRIVILEGES query, TRUNCATE, KILL, KILL QUERY query, SELECT query, possibly with UNION, list of union elements, ALTER ROLE, SELECT subquery, DESCRIBE query, SELECT query, subquery, possibly with UNION, SHOW GRANTS, SHOW CREATE, CREATE SETTINGS PROFILE or ALTER SETTINGS PROFILE query, WATCH, SHOW PROCESSLIST query, ALTER POLICY, ALTER USER, CREAT
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:806)
	at org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334)
	at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:211)
	at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:560)
	... 16 more
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114251
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понятно. А эта mysql база вообще доступна на запись?
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114317
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это результат попытки записи в ClickHouse по MySQL интерфейсу. Если писать с этими параметрами в реальную MySQL базу, то все пишется без проблем. Такая же картина, если пробовать записать в ClickHouse через PostgreSQL интерфейс: в реальную PostgreSQL базу все пишется без ошибок, а в ClickHouse через предоставленный интерфейс - ошибка
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114321
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему ты решил что к ClickHouse можно подключатся используя MySQL драйвер?

Есть где-то на сайте производителя туториал о том что так можно?
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114326
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
А почему ты решил что к ClickHouse можно подключатся используя MySQL драйвер?

Есть где-то на сайте производителя туториал о том что так можно?


Вроде бы тут ...но это интерфейсы...даже вроде есть JDBC интерфейс.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114327
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
1) по архитектуре бд не подходит для логирования
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114328
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,

2) сам инсерти в бд и потестируй ее.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114330
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
qi_ip,

2) сам инсерти в бд и потестируй ее.

Через sql клиент к ClickHouse работает через mysql драйвер....а вот именно связка log4j2 + clickhouse (mysql, pgsql драйвера) не работает ((
Поэтому тут спросил, может у кого был опыт.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114331
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip
mayton
А почему ты решил что к ClickHouse можно подключатся используя MySQL драйвер?

Есть где-то на сайте производителя туториал о том что так можно?


Вроде бы тут ...но это интерфейсы...даже вроде есть JDBC интерфейс.

Попробуй вот этот драйвер https://github.com/ClickHouse/clickhouse-jdbc

И кстати Петро прав. Колончато-ориентированные DBMS обычно не умеют инсертить 1 строку.
Они грузят пачками или стримят (с буферизацией естественно).
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114332
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
qi_ip,
1) по архитектуре бд не подходит для логирования

Подскажите, пожалуйста, какая связка лучше с log4j2 для консолидации логов. До этого момента юзал только сохранение в файлы на диске. Теперь вот возникла необходимость консолидировать.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114333
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
qi_ip
пропущено...


Вроде бы тут ...но это интерфейсы...даже вроде есть JDBC интерфейс.

Попробуй вот этот драйвер https://github.com/ClickHouse/clickhouse-jdbc

И кстати Петро прав. Колончато-ориентированные DBMS обычно не умеют инсертить 1 строку.
Они грузят пачками или стримят (с буферизацией естественно).

Пробовал..проблема как подогнать к ConnectionFactory. Вроде бы передаю datasource, но он его не принимает



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class ClickhouseFactory {
    private static interface Singleton {
        final ClickhouseFactory INSTANCE = new ClickhouseFactory();
    }
    private final ClickHouseDataSource dataSource;

    private ClickhouseFactory() {
        try {
            Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(0);
        }
        ClickHouseProperties properties = new ClickHouseProperties();
        properties.setUser("user");
        properties.setPassword("password");

        this.dataSource = new ClickHouseDataSource("jdbc:clickhouse://localhost:8123/chatserver", properties);
    }

    public static Connection getDatabaseConnection() throws SQLException {
        return Singleton.INSTANCE.dataSource.getConnection();
    }
}
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114336
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Админская задача же.
40 машин и нет админа?
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114338
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
qi_ip,
Админская задача же.
40 машин и нет админа?

Вот он и предложил clickhouse...я пока на стадии исследования, насколько это подходит для логирования ))) Ну, машин пока не 40, раз в 10 меньше )
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114341
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip

Подскажите, пожалуйста, какая связка лучше с log4j2 для консолидации логов.

Расскажи что такое консолидация? Нет. я конечно могу сам предположить какой тут смысл. Но мне
кажется что есть нюансы. А также различные SLA. Как быстро консолидированный лог должен
быть доступен для поиска например.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114343
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
qi_ip

Подскажите, пожалуйста, какая связка лучше с log4j2 для консолидации логов.

Расскажи что такое консолидация? Нет. я конечно могу сам предположить какой тут смысл. Но мне
кажется что есть нюансы. А также различные SLA. Как быстро консолидированный лог должен
быть доступен для поиска например.

В моем случае, под консолидацией, я подразумеваю следующее:
Есть три сервера. На каждом сервере есть приложение у которого логи с помощью Log4j2 пишутся в три разных файла: один основной, второй чисто данные по запрос-ответ, третий-статистические данные. То есть full.log, request.log, statistic.log
То есть по факту, в случае необходимости, для поиска проблемы нужно будет просмотреть 9 файлов на трех серверах.
Если это все слить в одну БД/хранилище, то теоретически, поиск нужных данных будет происходить быстрее.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял. Как по мне - дорогое и ненадёжное решение. Для логов что важно.
Анализ инцедентов. А если инцедент - отказ БД и при этом лог надо писать
в эту-же БД то мы получаем такое себе дедлок. Или парадокс реализации.

Стоимость владения БД всегда дороже чем файловой системой. Положите туда 1 терабайт
табличных пространств - и уже плохо. Хрен почистишь. В файловой системе всяко легче.

Вобщем в пирамиде надежности файловая система стоит поближе к Java-процессу.

А вы - попробуйте синхронизировать все логи на сетевое хранилище через rsync.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114350
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114352
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,

Веб приложение не должно слать по сети логи. Это же очевидно.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114354
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Я понял. Как по мне - дорогое и ненадёжное решение. Для логов что важно.
Анализ инцедентов. А если инцедент - отказ БД и при этом лог надо писать
в эту-же БД то мы получаем такое себе дедлок. Или парадокс реализации.

Стоимость владения БД всегда дороже чем файловой системой. Положите туда 1 терабайт
табличных пространств - и уже плохо. Хрен почистишь. В файловой системе всяко легче.

Вобщем в пирамиде надежности файловая система стоит поближе к Java-процессу.

А вы - попробуйте синхронизировать все логи на сетевое хранилище через rsync.

Почитаю про это...спасибо большое за советы ))
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114355
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

Благодарю, тоже изучу эту тему
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114409
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Колончато-ориентированные DBMS обычно не умеют инсертить 1 строку.
Можно, конечно, догадаться, что на самом деле вы хотели сказать, но если формулировать утверждения так, чтобы не приходилось додумывать - будет гораздо гораздее.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114410
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
1) по архитектуре бд не подходит для логирования
"вы тут самые умные? Вам это кто-то сказал или вы сами так решили?" (ц)
Это же очевидно, что СУБД ClickHouse не подходит именно для той задачи, для которой её делали.
...
Рейтинг: 0 / 0
Log4j + clickhouse
    #40114415
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
)))) ну дак выскажись. Ее разве делали для логирования?
Я вот прочитал инфу что для слабоструктуированных данных.
А вы что прочитали?
Колись)
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Log4j + clickhouse
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]