API Clojure REST: проблема с журналированием
Я понял одну проблему с входом в Clojure API.
Я пытаюсь реализовать механизм ведения журнала для запросов API и операторов SQL.
Project.clj
(defproject clojure-dauble-business-api "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:ring {:handler clojure-dauble-business-api.routes/app}
:dependencies [[org.clojure/clojure "1.8.0"]
[metosin/compojure-api "1.1.10"]
[ring/ring-core "1.4.0"]
[ring/ring-jetty-adapter "1.4.0"]
[ring/ring-defaults "0.2.0"]
[org.clojure/java.jdbc "0.6.1"]
[yesql/yesql "0.5.3"]
[org.postgresql/postgresql "9.4.1212"]
[org.clojure/data.json "0.2.6"]
[cheshire "5.7.1"]
[com.googlecode.log4jdbc/log4jdbc "1.2"]
[org.slf4j/slf4j-simple "1.7.12"]
[org.clojure/tools.logging "0.3.1"]
[log4j/log4j "1.2.17" :exclusions [javax.mail/mail
javax.jms/jms
com.sun.jmdk/jmxtools
com.sun.jmx/jmxri]]]
:profiles {:dev {:resource-paths ["resources"]}}
:plugins [[lein-ring "0.12.0"]]
:main clojure-dauble-business-api.routes)
а также
log4j.properties
# Application Logging
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/app.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d][%p][%c] %m%n
# # the appender used for the JDBC API layer call logging above, sql only
log4j.appender.sql=org.apache.log4j.RollingFileAppender
log4j.appender.sql.layout=org.apache.log4j.PatternLayout
log4j.appender.sql.layout.ConversionPattern= \u001b[0;31m (SQL)\u001b[m %d{yyyy-MM-dd HH:mm:ss.SSS} \u001b[0;32m %m \u001b[m %n
#
# # ==============================================================================
# # JDBC API layer call logging :
# # INFO shows logging, DEBUG also shows where in code the jdbc calls were made,
# # setting DEBUG to true might cause minor slow-down in some environments.
# # If you experience too much slowness, use INFO instead.
#
log4jdbc.drivers=org.postgresql.Driver
#
# # Log all JDBC calls except for ResultSet calls
log4j.logger.jdbc.audit=INFO,sql
log4j.additivity.jdbc.audit=false
#
# # Log only JDBC calls to ResultSet objects
log4j.logger.jdbc.resultset=INFO,sql
log4j.additivity.jdbc.resultset=false
#
# # Log only the SQL that is executed.
log4j.logger.jdbc.sqlonly=INFO,sql
log4j.additivity.jdbc.sqlonly=false
#
# # Log timing information about the SQL that is executed.
log4j.logger.jdbc.sqltiming=INFO,sql
log4j.additivity.jdbc.sqltiming=false
#
# # Log connection open/close events and connection number dump
log4j.logger.jdbc.connection=INFO,sql
log4j.additivity.jdbc.connection=false
Вот
[com.googlecode.log4jdbc/log4jdbc "1.2"]
[org.slf4j/slf4j-simple "1.7.12"]
переопределяет механизм регистрации. Значит, журналы отображаются на консоли вместо создания файла app.log (в соответствии с конфигурациями log4j.properties).
Только журналы запросов API отображаются на консоли и не отображают журналы SQL.
Почему журналы отображаются на консоли? и как я могу журналы SQL журналы в файле?
2 ответа
Я понял ответ на свой вопрос.
Модифицированный project.clj
(defproject clojure-dauble-business-api "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:ring {:handler clojure-dauble-business-api.routes/app}
:dependencies [[org.clojure/clojure "1.8.0"]
[metosin/compojure-api "1.1.10"]
[ring/ring-core "1.4.0"]
[ring/ring-jetty-adapter "1.4.0"]
[ring/ring-defaults "0.2.0"]
[org.clojure/java.jdbc "0.6.1"]
[yesql/yesql "0.5.3"]
[org.postgresql/postgresql "9.4.1212"]
[org.clojure/data.json "0.2.6"]
[cheshire "5.7.1"]
[com.googlecode.log4jdbc/log4jdbc "1.2"]
[org.slf4j/slf4j-log4j12 "1.7.21"]
[org.clojure/tools.logging "0.3.1"]
[log4j/log4j "1.2.17" :exclusions [javax.mail/mail
javax.jms/jms
com.sun.jmdk/jmxtools
com.sun.jmx/jmxri]]]
:profiles {:dev {:resource-paths ["resources"]}}
:plugins [[lein-ring "0.12.0"]]
:main clojure-dauble-business-api.routes)
Модифицированный файл log4j.properties находится здесь
# Application Logging
log4j.rootLogger=info, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/app.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d][%p][%c] %m%n
#
# # ==============================================================================
# # JDBC API layer call logging :
# # INFO shows logging, DEBUG also shows where in code the jdbc calls were made,
# # setting DEBUG to true might cause minor slow-down in some environments.
# # If you experience too much slowness, use INFO instead.
#
log4jdbc.drivers=org.postgresql.Driver
#
# # Log all JDBC calls except for ResultSet calls
log4j.logger.jdbc.audit=INFO,sql
log4j.additivity.jdbc.audit=false
#
# # Log only JDBC calls to ResultSet objects
log4j.logger.jdbc.resultset=INFO,sql
log4j.additivity.jdbc.resultset=false
#
# # Log only the SQL that is executed.
log4j.logger.jdbc.sqlonly=INFO,sql
log4j.additivity.jdbc.sqlonly=false
#
# # Log timing information about the SQL that is executed.
log4j.logger.jdbc.sqltiming=INFO,sql
log4j.additivity.jdbc.sqltiming=false
#
# # Log connection open/close events and connection number dump
log4j.logger.jdbc.connection=INFO,sql
log4j.additivity.jdbc.connection=false
! the appender used for the JDBC API layer call logging above, sql only
log4j.appender.sql=org.apache.log4j.FileAppender
log4j.appender.sql.File=./log/sql.log
log4j.appender.sql.Append=false
log4j.appender.sql.layout=org.apache.log4j.PatternLayout
log4j.appender.sql.layout.ConversionPattern=[%d][%p][%c] %m%n
Ваш проект должен зависеть от slf4j-log4j12
вместо slf4j-simple
? поскольку
Привязка для простой реализации, которая выводит все события в System.err. Печатаются только сообщения уровня INFO и выше. Эта привязка может быть полезна в контексте небольших приложений.
https://www.slf4j.org/manual.html
Это должен быть вопрос Java.
редактировать:
На самом деле это второй вопрос.
log4jdbc
библиотека, использующая источник данных прокси для записи оператора SQL, поэтому вы должны использовать класс источника данных, предоставленный log4jdbc
net.sf.log4jdbc.Log4jdbcProxyDataSource
Вы можете получить больше информации, просто поиск в Google по log4jdbc
http://blog.jhades.org/logging-the-actualreal-sql-queries-of-a-springhibernate-application/