복붙노트

[SQL] Grails의 SQL 문을 기록하는 방법

SQL

Grails의 SQL 문을 기록하는 방법

나는 성능을 확인하기 위해 Grails의가하는 콘솔이나 파일에 모든 쿼리를 기록합니다.

나는 성공없이 구성했다.

어떤 생각이 도움이 될 것이다.

해결법

  1. ==============================

    1.환경

    환경

    datasource {
    ...
    logSql = true
    }
    

    DataSource.groovy에에 (이 지침에 따라) 내 환경에서 작업을 진행하기에 충분했다. 질문의 일부 날짜 (예를 들어, "다 대다 열 뒤로"질문)이 있으므로이 또한 그 동안 변경 뭔가 수 있습니다 밖으로 것 같다.

  2. ==============================

    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. ==============================

    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. ==============================

    4.이 시도:

    이 시도:

    log4j = {
       ...
       debug 'org.hibernate.SQL'
       trace 'org.hibernate.type.descriptor.sql.BasicBinder'
    }
    

    그것은 Hibernate 타입의 패키지를 기록 추적의 성능 문제를 방지 할 수 있습니다. 이것은 위의 최대 절전 모드 3.6와 함께 작동합니다. 내가 이것을에서 가져온 : https://burtbeckwith.com/blog/?p=1604

  5. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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 로깅을 설정합니다.

  11. from https://stackoverflow.com/questions/2568507/how-to-log-sql-statements-in-grails by cc-by-sa and MIT license