🗞️

Severity と LogLevel

2024/05/20に公開

はじめに

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

https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.1

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

https://logging.apache.org/log4j/2.x/manual/customloglevels.html

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.

https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity

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