static char level_char ( int level )トレースレベル整数をレベル文字に変換する。
static void format_timestamp ( char *buf, int buf_size )現在時刻を “YYYY-MM-DD HH:MM:SS.mmm” (UTC) 形式でバッファへ書き込む。
static int open_file ( trace_file_provider_t *p )ファイルを追記モードで開き current_bytes を初期サイズで初期化する。
成功 0 / 失敗 -1。
static int open_file_truncate ( trace_file_provider_t *p )ローテーション後の新規ファイルを空で作成して開く。 current_bytes は必ず 0 に設定される。
成功 0 / 失敗 -1。
static void close_file ( trace_file_provider_t *p )開いているファイルを閉じる。未開の場合は何もしない (冪等)。
static void rotate_file ( trace_file_provider_t *p )トレースファイルをローテーションする。
ロック保持中から呼ばれる。
リネームに失敗した場合はその世代でカスケードを打ち切り、 呼び出し元をブロックせずに続行する (ベストエフォート)。
trace_file_provider_t *TRACE_FILE_UTIL_API trace_file_provider_init ( const char *path, size_t max_bytes, int generations )ファイルトレースプロバイダを初期化する。
指定されたファイルパスへの書き込みを開始します。
ファイルが存在する場合は追記します。存在しない場合は新規作成します。
max_bytes に 0 を指定した場合は TRACE_FILE_DEFAULT_MAX_BYTES を使用します。
generations に 0 以下を指定した場合は TRACE_FILE_DEFAULT_GENERATIONS を使用します。
成功時: ハンドル。失敗時: NULL。
書き込み後にファイルサイズが max_bytes に達すると、以下の名前でファイルを保持します。
path ... 現在のトレースファイル (新規作成)
path.1 ... 直前の世代
path.2 ... 2 世代前
path.N ... N 世代前 (N = generations)generations 世代を超えた古いファイルは削除されます。
trace_file_provider_t *h = trace_file_provider_init(
"C:\\logs\\myapp.log", 0, 0);int TRACE_FILE_UTIL_API trace_file_provider_write ( trace_file_provider_t *handle, int level, const char *message )ファイルへトレースメッセージを書き込む。
タイムスタンプとトレースレベル文字を付加し 1 行で書き込みます。
書き込み後にファイルサイズが max_bytes に達した場合はローテーションします。
handle または message が NULL の場合は何もせず 0 を返します。
ファイルがロックされている等の I/O 失敗は呼び出し元をブロックせず -1 を返します。
成功 0 / 失敗 -1。
void TRACE_FILE_UTIL_API trace_file_provider_dispose ( trace_file_provider_t *handle )ファイルトレースプロバイダを終了する。
ファイルハンドルを閉じ、ロック / mutex を解放してメモリを解放します。
ハンドルが NULL の場合は何もしません。
#define TRACE_FILE_LINE_BUF 11001 行分のスタックバッファサイズ。
#define FILE_LOCK_TIMEOUT_MS 100ファイル書き込みロック取得のタイムアウト (ミリ秒)。
#define TRACE_FILE_TS_LEN 23タイムスタンプ部分の文字数 (“YYYY-MM-DD HH:MM:SS.mmm” = 23 文字)。
#define TRACE_FILE_SUFFIX_MAX 5ローテーションパスのサフィックス最大長 (“.999\0” = 5 文字)。
#define PATH_MAX 4096#define TRACE_FILE_PATH_MAX PATH_MAXstruct trace_file_provider {
char *path;
size_t max_bytes;
size_t current_bytes;
int generations;
int fd;
pthread_mutex_t mutex;
int mutex_initialized;
int _pad_end;
}ファイルトレースプロバイダハンドル構造体 (内部定義)。
char *path;ヒープ確保済みファイルパス文字列。
size_t max_bytes;ファイル 1 世代あたりの最大バイト数。
size_t current_bytes;現ファイルへの書き込み済みバイト数 (インメモリ追跡)。
int generations;保持する旧世代数。
int fd;ファイルディスクリプタ。-1 = 未開。
pthread_mutex_t mutex;スレッド安全のための mutex。
int mutex_initialized;mutex が初期化済みかどうかのフラグ。
int _pad_end;パディング (構造体サイズを 8 バイト境界に揃える)。