質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Logback

Logbackは、Javaのログ生成ライブラリです。同じログ生成ライブラリであるlog4jの後継プロジェクトであり、log4jと同様にSLF4Jというインターフェースを実装しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

4295閲覧

Mybatisで使用するSQLの出力制御について

a0841_1974

総合スコア29

Logback

Logbackは、Javaのログ生成ライブラリです。同じログ生成ライブラリであるlog4jの後継プロジェクトであり、log4jと同様にSLF4Jというインターフェースを実装しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2018/04/05 15:23

編集2018/04/09 14:29

いつもお世話になっております。

現在、Springboo2、PostgreSQL、Mybatis、Logbackで開発をしております。
Mybatisで実施したSQL、バインド変数などをログに出力したい為に、
logback-spring.xmlに以下の記述をして、ログを出力するようにしました。

このログの出力でお聞きしたい事があります。
毎回ログを出力せずに、必要な時だけログを出力したいのですが、
logback-spring.xml以外(プログラムからになります)から、
ログレベルなどを変更して、ログを出力する/出力しないといった制御を実施したいのですが、
出来るのでしょうか。

<appender name="SQL_LOGGER" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %highlight(%-5le) %cyan(%-40.40lo{36}) - %green(%msg) %n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender>  <logger name="com.apri" level="DEBUG"> <appender-ref ref="SQL_LOGGER" /> </logger>

以上です。
よろしくお願いいたします。

(追記)
以下のようにフィルタを追加してlogback-spring.xmlの記述を変更しましたら、
フィルタは動くようになりましたが、
@AutowiredのconfigServiceがNULLとなってしまいます。

SQLLoggingFilter .java

public class SQLLoggingFilter extends Filter<ILoggingEvent> { @Autowired ConfigService configService; Level level; @Override public FilterReply decide(ILoggingEvent event) { if (event.getMessage().contains("Preparing") || event.getMessage().contains("Parameters")) { if(configService.isSql_log_hyouji_flg()){ return FilterReply.NEUTRAL; } else{ return FilterReply.DENY; } } else{ return FilterReply.NEUTRAL; } } public void setLevel(String level) { this.level = Level.toLevel(level); } public void start() { if (this.level != null) { super.start(); } } }

logback-spring.xml

<appender name="SQL_LOGGER" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %highlight(%-5le) %cyan(%-40.40lo{36}) - %green(%msg) %n</pattern> </encoder> <filter class="com.apri.common.filter.SQLLoggingFilter"> <level>DEBUG</level> </filter> </appender>

Filter内での@Autowiredの使用方法が分からないので、
Mapper XML内のSQLを読み込んでログに出力するサービスを作成しました。
※パラメータ部分の出力個所は、もう少し改善が必要です。

@Service public class SQLHelperService { private static final Logger logger = LoggerFactory.getLogger("sql_logger"); @Autowired ConfigService configService; public void logger_sql(String path_file_name,String mapper_id,Object params) throws ApplicationException { try{ if(configService.isSql_log_hyouji_flg()){ String absolute_path = new File(".").getAbsoluteFile().getParent(); Configuration config = new Configuration(); InputStream fileStream = new FileInputStream(absolute_path+path_file_name); XMLMapperBuilder parser = new XMLMapperBuilder(fileStream, config, "", config.getSqlFragments()); parser.parse(); MappedStatement st = config.getMappedStatement(mapper_id); BoundSql sql = st.getBoundSql(params); logger.info("[SQL]"); logger.info(sql.getSql()); logger.info("[Parameters]"); if(sql.getParameterObject() != null){ logger.info(sql.getParameterObject().toString()); } } } catch (FileNotFoundException e) { throw new ApplicationException(e); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

以下の2つのどちらでも対応する事が出来ました。
(方法1)
TurboFilterに@Autowiredを使用した方法

CustomLoggingFilter.java

@Named("customLoggingFilter") public class CustomLoggingFilter extends TurboFilter { @Autowired private ConfigService configService; @Override public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { if(configService == null){ return FilterReply.ACCEPT; } else{ // SQLを出力する/出力しないの制御 if(format != null){ if (format.contains("Preparing") || format.contains("Parameters")) { if(configService.isSql_log_hyouji_flg()){ return FilterReply.ACCEPT; } else{ return FilterReply.DENY; } } } return FilterReply.ACCEPT; } } }

ConfigService .java

@Service @Scope("singleton") public class ConfigService { // SQLのログを出力するFLG // true:表示、false:非表示 private boolean sql_log_hyouji_flg = false; public boolean isSql_log_hyouji_flg() { return sql_log_hyouji_flg; } public void setSql_log_hyouji_flg(boolean sql_log_hyouji_flg) { this.sql_log_hyouji_flg = sql_log_hyouji_flg; } }

DiscoveringPostProcessor .java

@Component public class DiscoveringPostProcessor implements BeanPostProcessor, ApplicationContextAware { ApplicationContext applicationContext; @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(bean instanceof CustomLoggingFilter){ Map<String, TurboFilter> filterBeans = applicationContext.getBeansOfType(TurboFilter.class); for (TurboFilter filter : filterBeans.values()) { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); for(int i = 0;i<loggerContext.getTurboFilterList().size();i++){ TurboFilter data =(TurboFilter)loggerContext.getTurboFilterList().get(i); if(data.getClass().getName().equals(CustomLoggingFilter.class.getName())){ filter.setContext(data.getContext()); loggerContext.getTurboFilterList().remove(i); loggerContext.getTurboFilterList().add(i,filter); } } } } return bean; }

logback-spring.xml

<configuration> <property name="log_dir" value="C:/logs" /> <turboFilter class="com.apri.common.filter.CustomLoggingFilter"></turboFilter> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %highlight(%-5le) %cyan(%-40.40lo{36}) - %green(%msg) %n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <appender name="SQL_LOGGER" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %highlight(%-5le) %cyan(%-40.40lo{36}) - %green(%msg) %n</pattern> </encoder>   <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender>  <logger name="com.apri" level="DEBUG" additivity="false"> <appender-ref ref="SQL_LOGGER" /> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>

(方法2)
ログレベルの変更を使用した方法
ConfigService.java

@Service @Scope("singleton") public class ConfigService { protected final Logger logger = LoggerFactory.getLogger("com.apri"); // SQLのログを出力するFLG // true:表示、false:非表示 private boolean sql_log_hyouji_flg = false; public boolean isSql_log_hyouji_flg() { return sql_log_hyouji_flg; } public void setSql_log_hyouji_flg(boolean sql_log_hyouji_flg) { this.sql_log_hyouji_flg = sql_log_hyouji_flg; ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger)logger; if(this.sql_log_hyouji_flg){ log.setLevel(Level.DEBUG); } else{ log.setLevel(Level.INFO); } }

logback-spriing.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration>    <!-- ファイルの出力先を指定する事。 --> <property name="log_dir" value="C:/logs" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %highlight(%-5le) %cyan(%-40.40lo{36}) - %green(%msg) %n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <appender name="SQL_LOGGER" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <encoder> <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %highlight(%-5le) %cyan(%-40.40lo{36}) - %green(%msg) %n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender> <logger name="com.apri" level="DEBUG" additivity="false"> <appender-ref ref="SQL_LOGGER" /> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>

投稿2018/04/11 13:41

a0841_1974

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

フィルタを実装してください

それでお望みの処理が可能になるかと思います。

投稿2018/04/05 22:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a0841_1974

2018/04/07 06:10

ご回答ありがとうございます。 上記フィルタのページを確認して、 public FilterReply decide(ILoggingEvent event)を使用して 制御しようかと思っております。 基本的なことが分かっておらず大変申し訳ございませんが、 SpringbootではこのFilterをどのようにコーディングすれば処理に組み込めるのでしょうか。 webMvcConfigファイルを作成して、以下のように登録したらエラーが発生してしましました。 @Bean public FilterRegistrationBean commonFilter1() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new SampleFilter()); bean.setOrder(1); return bean; } (エラー内容) 型 FilterRegistrationBean のメソッド setFilter(Filter) は引数 (SampleFilter) に適用できません
a0841_1974

2018/04/07 14:34

public FilterReply decide(ILoggingEvent event)ですが、 上記の(追記)を記述する仕方でフィルタをかける事が出来ました。 ただし、Fliter内で@Autowiredを実施して、使用したいのですがNULLとなっていしまいます。 何か解決方法はありますでしょうか。
退会済みユーザー

退会済みユーザー

2018/04/08 23:20

読み込み優先度の問題のことかな 一例としてはセキュリティ設定でバズワードエンコーダーは コンフィグクラス→メソッドにより自己呼出 コントロールまたはサービスクラス→Autowired とするようにコンフィグクラスでは自分を含むコンフィグクラスでBean指定したものは読み込めないのかと
退会済みユーザー

退会済みユーザー

2018/04/08 23:36

あと、管理クラスでは実行されるが管理オブジェクトでは実行されないというのもあるな
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問