January 8, 2018

Tanya Part3: デプロイとか

Spring Bootの勉強プロジェクトTanya。

今回、学ぶのは……

  • ロギング
  • プロファイル
  • メッセージ(i18n)
  • Jar化してデプロイ
  • 豆知識
    • プロパティファイル内で日本語を使う

ロギング

  • Spring Bootは、デフォルトでLogbackを使う
  • ログを出す
  • ログのコンフィグ
    • ログレベル
    • ログのフォーマット
    • ログの出力先
      • コンソール
      • ファイル

ログを出す

  • Loggerオブジェクトが必要
    • 自力で生成するか
    • SpringにDIしてもらう
AppConfig.java
@Bean
public Logger newLogger(InjectionPoint ip) {
  return LoggerFactory.getLogger(ip.getMember().getDeclaringClass());
}
Hoge.java
@Autowired
private Logger logger;


  ...
  logger.debug("Yeah!");
  logger.error("OMG!! {}", ex.getMessage());
  ...

ログレベルの制御

application.properties
logging.level.root=INFO
logging.level.org.springframework=WARN
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.jp.dip.gpsoft=DEBUG
  • rootがデフォのレベル
  • その他は、パッケージごとにチューン
  • ERROR, WARN, INFO, DEBUG, TRACE, ALL, OFF

ログフォーマットの制御

  • コンソールはlogging.pattern.console
  • ファイルはlogging.pattern.file
  • https://logback.qos.ch/manual/layouts_ja.html
サンプル
logging.pattern.console=%date{HH:mm:ss} %-5level[%4line]%-30logger{30} - %message%n

出力先の制御

  • logging.pattern.consoleに空を指定するとコンソールを抑止
  • ファイル名か、ファイル置き場を指定するとファイルに出力
    • logging.file ...このファイルへ出力
    • logging.path ...このディレクトリの下のspring.logへ出力
サンプル
logging.path=/var/log/tanya
logging.pattern.console=

プロパティファイル

  • アプリのコンフィグ用ファイル
    • application.properties
    • @PropertySource(value = {"classpath:hoge.properties"})
  • プロパティ値を調べる
    • @Valueでフィールドへインジェクト
    • Environment#getProperty()

プロパティファイル内で日本語を使う

  • プロパティファイル用のエディタがいろいろある
    • Eclipse標準のやつ
    • Springプラグインが提供してるやつ
    • などなど
  • プロパティファイル内で日本語を使うならUnicodeエスケープが必要
    • 「プロパティエディタ」プラグインを使用
      • http://propedit.sourceforge.jp/eclipse/updates/
      • 自動補完が効かなくなってしまうのが難点

プロファイル

  • プロファイルに応じたプロパティの定義
  • 複数のプロファイルの中から、任意のものをアクティブ化する
  • アクティブなプロファイルに応じて、プロパティファイルが自動的に切り替わる
    • application.propertiesは常に有効
    • プロファイルhogeがアクティブなら、application-hoge.propertiesも有効
  • プロファイルのアクティブ化
    • spring.profiles.activeにカンマ区切りで列挙
    • EclipseのRun Configurationに指定
  • アクティブなプロファイルを調べる
    • Environment#getActiveProfiles()

メッセージ/i18n

  • 文言をプロパティファイルへ外出し
    • messages.properties
  • ロケールに応じて、プロパティファイルを切り替え(i18n)
    • messages_ja.properties
  • MessageSource#getMessage()で取得

シンプルな多言語対応(i18n)なら、messages.propertiesは英語用とし、プラスαで日本語用を作ればいい。ブラウザが指定するロケールとマッチするメッセージファイルが無い場合

  • [A]実行環境の言語設定(LANG環境変数かな?)にフォールバックする
  • [B]messages.profilesを使う

のどちらかになる。これを制御するのが、spring.messages.fallback-to-system-locale

Jar化

  • Mavenを使う
  • Mavenはプロジェクトに内蔵されてる
    • mvnwスクリプト
    • mvnw.cmd(Windows用?)
    • .mvnディレクトリ
  • cleanして、packageするだけ
  • targetの下にJarファイルが生成される
$ ./mvnw clean package

Jarで起動

$ java -jar target/tanya-0.0.1-SNAPSHOT.jar

プロパティを指定することも可能。

$ java -jar target/tanya-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod,pg --server.port=80
Tags: tanya java spring