SLF4J+log4jをeclipseで使う

eclipseにて、Consoleとファイルにログを出力できるところまで環境を整えます。
ここを参考にしました。
http://netbuffalo.doorblog.jp/archives/4466209.html

予備知識

log4jjavaで最もポピュラーなロギングフレームワークだと思います。
log4jだけでも良いのですが、SLF4Jを使うことでprintfライクな文法でログを出力できるところが気に入り利用することにしました。

{}を変換指定子として printf ライクにメッセージを出力します。

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

log4jをインストール

eclipseに標準で入っているのか?WTPプラグインあたりをインストールしたときに入ったのか?分かりませんが、
既にpluginsフォルダにインストール済みでした。
C:\eclipse\plugins\org.apache.log4j_1.2.15.v201012070815.jar
を使います。

プロジェクト>右クリック>ビルドパスの構成>外部Jarの追加で上記のjarを追加します。

slf4jをインストール

http://www.slf4j.org/dist/slf4j-1.7.7.zip
をダウンロードし展開します。
そのうち
slf4j-log4j12-1.7.7.jar
slf4j-simple-1.7.7.jar
slf4j-api-1.7.7.jar
を c:\eclipse\pluginsにコピーします。

以上の3つを
プロジェクト>右クリック>ビルドパスの構成>外部Jarの追加にて追加します。

なお、slf4j-log4j12-1.7.7.jarはlog4jマッパーなんですが、
log4jのversion1.2に対応しています。eclipseに同梱していたorg.apache.log4j_1.2.15.v201012070815.jar
もversion1.2なんでOKですね。

log4j.xmlで設定する

log4j.propertiesはini形式でより普及している記述法ですが、今回はxmlで記述してみます。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1} %m%n" />
     </layout>
  </appender>

  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
     <param name="File" value="c:/logs/myprj.log" />
     <param name="Append" value="true" />
     <param name="MaxFileSize" value="5MB" /> 
     <param name="MaxBackupIndex" value="5" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1} %m%n" />
     </layout>
  </appender>
  
  <root>
    <priority value ="DEBUG" />
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE"/>
  </root>
  
</log4j:configuration>

プロジェクト>右クリック>新規>フォルダでresourceフォルダを作成します
resourceフォルダにlog4j.xmlという名前で、上記内容を保存します。
プロジェクト>右クリック>ビルドパス構成>クラスフォルダの追加でresourceフォルダを追加します。

これでlog4j.xmlが読み込まれます。

コード

サンプルコードがあれば一目瞭然でしょう。
log4jをimportするのではなくslf4jをimportすることが重要です。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
	private static Logger log = LoggerFactory.getLogger(MyApp.class);
	public static void main(String[] args) {
		log.info("Starting my application...");
	}
}

projectを実行する

log4jへのBindはわざわざコーディングする必要はなく、ビルドパスにslf4j-log4j12-1.7.7.jar指定されているだけでBindされます。
よってプログラムを実行すると、consoleに以下のように出力されるはずです

SLF4J: Found binding in [jar:file:/C:/eclipse/plugins/slf4j-log4j12-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/eclipse/plugins/slf4j-simple-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]

さらにlogの出力コードに到達すれば、ConsoleとFileに以下が出力されます

Starting my application...

以上です

eclipse4.4 + jetty9 でサーブレット開発環境 構築

WindowsOS 64bit環境に全く何もインストールされていない状態からの環境構築をメモります。

JDKをインストールします

jdk-8u11-windows-x64.exeを実行します。
ちなみに、以下からダウンロードしました。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Windows x64 155.29 MB jdk-8u11-windows-x64.exe

c:\Program Files\Java\jdk1.8.0_11
にインストールしました。

eclisepをインストールします

eclipse-jee-luna-R-win32-x86_64.zip
をc:\eclipseに展開します。
(c:\program filesなどの空白を含むフォルダにはインストールしないこと。動作不具合の原因になります)

ちなみにJavaEE版をダウンロードしました。
JavaEEとは、エンタープライズ向けのjavaライブラリを含むバージョンのことで
WEBアプリケーションの開発にはJavaEEが必須です。

ダウンロードしたのはこちら。OSや32bitの場合には別途ダウンロードしてください。
https://www.eclipse.org/downloads/
Eclipse IDE for Java EE Developers, 259 MB

続いてeclipseの日本語化を行います。

pleiades_1.5.0.zip
を展開し、c:\eclipseフォルダへ上書き

以下からダウンロードしました
http://sourceforge.jp/projects/mergedoc/downloads/61474/pleiades_1.5.0.zip/
pleiades_1.5.0

c:\eclipse\eclipse.iniの末尾に

を追加

C:\eclipse\eclipse.exe -clean.cmd
を実行。1回だけ。

eclipseを終了。

これでOK

eclipseで利用するJDKのパスを変更

eclipse(c:\eclipse\eclipse.exe)を起動
メニュー>windows>設定>javaで検索>Installed JRE(インストール済みのJRE)」
にて、c:\Program Files\Java\jdk1.8.0_11をデフォルトにする

参考サイト:
http://www.kkaneko.com/rinkou/javaintro/eclipse.html#3
の Eclipse で,インストール済みの JREJDK 1.7.0 に設定

WTPをインストールします

WTPとはeclipseのWEB開発プラグインの集合体です。htmlエディタやxmlエディタなどを同梱します。
必要ないかもしれませんが、インストールしておきます。

eclipseを起動し
メニュー>ヘルプ>新規ソフトウェアインストールを開きます
作業対象に
http://download.eclipse.org/webtools/repository/luna
を入れて、しばらく待ちます。
メインのGridに、3行のプラグインが表示されます。
・WTP3.6.0
・WTP3.6.0パッチ
の2つを選択して、次へ。次へ。といって、完了します。

インストールが完了するまで待ちます。

eclipseの再起動が促されるので、再起動します。

以上です。

Jettyプラグインをインストールします。

前提
Jettyの最新版は ver9 です。
jetty7,8の更新は停止されており、今後のことを考えると ver9を使うべき。
一方、jettyのeclipse対応プラグインはver 8までしか公式には公開されていません。
そこで今回は、非公式のjetty9 plugin for eclipseをインストールします。
若干公式jettyプラグインと操作方法が違いますが、問題なく開発できるので、これでいきます。

手順
eclipseを起動し
メニュー>ヘルプ>新規ソフトウェアインストールを開きます
作業対象に
http://download.eclipse.org/webtools/repository/luna
を入れて、追加ボタンを押します。
jetty-nightlyという名前を付けて追加します。
しばらく待ちます。
メインのGridに、3行のプラグインが表示されます。
すべて選択して、次へ。次へ。といって、完了します。

インストールが完了するまで待ちます。

途中で”署名なしコンテンツを含む...”と警告されますが、OKし続行します。

eclipseの再起動が促されるので、再起動します。

以上です。

サンプルプロジェクトを作って、動作を確認します

eclipseを起動します
メニュー>ファイル>新規>プロジェクト>動的WEBプロジェクト
ターゲットランタイムを”なし”にします
プロジェクト名をDemoServletPrjにします

作成されたプロジェクトをツリーで右クリック>新規>サーブレット
名前をDemoServlet
パッケージをcom.teppi
で完了

作成されたプロジェクトをツリーで右クリック>ビルドパス>ビルドパスの構成>ライブラリ>外部Jarの追加
にて
C:\eclipse\plugins\javax.servlet_3.0.0.v201112011016.jar
を追加
(これをやらないと、import javax.servletがエラーになっていまう)


プロジェクト名右クリック>デバッグデバッグ構成
JettyWebApp>右クリック>新規
DemoServletPrjのJettyWebApp設定が追加される。
Jetty Versionを"Jetty 9.0.0.M3"に変更。

JREタブに移動し、”実行環境”を選択する。
これでeclipseと同じjdk1.8.0でjettyが起動するようになる。

適用。閉じる。

ツールバーの実行ボタンの左、虫ボタン(デバッグ実行。これでないとプレークポイント使えない)を押す

http://localhost:8080/DemoServletPrj/DemoServlet
をブラウザで開く、404にならずに画面がまっしろになるはず。

停止し、DemoServlet.javaのdoGetに以下を記述
PrintWriter out = response.getWriter();
out.write("aiueo");
PrintWriterにカーソルを合わせCtrl+1 で先頭のImportPrintWriterを選択
(これで自動的にuses節にUnitを追加してくれるイメージ)
ソースを保存して、虫ボタンを再度押す
(これでWEBサーバーも再起動され、自動的にビルドも行われる)

http://localhost:8080/JettyPrj/JettyServlet
をブラウザで開く。aiueoと表示される。

以上です