作記録

記憶代わり

Spring Boot Application でログファイル(spring.log)を出力する

前提

  1. Spring Boot Application の jarファイル をデプロイしている事。
  2. 上記1のjarファイルをsystemd を利用して起動している事。
  3. OSのuserはroot以外のuserを利用している事。

1. /var/log 配下に対象アプリケーション用のディレクトリを作成する

本番環境の /var/log 配下に作成する。
コマンドは下記の通り。
*****は、アプリケーションの名前。

$ sudo mkdir /var/log/*****

2. jar の引数で logging.file.path を指定する

Spring Boot を利用している場合、ログファイルを出力するようにする為には application.properties に logging.file.path を記載すれば良い。
以下、参考

systemdを利用するので、 jar の実行時に引数としてapplication.propertiesを入力する。

下記は、例である。
%%%は、アプリケーションを実行するOSのuserの名前。 *****は、アプリケーションの名前。

$ cd /etc/systemd/system

$ sudo vi *****.service

↓出力結果

User=%%%
ExecStart=/var/*****/*****-0.0.1-SNAPSHOT.jar \
--logging.file.path=/var/log/***** \
...

3. 上記で作成したディレクトリの所有権を変更する

%%%は、上記2の.serviceのUser名。
は、上記で作成したアプリケーションの名前のディレクトリ。

$ sudo chown %%% /var/log/*****

以下、参考

JavaScriptのイベント change, keyup, input について

入力するフォームのバリデーションを実装する際に、バリデーションの検証をするタイミングには大きく分けて下記の3つがあると思っている。

  1. change
  2. keyup
  3. input

JavaScript コード例

const input = document.querySelector('#name');
const button = document.querySelector('#button');
const validate = () => {
    // 検証の結果として正しい場合はtrue, 正しくない場合はfalseを返す。
}

// 1. change
input.addEventListener('change', () => {
    button.disabled = ! validate();
});


// 2. keyup
input.addEventListener('keyup', () => {
    button.disabled = ! validate();
});


// 3. input
input.addEventListener('input', () => {
    button.disabled = ! validate();
});

1. 結論

1-1. change

inputのvalueが変更されて、inputのフォーカスが外れたタイミングで発火する。

1-2. keyup

inputに入力されて、キーを離したタイミングで発火する。
ただし、スマートフォンでコピペした後にスマートフォンの完了ボタンを押さないと発火しない。フォーカスが外れても発火しない。

1-3. input

inputに入力したタイミングで発火する。

flex を使うと Safari で右に謎の空間が生まれる問題と解決策

結論

下記のように (1) Google Material Symbols を head タグで読み込み、 (2) Google Material Symbols を span タグで配置したものを (3) flex で並べると Safari でのみ右に謎の空間が生まれる模様。

<!DOCTYPE html>
<html lang="ja">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          
          <!-- (1) Google Material Symbols を読み込む -->
          <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
    </head>

    <body>
          <!-- (3) flex で並べる -->        
          <header style="display: flex; justify-content: space-between;">
               <div>Title</div>
               
               <!-- (2) Google Material Symbols を span タグで配置する -->
               <span class="material-symbols-outlined">account_circle</span>
          </header>
    </body>
</html>

解決策

下記の通り、(4) Google Material Symbolssvgでダウンロードしてimgタグを利用する。
つまり、Google Material Symbols を タグで読み込み、 span タグで配置する方法をやめる。

<!DOCTYPE html>
<html lang="ja">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>

    <body>
          <header style="display: flex; justify-content: space-between;">
               <div>Title</div>
               
               <!-- (4) Google Material Symbols を span タグで配置する -->
               <img src=/image/icon/account_circle.svg>
          </header>
    </body>
</html>

備考

developerツールを利用しても、上記の謎の空間が生まれない。

Spring Boot Application の application.properties にとりあえず記述しておくと良さそうなもの

1. 結論

# 2-1
logging.pattern.dateformat=yyyy/MM/dd HH:mm:ss.SSS,Asia/Tokyo

# 2-2
spring.thymeleaf.cache=false

# 2-3
spring.flyway.clean-disabled=false

2. 説明

2-1. logging.pattern.dateformat=yyyy/MM/dd HH:mm:ss.SSS,Asia/Tokyo

Spring Boot Application の logback が記録する時刻を日本標準時刻にする。

以下、参考 - https://jtnsaku.hatenablog.com/entry/2022/08/27/215629 - https://spring.pleiades.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.core.logging.pattern.dateformat

2-2. spring.thymeleaf.cache=false

ローカル環境でcacheが有効だと開発しづらいので Thymeleaf の cache を無効にする。 本番環境では有効にする。

以下、参考 - https://spring.pleiades.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.templating.spring.thymeleaf.cache

2-3. spring.flyway.clean-disabled=false

Flywayを使用している場合に記述する。
デフォルトでfalseだが、本番環境で有効にするよう明示するために記述する。

以下、参考 - https://spring.pleiades.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.data-migration.spring.flyway.clean-disabled

Spring Boot Application の logback が記録する時刻を日本標準時刻にする

結論

application.properties に下記を記述する。

logging.pattern.dateformat=yyyy/MM/dd HH:mm:ss.SSS,Asia/Tokyo

参考

https://spring.pleiades.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.core.logging.pattern.dateformat