ログ出力 "したい" 時と "したくない" 時を実装

log4jでログ出力してて、例えばコンソールアプリケーションを作ってる時に、
あるアプリではコンソール+ログファイル両方出力したいけど、
もう一方のアプリではコンソールには出さなくて、ログファイルにだけ出したい、ってときがある。

そしてその2つのアプリは同じロジックを呼ぶ、つまり呼ばれるロジックはログを出力する時としない時がある。
うーん、log4jの標準機能ではクラス単位での切替くらいしかできないよなー、ってことで、こんな感じにしたらできたのでご紹介。
# もっとCoolにできるなら教えてください。


clashm45/log4j_mute · GitHub

MyLoggerクラスを作って、

public class MyLogger {
  private Logger logger = null;
  private static final String NoConsole = "NoConsole";
  
  private MyLogger(Class<?> clazz){
    logger = Logger.getLogger(clazz.getName());
  }

  private MyLogger(String prefix, Class<?> clazz){
    logger = Logger.getLogger(prefix+"."+clazz.getName());
  }

  public static MyLogger getInstans(Class<?> clazz){
    return new MyLogger(clazz);
  }

  public static MyLogger getInstansNoConsole(Class<?> clazz){
    return new MyLogger(NoConsole, clazz);
  }

  public void info(String msg){
    logger.info(msg);
  }
~~~
}

log4j.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 %5p %c - %m%n" />
    </layout>
  </appender>

  <appender name="file" class="org.apache.log4j.FileAppender">
    <param name="File" value="target/App.log" />
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %5p %c - %m%n" />
    </layout>
  </appender>

  <category name="log4j_mute">
    <priority value="info"/>
    <appender-ref ref="stdout"/>
    <appender-ref ref="file"/>
  </category>

  <category name="NoConsole">
    <priority value="info"/>
    <appender-ref ref="file"/>
  </category>

</log4j:configuration>

こんなロジッククラスを作る。
LogicA

public class LogicA {
  private static MyLogger logger = MyLogger.getInstans(LogicA.class);
  public static void process(){
    logger.info("処理A!!");
  }
}

LogicB

public class LogicB {
  private static MyLogger logger = MyLogger.getInstans(LogicB.class);
  public static void process(){
    logger.info("処理B!!");
  }

  public static void mute(){
    logger = MyLogger.getInstansNoConsole(LogicB.class);
  }
}

そしてロジックを利用するアプリケーションでこんな風にする。

public class App{
  public static void main( String[] args ) {
    LogicA.process();
    LogicB.process();
    LogicB.mute();
    LogicB.process();
  }
}

処理結果:コンソール

$ java -cp "src/main/resources;target/log4j_mute-1.0-SNAPSHOT-jar-with-dependencies.jar" log4j_mute.App
2012-12-18 14:39:29,461 INFO log4j_mute.LogicA - 処理A!!
2012-12-18 14:39:29,462 INFO log4j_mute.LogicB - 処理B!!

処理結果:ログファイル

$ cat target/App.log
2012-12-18 14:39:29,461 INFO log4j_mute.LogicA - 処理A!!
2012-12-18 14:39:29,462 INFO log4j_mute.LogicB - 処理B!!
2012-12-18 14:39:29,463 INFO NoConsole.log4j_mute.LogicB - 処理B!!

カテゴリを使ってログ出力方法を変えてるわけです。

MacBookAirでMaven - Settings.xmlはどこに?

なんかMacBookAirには最初からMaven3が入っているので使ってみよー。。。。
MacBookAir(SnowLeopard)にmavenをインストール - matsuyamahirokiの日記

と、したらあれ?Settings.xmlってwindowsの場合は最初からなかったっけ?記憶違い?
ググったら以下回答が、
Where is Maven' settings.xml located on mac os? - Stack Overflow

  1. "/User/%username%/.m2/"に作成する
  2. "/usr/share/maven/conf/"に最初からある

1. + 2. = "/User/%username%/.m2"で"ln -s /usr/share/maven/conf/settings.xml settings.xml"を実行する

ってのが一番キレイかもですね!

NetBeansでtoStringの自動生成

IDEにはsetter/getterや、toStringのOverrideなどを自動生成する機能がある。

今回JavaFXを触るためにnetBeansインスコして、使ってみてたんだけど、この機能が見つからない!!!
Twitterで教えて!って叫んでみたら教えてくれる親切な方が!


netBeansでは Alt + Insert で以下メニューが表示されました。

例えばtoStringの生成はこんなのがポップして、

バーンとぉ! こんなのが生成されます!!

@Override
public String toString() {
    return "Busyo{" + "name_sei=" + name_sei + ", name_na=" + name_na + ", tosotsu=" + tosotsu + ", buryoku=" + buryoku + ", tiryaku=" + tiryaku + ", seiji=" + seiji + ", giri=" + giri + '}';
}

ちゃんと日本語のマニュアルも整備されていたので、じっくり読めばいろいろショートカットキーも覚えると思う。
http://netbeans.org/kb/docs/java/editor-codereference_ja.html#codecompletion
ショートカットキーの一覧/補完省略名なんかの一覧もPDFで見つかった。
http://usersguide.netbeans.org/shortcuts_ja.pdf




eclipseならJavaエディタを右クリックから[ソース]→各機能(以下画像のメニュー) をクリックすると色々とできる。

ちなみにeclipseだとStringの連結だけじゃなく、StringBuffer/StringBuilderでの連結も選べるからこの部分ではeclipseに軍配が上がるかな。
バーンとぉ!

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("Busyo [name_sei=");
    builder.append(name_sei);
    builder.append(", name_na=");
    builder.append(name_na);
    builder.append(", tosotsu=");
    builder.append(tosotsu);
    builder.append(", buryoku=");
    builder.append(buryoku);
    builder.append(", tiryaku=");
    builder.append(tiryaku);
    builder.append(", seiji=");
    builder.append(seiji);
    builder.append(", giri=");
    builder.append(giri);
    builder.append("]");
    return builder.toString();
}


確認環境:
netbeans / 7.2.1
eclise / 3.7 Indigo

JavaFX Scene Builder 1.1(DP) - Controllerクラスを書く場所

GUIで操作できるツール作りたいなーとJavaFX調べてみたら、"JavaFX Scene Builder"なるものがあることを知った。
GUIのデザインを簡単にできるツールですね。

SceneBuilderとEclipseでJavaFX2.1のサンプル作成 - funakkyの日記
ここを参考にやってみよーとしてたら、Controllerクラスを書く場所がない!!

なんと1.1からDocumentというプロパティがなくなっているっぽい。

公式HELPをチラッと眺めてみると、こんな画像を見つけた。
http://docs.oracle.com/javafx/scenebuilder/1/user_guide/img/anchorpane-codepanel.gif

あ、AnchorPaneに書くのね。


AnchorPaneにControllerクラスを書いて、Buttonの"On Action"に"#writeText"メソッドを指定したら、うまく動いた。



JavaFX、簡単ですねー!!

List.jsの使い方

List.jsなるJavascriptライブラリがスゴイ!みたいな記事を見て、ちょっと感動し使ってみることにした。

しかし公式の説明を読んでもピンと来ない。
なぜなら私はhtmlやcssを書くことはできるが、しっかり理解できていなかったからだった。
そんな私がいきなりJqueryを使ったList.jsなど頭に入ってくるわけがない。

ということで、取り敢えず「Javascript 入門」と「Jquery」と「CSS 入門」をググり、なんとなく掴んでから再度List.jsへ挑んだ。
JavascriptCSSJqueryについてはSlideShareなどでまとめている人がいて、かなり理解しやすかった。

ここでは、そんな入門者がList.jsについて理解できるようにList.jsの使い方を書いていく。

今回紹介するList.jsを使ったリスト操作

  1. ソート
  2. 検索
  3. フィルタ
  4. 追加
  5. 編集
  6. 削除

ここで紹介した例は、githubで公開したので、全体をみたい場合はそちらを参照されたし。
clashm45/listjs_example · GitHub

続きを読む

追記 - 独自ライブラリを参照する

[独自ライブラリを参照する]
http://d.hatena.ne.jp/clash_m45/20120620/1340202798
sbtからは何もせずとも参照されるんだけど、コメントして頂いた通りIDEA側はsbtの"gen-idea"を手動で実行しないと参照されない、と。

つまり、独自ライブラリを参照したい場合は、

  1. $PROJECT_DIR$/lib を作成して参照したいライブラリJarを配置する。
  2. コンソールから"sbt gen-idea"を実行する
  3. projectをreloadする。(IDEAがreloadするか聞いてくる)

前提条件:

一応(READMEに書いてあるけど)関連付け方。
$PROJECT_DIR$/project/plugins.sbt(無かったら作る)に、

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.0.0")

を記述する。

※ "clean-idea"とか欲しいかもしれない

独自ライブラリを参照する

2012/06/21追記しました。
追記 - 独自ライブラリを参照する - clash_m45の開発日記

sbtでセントラルリポジトリにないライブラリ(例えばoracle jdbcなど)をクラスパスに入れるのに一番簡単な方法は、アンマネージ依存性でできる。
http://scalajp.github.com/sbt-getting-started-guide-ja/library-dependencies/

できるんだけど、IntelliJ IDEAで見てくれなかった。
なにも設定しなくても見てくれていい気がするんだけどなぁ・・・

[How to add Jar libraries to an IntelliJ Idea SBT Scala project?]
http://stackoverflow.com/questions/3796004/how-to-add-jar-libraries-to-an-intellij-idea-sbt-scala-project

Answer : File - Project structure - Libraries

いや・・・うん、まぁそうなんだけどね・・・

※ちゃんとしたやり方があったら教えて下さい。