ぺんぎんノート

momoiro_tjのノート (旧:システムオペレータの週末)

SDLログハンドリング

本記事は、SDL(Simple DirectMedia Layer)のログ出力機能の仕様について調べた結果である。

SDLのバージョンは記事執筆時の最新である2.0.20を対象とする。

また、Windows 10でVisual Studio Community 2017で試した。(すべてをテストしたわけではない)

SDLログ出力機能

SDLログ出力は、priority x categoryの組み合わせでログ出力を制御できる。
categoryとpriorityでログ出力を制御できることのメリットは、以下の2点であると考えられる。

  1. ログ出力を細かく分類して出力するか選択することができる
  2. priorityはソフト動作中も変更できるため動的にログ出力を変更することができる
priority

priorityはログ出力のレベルである。 ソースコードに埋め込むログはpriority毎に関数が用意されている。

SDL_LogPriority ログ出力関数
SDL_LOG_PRIORITY_VERBOSE SDL_LogVerbose(int category, format, ...)
SDL_LOG_PRIORITY_DEBUG SDL_LogDebug(int category, format, ...)
SDL_LOG_PRIORITY_INFO SDL_LogInfo(int category, format, ...)
SDL_LOG_PRIORITY_WARN SDL_LogWarn(category, format, ...)
SDL_LOG_PRIORITY_ERROR SDL_LogError(category, format, ...)
SDL_LOG_PRIORITY_CRITICAL SDL_LogCritical(category, format, ...)
category

categoryはログ出力の種類である。SDL_Log***()関数の第一引数でpriority毎にcategoryを設定できる。ログは以下のフォーマットでログ出力される。
(出力先はVisual Studioであればデバッグ出力(出力ウィンドウ)に出力される)

category : message

categoryには、次の種類がある。それぞれデフォルトpriorityが設定されている。

SDL_LOG_CATEGORY デフォルトpriority 説明
SDL_LOG_CATEGORY_APPLICATION SDL_LOG_PRIORITY_INFO application log
SDL_LOG_CATEGORY_ERROR SDL_LOG_PRIORITY_CRITICAL error log
SDL_LOG_CATEGORY_SYSTEM SDL_LOG_PRIORITY_CRITICAL system log
SDL_LOG_CATEGORY_AUDIO SDL_LOG_PRIORITY_CRITICAL audio log
SDL_LOG_CATEGORY_VIDEO SDL_LOG_PRIORITY_CRITICAL video log
SDL_LOG_CATEGORY_RENDER SDL_LOG_PRIORITY_CRITICAL render log
SDL_LOG_CATEGORY_INPUT SDL_LOG_PRIORITY_CRITICAL input log
SDL_LOG_CATEGORY_TEST SDL_LOG_PRIORITY_CRITICAL test log
SDL_LOG_CATEGORY_RESERVED SDL_LOG_PRIORITY_CRITICAL SDL_Libraryの予約領域
SDL_LOG_CATEGORY_CUSTOM SDL_LOG_PRIORITY_CRITICAL アプリケーション用に予約されたログ出力 (アプリケーション側のログ出力機能があればそれに合わせて使用する)
SDL_LOG_CATEGORY_ASSERT SDL_LOG_PRIORITY_WARN assert log
SDL_LOG_CATEGORY_TEST SDL_LOG_PRIORITY_VERBOSE verbose log

出力するログ出力を制御

出力するpriorityとcategoryの組み合わせは以下の関数で設定する。categoryとpriorityの組み合わせが一致したログのみが出力される。

void SDL_LogSetPriority(int category,
                        SDL_LogPriority priority);

例えば、

SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR);    //(1) priority = errorにセット

SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "this is information");    //(2) priority = information
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "this is error");    //(3) priority = error

(1)では、category = applicationにpriority = errorを設定している。
(2)(3)の2つのログ出力をソースコード中に埋め込んでいるとする。
どちらもcategory=applicationであるが、priorityが異なる。

このとき、
(2) : ログ出力されない
(3) : ログ出力される
となる。

(1)に対してSDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO)を呼び出し、priority = informationにセットすると、逆に
(2) : ログ出力される
(3) : ログ出力されない
となる。
ソフト起動中にもpriorityは設定しなおせるため、ソフト起動中もログ出力を変更することができる。

便利な関数

関数 説明
SDL_LogSetAllPriority(SDL_LogPriority priority) すべてのcategoryに一括で同じpriorityを設定する
SDL_LogResetPriorities(void) すべてのcategoryのpriorityをデフォルトに戻す
SDL_LogGetPriority(int category) categoryに設定されているpriorityを取得する
SDL_Log(format, ...) categoryとpriorityを気にせずログ出力をする場合に使う。SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, fmt, ...)と同じである