[SQL] Grails의 SQL 문을 기록하는 방법
SQLGrails의 SQL 문을 기록하는 방법
나는 성능을 확인하기 위해 Grails의가하는 콘솔이나 파일에 모든 쿼리를 기록합니다.
나는 성공없이 구성했다.
어떤 생각이 도움이 될 것이다.
해결법
-
==============================
1.환경
환경
datasource { ... logSql = true }
DataSource.groovy에에 (이 지침에 따라) 내 환경에서 작업을 진행하기에 충분했다. 질문의 일부 날짜 (예를 들어, "다 대다 열 뒤로"질문)이 있으므로이 또한 그 동안 변경 뭔가 수 있습니다 밖으로 것 같다.
-
==============================
2.나는 그것이 더 유용 바인드 변수와 함께 SQL을 기록 Hibernate의 로깅을 사용하도록 설정 (당신은 당신의 전화에 전달 된 값을 볼 수 있도록, 쉽게 편집 또는 그렇지 않으면 SQL 복제)하는 것입니다 다음을 수행 할 찾을 수 있습니다.
나는 그것이 더 유용 바인드 변수와 함께 SQL을 기록 Hibernate의 로깅을 사용하도록 설정 (당신은 당신의 전화에 전달 된 값을 볼 수 있도록, 쉽게 편집 또는 그렇지 않으면 SQL 복제)하는 것입니다 다음을 수행 할 찾을 수 있습니다.
당신의 Config.groovy, 귀하의 log4j 블록에 다음을 추가합니다 :
log4j = { // Enable Hibernate SQL logging with param values trace 'org.hibernate.type' debug 'org.hibernate.SQL' //the rest of your logging config // ... }
-
==============================
3.Grails는 3.를 위해 *
Grails는 3.를 위해 *
옵션 # 1은 logback.groovy에 다음을 추가
logger("org.hibernate.SQL", DEBUG, ["STDOUT"], false) logger("org.hibernate.type.descriptor.sql.BasicBinder", TRACE, ["STDOUT"], false)
또는
옵션 # 2는 application.yml에서 데이터 소스와 다음을 추가합니다. 그러나이 방법은 매개 변수 값을 기록하지 않습니다
environments: local: dataSource: logSql: true formatSql: true
-
==============================
4.이 시도:
이 시도:
log4j = { ... debug 'org.hibernate.SQL' trace 'org.hibernate.type.descriptor.sql.BasicBinder' }
그것은 Hibernate 타입의 패키지를 기록 추적의 성능 문제를 방지 할 수 있습니다. 이것은 위의 최대 절전 모드 3.6와 함께 작동합니다. 내가 이것을에서 가져온 : https://burtbeckwith.com/blog/?p=1604
-
==============================
5.솔루션은 개발이 아니라 생산을위한 것입니다.
솔루션은 개발이 아니라 생산을위한 것입니다.
작업 위의 모든 답변은 정확합니다. 그러나 그들은 멋진 사람이 읽을 수있는 방법으로 전체 쿼리를 표시하지 않습니다. 희망 쿼리 (어떤?,?)없이 마지막을 볼 경우 두 가지 옵션이 있습니다.
A) 프록시 log4jdbc 나에 p6spy와 JDBC 연결.
데이터베이스 수준에서 그것에 B) 모습. 예를 들어 정말 쉽게 mysql을 함께 할 수 있습니다.
당신이 general_log_file입니다 알아보십시오. 없음이 이미 활성화 된 경우 활성 일반 로그.
mysql command line> show variables like "%general_log%"; mysql command line> set global general_log = true;
당신이 로그 파일에 이제 모든 것이 기록됩니다. 맥 / 리눅스의 예는 쿼리의 좋은 흐름을 표시합니다.
tail -f path_to_log_file
-
==============================
6.참조를 위해 순수는,하지만 난 SQL 쿼리를 로그에 p6spy 사용합니다. 그것은 작은 중간 JDBC 드라이버입니다. 가 (포함 매개 변수) 서버로 전송 될 수로 정확한 쿼리가 기록됩니다.
참조를 위해 순수는,하지만 난 SQL 쿼리를 로그에 p6spy 사용합니다. 그것은 작은 중간 JDBC 드라이버입니다. 가 (포함 매개 변수) 서버로 전송 될 수로 정확한 쿼리가 기록됩니다.
프로젝트에 포함 :
runtime 'p6spy:p6spy:3.0.0'
당신의 데이터 소스 드라이버를 변경 :
driverClassName: com.p6spy.engine.spy.P6SpyDriver
그리고 당신의 JDBC URL :
url: jdbc:p6spy:mysql://
이 (관례에 따라 grails-app / conf에) spy.properties를 사용하여 구성합니다.
driverlist=org.h2.Driver,com.mysql.jdbc.Driver autoflush=true appender=com.p6spy.engine.spy.appender.StdoutLogger databaseDialectDateFormat=yyyy-MM-dd logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
생산이 해제하는 것을 잊지 마세요!
-
==============================
7.나는이 질문과 긴 다시 난 그냥이 질문을 볼 수 있었던 및 응답 또는 우리의 프로젝트에 우리의 SQL 로깅 구현 접근 방식을 공유하고 자신을 막을 수 없다 나누었다 대답했다 알고있다. 그것은 몇 가지 도움이 될 바랍니다.
나는이 질문과 긴 다시 난 그냥이 질문을 볼 수 있었던 및 응답 또는 우리의 프로젝트에 우리의 SQL 로깅 구현 접근 방식을 공유하고 자신을 막을 수 없다 나누었다 대답했다 알고있다. 그것은 몇 가지 도움이 될 바랍니다.
현재는 개발 환경입니다. 우리는 SQL 로그 "log4jdbc 드라이버 스파이"를 사용하고 있습니다.
당신의 BuildConfig.groovy에서 : 의존성 아래에 추가 :
dependencies { ..... runtime 'org.lazyluke:log4jdbc-remix:0.2.7' }
그리고 당신의 데이터 소스 또는 기타 설정에 관련된 : [데이터 소스 관련 구성을 정의한 곳, 추가 :
datasources{ ..... driverClassName: "net.sf.log4jdbc.DriverSpy", url: "jdbc:log4jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXX.XX>XXX)(PORT = 1521))) (CONNECT_DATA = (SID = XXXX)(SERVER =DEDICATED)))", .... } log4j = { info 'jdbc.sqlonly' //, 'jdbc.resultsettable' }
내 개인적인 경험에서 나는 디버깅하는 동안 꽤 유용하고 도움이되었다고합니다. 또한 자세한 내용은이 사이트에서 찾을 수 있습니다. https://code.google.com/p/log4jdbc-remix/
왕 감사합니다
-
==============================
8.다음은 나를 위해 작동합니다 :
다음은 나를 위해 작동합니다 :
# ... hibernate: format_sql: true # <<<<<<< ADD THIS <<<<<<< cache: queries: false use_second_level_cache: true # ... environments: development: dataSource: logSql: true // <<<<<<< ADD THIS <<<<<<< dbCreate: create-drop url: jdbc:h2:mem:... # ...
// ... appender('STDOUT', ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = "%level %logger - %msg%n" } } // >>>>>>> ADD IT >>>>>>> logger 'org.hibernate.type.descriptor.sql.BasicBinder', TRACE, ['STDOUT'] logger 'org.hibernate.SQL', TRACE, ['STDOUT'] // <<<<<<< ADD IT <<<<<<< root(ERROR, ['STDOUT']) def targetDir = BuildSettings.TARGET_DIR // ...
출처 : http://sergiodelamo.es/log-sql-grails-3-app/
-
==============================
9.코드의 특정 블록을 위해 우리는 또한 폐쇄를 허용하는 방법을 만들 수 있습니다. 예를 들면.
코드의 특정 블록을 위해 우리는 또한 폐쇄를 허용하는 방법을 만들 수 있습니다. 예를 들면.
static def executeBlockAndGenerateSqlLogs(Closure closure) { Logger sqlLogger = Logger.getLogger("org.hibernate.SQL"); Level currentLevel = sqlLogger.level sqlLogger.setLevel(Level.TRACE) def result = closure.call() sqlLogger.setLevel(currentLevel) result } executeBlockAndGenerateSqlLogs{DomainClazz.findByPropertyName("property value")}
-
==============================
10.콘솔 플러그인이 설치되어있는 경우, 당신은이 작은 코드와 SQL 로깅을 얻을 수 있습니다.
콘솔 플러그인이 설치되어있는 경우, 당신은이 작은 코드와 SQL 로깅을 얻을 수 있습니다.
// grails 2.3 def logger=ctx.sessionFactory.settings.sqlStatementLogger // grails 3.3 def logger = ctx.sessionFactory.currentSession.jdbcCoordinator.statementPreparer.jdbcService.sqlStatementLogger logger.logToStdout=true try { <code that will log sql queries> } finally { logToStdout = false }
이것은 위의 솔루션의 많은의 변형이지만 런타임에 값을 조정할 수 있습니다. 그리고 바로 다른 솔루션과 같은 거래는 logToStdout으로 만 쿼리가 아닌 바인드 값을 보여줍니다 것이다.
아이디어는 내가 지금 찾을 수 없습니다 몇 년 전에 읽은 burtbeckwith 포스트에서 도난 당했다. 그것은 Grails는 3.3와 함께 작동하도록 수정되었습니다.
유사한 기술은 특정 통합 테스트에 대한 로깅을 설정하는 데 사용할 수 있습니다 :
class SomeIntegrationSpec extends IntegrationSpec { def sessionFactory def setup() { sessionFactory.settings.sqlStatementLogger.logToStdout = true } def cleanup() { sessionFactory.settings.sqlStatementLogger.logToStdout = false } void "some test"() { ... }
이것은이 하나의 파일에 바로 테스트를 위해 SQL 로깅을 설정합니다.
from https://stackoverflow.com/questions/2568507/how-to-log-sql-statements-in-grails by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 제대로 오라클 ORDER BY와 ROWNUM을 사용 하는가? (0) | 2020.04.01 |
---|---|
[SQL] 어떻게 SQL의 조합에 의해 주문하는? (0) | 2020.04.01 |
[SQL] 어떻게 PostgreSQL의에서 함수 내부에서 SELECT의 결과를 반환하는? (0) | 2020.04.01 |
[SQL] SQL 서버 : 사용하여 테이블의 기본 키를 얻기 SQL 쿼리 [중복] (0) | 2020.04.01 |
[SQL] 어떻게 프로그램에 DbContext.SaveChanges ()에서 생성 된 SQL을 기록 할 수 있습니까? [복제] (0) | 2020.04.01 |