91839


Aspectを使用して特定メソッド前後にアプリケーションログを出力しています。  
ここに、JdbcTemplateで実行されたSQL文をログに出力しようとしています。  
SQL文以外のログは全て正常に出力されています。  
log4jdbcは使用していません。

ログを取得する場所としては、下のLogApクラス側を修正するか、  
TestDaoクラス内にLoggerで個別ログを記述するかの２か所ではないかと考えていますが、  
どのようにすれば実行SQL文が取得できるか解決できませんでした。  
アドバイスをお願いします。

追記：ログレベルをtraceにしてもメソッド前後のアプリケーションログしか出力できないため、こちらに相談しています。

* * *

欲しいログ  
SELECT * FROM tableA WHERE name="testName";  
もしくはプレースホルダ付きSQL文とパラメータのセット

* * *

log4j.xml

[code]

    <logger name="org.springframework.jdbc.core.JdbcTemplate" additivity="false">
       <level value="debug" />
       <appender-ref ref="stdout" />
    </logger>
    <logger name="org.springframework.jdbc.core.StatementCreatorUtils" additivity="false">
       <level value="debug" />
       <appender-ref ref="stdout" />
    </logger>
    <root>
        <appender-ref ref="stdout" />
    </root>
    
[/code]

ログ出力定義

[code]

    @Component
    @Aspect
    public class LogAp {
        private static final Logger logger = Logger.getLogger(LogAp.class);
    
        @Before("execution(* jp.co.test.*.*(..))")
        public void aa(JoinPoint jp) {
            log.debug(jp.getSignature().getDeclaringTypeName());
        }
    
        @After("execution(* jp.co.test.*.*(..))")
        public void bb(JoinPoint jp) {
            log.debug(jp.getSignature().getDeclaringTypeName());
        }
    }
    
[/code]

DAOクラス

[code]

    package jp.co.test;
    public class TestDao {
        @Autowired
        private JdbcTemplate jdbc;
       
        public void selectName() {
            jdbc.queryForList("SELECT * FROM tableA WHERE name=?","testName");
        }
    }
    
[/code]


CC BY-SA 4.0
2022-10-26T03:53:47.633
91830
2022-10-27T01:02:24.257
2022-10-27T01:02:24.257
question
java spring logging
実行したSQL文をlog4jでログ出力したい


SQL本文は [`debug`レベルで出力されます](https://github.com/spring-projects/spring-
framework/blob/v5.3.23/spring-
jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java#L641-L644)が、
prepared statement の値は [`trace` レベルで出力される](https://github.com/spring-
projects/spring-framework/blob/v5.3.23/spring-
jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java#L226-L231)ようですので、次のような設定になります:

[code]

      <logger name="org.springframework.jdbc.core.JdbcTemplate" additivity="false">
        <level value ="debug" />
        <appender-ref ref="stdout"/>
      </logger>
      <logger name="org.springframework.jdbc.core.StatementCreatorUtils" additivity="false">
        <level value ="trace" />
        <appender-ref ref="stdout"/>
      </logger>
    
[/code]

結果:

[code]

    Executing prepared SQL query
    Executing prepared SQL statement [SELECT * FROM tableA WHERE name=?]
    Setting SQL statement parameter value: column index 1, parameter value [testName], value class [java.lang.String], SQL type unknown
    
[/code]


CC BY-SA 4.0
2022-10-26T12:06:14.550
91839
2022-10-26T12:06:14.550
2808
91830
answer