Severity と LogLevel
はじめに
tokadev です。札幌からリモートで業務しています。
最近は気温が上がってきた影響か寝付きが良くない日が増えてきたので睡眠記録アプリを活用するようになりました。自分の睡眠周期のログなど普段あまり意識しない情報を見られるので新鮮です。
業務で GCP を利用していることもあり最近は CloudRun に触れる機会が増えているので、その関連でロギングについて調べたことをまとめました。
Severity
ログエントリの深刻度の指標。該当のインシデントまたはイベントがシステムに与える影響の度合いを示す。
Syslog, Log4j, の仕様は以下の通り。
Syslog SeverityLevles
| ENumericalCode | Severity |
|---|---|
| E0 | Emergency: system is unusable |
| E1 | Alert: action must be taken immediately |
| E2 | Critical: critical conditions |
| E3 | Error: error conditions |
| E4 | Warning: warning conditions |
| E5 | Notice: normal but significant condition |
| E6 | Informational: informational messages |
| E7 | Debug: debug-level messages |
Log4j (Standard log levels built-in to Log4J)
| Standard Level | intLevel |
|---|---|
| OFF | 0 |
| FATAL | 100 |
| ERROR | 200 |
| WARN | 300 |
| INFO | 400 |
| DEBUG | 500 |
| TRACE | 600 |
| ALL | Integer.MAX_VALUE |
CloudLogging
参考に CloudLogging LogSeverity も並べておきます。
| Enums | |
|---|---|
| DEFAULT | (0) The log entry has no assigned severity level. |
| DEBUG | (100) Debug or trace information. |
| INFO | (200) Routine information, such as ongoing status or performance. |
| NOTICE | (300) Normal but significant events, such as start up, shut down, or a configuration change. |
| WARNING | (400) Warning events might cause problems. |
| ERROR | (500) Error events are likely to cause problems. |
| CRITICAL | (600) Critical events cause more severe problems or outages. |
| ALERT | (700) A person must take an action immediately. |
| EMERGENCY | (800) One or more systems are unusable. |
LogLevel
出力する情報の粒度・詳細度を設定するもので、設定したログレベルと同じか上位の情報が出力されます。ログ出力の閾値。
CloudRun でのロギング
ついでにロギングも試してみます。
CloudRun 上で Console API (console.log()など) で出力すると、そのままリクエストログに出力されます。この場合 Severity は INFO で出力されます。
Severity 制御してログ出力を確認したいので、公式ライブラリのgoogle-cloud/logging を使います。
コードサンプル
公式のサンプルを踏襲したサンプル。
import { Logging } from '@google-cloud/logging';
const projectId = 'cloud-run-sample';
const logName = 'logging-sample';
const logging = new Logging({projectId});
const log = logging.log(new Logging({projectId}));
const Log = async (
severity: Severity,
msg: string,
) => {
const metadata = {
resource: { type: 'global' },
severity: severity,
};
await log.write(log.entry( metadata, msg ));
};

出力結果。 severity が WARNING で出力できていますね。
{
insertId: "..........6Ayeg1ZVWB9NvbSoejCsfr"
logName: "projects/cloud-run-sample/logs/logging-sample"
receiveTimestamp: "2024-05-17T07:27:38.625702861Z"
resource: {
labels: {
project_id: "cloud-run-sample"
}
type: "global"
}
severity: "WARNING"
textPayload: "[{"id":"1","name":"fizz"},{"id":"2","name":"buzz"}]"
timestamp: "2024-05-17T07:27:38.362999916Z"
}
おわりに
Severity と LogLevel について知っていた知識ではあるものの普段はあまり違いを意識していなかったので勉強になりました。
あとは CloudRun 上でのロギングを構造化ログに対応させたり、throw 時に出力させる情報を精査して調査コストを下げるようにしたいので、時間を見つけて
winstonとかbunyanとか他のロガーパッケージとの比較もやりたいのでどこかのタイミングで試したいところです。
Discussion