アプリ開発ときどきアウトドアアウトドアWebツール自己紹介お問合せアプリ開発ときどきアウトドア主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。何気に使用しているSLF4Jの仕様やその仕組みを整理したいと思います。ログレベルを変更してもログが出力されないお悩みの方はこちらをご覧頂ければと思います。Manualサイトです。Manualhttps://www.slf4j.org/manual.html2019年1月での安定版の最新である1.7.25を使用した例を記載します。maven(pom.xml)を使う前提の説明になります。説明するサンプルは次の場所で公開しています。GitHub.SLF4jとは?特定のログ出力の実装に依存しない、汎用的なログ出力API(クラス・メソッド)です。logback等が公開されてきました。それぞれのライブラリは、ログの出力方法(プログラム)が異なるため、例えばAPサーバ等の実行環境が変わった際にプログラムを修正する必要があります。このように、特定の実装(ライブラリ)に依存してプログラムを作ってしまうと、後からの変更に手間がかかったり困難になる場合があります。このような問題を回避するために「インターフェイスと実装の分離」という考えを取り入れています。これは、プログラミングに必要となるAPI(インターフェイス)と、その具体的な処理内容(実装)を分離する、という考え方です。SLF4Jでは、どのログ出力ライブラリを使ってもいいような汎用的なログ出力APIを提供するとともに、実行時にどのログ出力ライブラリを使用するかを指定するための機能を提供します。することで、プログラマは特定のログ出力ライブラリに依存しないプログラミングができるようになります。実行時に、要件や環境に合わせて柔軟にログ出力ライブラリを切り替えることが可能となります。APIライブラリを追加を追加します。アプリでは、SLF4Jのロガーを使って任意のログを出力します。API及びライブラリの追加pom.xmlに次を追加し、mavenのプロジェクト更新を行います。API(ログ出力の実装なし)、”slf4j-simple”がSLF4Jに対応するログ出力ライブラリ(後述のバインディング)です。上記を実行すると次のようにログが出力されます。APIと、実行時に実際のログ出力を行うログ出力ライブラリで構成されます。APIのクラスを使ってログ出力のプログラムを作成することができますが、これだけではログ出力の機能を持っていないのでログ出力できません。そのため、少なくても実行時には「どのログ出力ライブラリを使うか?」を指定する必要があります。このログ出力ライブラリのことをバインディングと呼びます。バインディングのイメージは次の図のようになります。公式サイト引用:個人的には、そっと画面を閉じたくなる図ですが、記載されている文言を落ち着いて読めば難しい話ではありません。バインディングには大きく分けて、(1)APIを直接実装しているネイティブバインディング、(2)既存のログ出力ライブラリにログ出力を任せるためのアダプタレイヤ、があります。(図の一番左のように、バインディングを指定しない方法もありますが推奨される使い方ではなく、実行時する際にコンソールへ警告が出力されます。)(1)ネイティブバインディング:SLF4Jのクラス(インターフェース)を実装しているバインディングです。アダプタレイヤのバインディングのようにログ出力要求を特定のログ出力ライブラリ用の要求に変換する必要はないので、無駄が少なく、比較的高速に動作します。ログをどこにも出力しません。標準エラー出力にログを出力します。シンプルなアプリで使用する想定のものです。個人的には、JUnitや独自ツールでログを出力する際に使用します。APIを直接実装するlogbackログ出力ライブラリです。後述のアダプタのように処理を別のログ出力ライブラリに任せるわけではないので、アダプタ型のバインディングに比べ、無駄なく動作します。(2)アダプタレイヤ:SLF4Jに対するログ出力要求を、log4jやjul等の既存のログ出力ライブラリ用のログ出力要求に変換します。このような変換するためのバインディングを使用することで、既存のログ出力ライブラリを変更せずに使用できます。ログ出力ライブラリとしてlog4j(バージョン1.2)を使用する場合のアダプタです。※log4jバージョン1.2は2018にサポート期限切れになっており、log4j2の使用が推奨される。1.4ロギングを使う場合のアダプタです。Loggingを使う場合のアダプタです。APIとバインディングに対応するjarをpom.xmlに追加します。アダプタレイヤのバインディングの場合、log4jやjcl等の変換先のログ出力ライブラリの追加も必要になります。バインディングの指定は1つ(jarが1つという意味ではない)だけです。logback-coreという2つのjarが必要になります。アプリケーションサーバ等の特定の環境では、実行環境側でバインディングを提供する場合があるので、バインディングを指定しなくても、ログ出力が可能です。EAP7(APサーバ)では、既定でjboss-loggingというバインディングを提供するため、アプリ側でバインディングの指定は不要です。APIとバインディングとしてslf4j-simpleを使う場合のpom.xmlです。参考として、slf4j-nopやlogbackバインディングを使う場合の定義もコメントアウトした状態で記載しました。これらのバインディングを使う場合、その他のバインディングをコメントアウトしてください。サポートするSLF4Jバージョンは下記を参照のこと。個別のログ出力ライブラリの話になるため、ここでは割愛します。ポピュラーなものについては、別途記事にする予定です。【補足】バインディングの指定がない場合は、次のように警告が標準エラーに出力されます。details.バインディングの指定が複数ある場合は、次のように警告が標準エラーに出力されます。jcl等を使って既に実装されているログ出力処理を段階的にSLF4Jに移行するために使用するものがブリッジです。公式サイトのコンセプトは次の通りです。ブリッジは、log4jやjcl等のログ出力APIのフリをしますが、そのAPIの中ではSLF4JのAPIを実行します。することで、log4jやjcl等のログ出力APIを使うプログラムを修正せずに、ログ出力をSLF4Jに統一できます。SLF4Jからどのようにログ出力するかについては、前述の通り、バインディングの設定が必要になります。代表的なブリッジは次の通りです。log4jのログ出力をSLF4Jに転送します。Loggingのログ出力をSLF4Jに転送します。jclやlog4jの場合は”xxx-over-slf4j”なのに、julの場合だけ”xxx-to-slf4j”になっている理由についてです。log4j-over-slf4jの場合、log4jのフリをするためにlog4jと同じパッケージ名を使ったクラスを提供します。両者のjarがクラスパスにあると、パッケージ名重複エラーになってしまうので、クラスパス上からlog4jを除外し、log4j-over-slf4jを配置します。することで、呼び出し側のプログラムを修正せずに、slf4jのログ出力が可能となります。julの場合、パッケージ名”java.util.logging”はJava実行環境に含まれており、上記のように「クラスパスから除外」ということができません。そのため、julの場合のみ別の仕組みで実現しています。APIの上に別のログ出力APIをかぶせるイメージでoverと思われます。後者の場合は、julの出力をslf4jに転送するイメージでtoになっていると思われます。コメントをキャンセルメールアドレスが公開されることはありません。label要素にbootstrapのCSSクラスを指定する必要がある。...ExcelからPowerPointへの図表貼り付けVBAパフォーマンスモニタの監視データ(blg)に基づいてPowerPointで報告用のレポートを作成する必要がありました。EAP7にリモートアクセス開発中のものを他者に見せたり、問題が発生している開発者の開発物を参照するために、eclipse上で起動しているEAP7のWebアプリに別のPCからアクセスしたい場合があります。...リモートからのwarデプロイの自動化JavaEEベースのツールを公開しているが、デプロイの都度、warファイルをサーバにコピーしてwildflyにデプロイするのが面倒なので、mavenで自動化しました。自己紹介ゆっきーです。都内でシステムエンジニアをやっています。素人の伊豆大島一周サイクリングmybatis-generatorプラグインの実装方法システム開発でのmybatis-generatorの利用mavenマルチモジュールプロジェクトの構成例Java正規表現によるパラメータ置換アウトドアWebツール自己紹介お問合せアプリ開発ときどきアウトドア主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。