Spring Boot Application でログファイル(spring.log)を出力する
前提
- Spring Boot Application の jarファイル をデプロイしている事。
- 上記1のjarファイルをsystemd を利用して起動している事。
- 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つがあると思っている。
- change
- keyup
- 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 Symbols を svgでダウンロードしてimgタグを利用する。
つまり、Google Material Symbols を
<!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 を無効にする。 本番環境では有効にする。
2-3. spring.flyway.clean-disabled=false
Flywayを使用している場合に記述する。
デフォルトでfalseだが、本番環境で有効にするよう明示するために記述する。
Spring Boot Application の logback が記録する時刻を日本標準時刻にする
結論
application.properties に下記を記述する。
logging.pattern.dateformat=yyyy/MM/dd HH:mm:ss.SSS,Asia/Tokyo