Document of c-modernization-kit (porter) 1.0.0

Loading...
Searching...
No Matches
potrLog.c
Go to the documentation of this file.
1
27
28#include <stdarg.h>
29#include <stdio.h>
30#include <string.h>
31
32#include <trace-util.h>
33
34#include <porter_const.h>
35#include <porter.h>
36
37#include "potrLog.h"
38
39/* ── グローバルロガー状態 ──────────────────────────────────────────────── */
40
42 static trace_provider_t *s_trace = NULL;
43
44/* ── ユーティリティ ────────────────────────────────────────────────────── */
45
53 static const char *log_basename(const char *path)
54{
55 const char *p = path;
56 const char *last = path;
57
58 while (*p != '\0')
59 {
60 if (*p == '/' || *p == '\\')
61 {
62 last = p + 1;
63 }
64 p++;
65 }
66 return last;
67}
68
69/* ── 公開 API ─────────────────────────────────────────────────────────── */
70
71/* doxygen コメントは porter.h に記載 */
72 POTR_EXPORT int POTR_API potrLogConfig(PotrLogLevel level,
73 const char *log_file,
74 int console)
75{
76 enum trace_level trc_level;
77
78 /* level の範囲チェック。PotrLogLevel と enum trace_level は値が一致するため直接キャストする。 */
79 if ((int)level < 0 || (int)level > (int)POTR_TRACE_NONE)
80 {
81 return POTR_ERROR;
82 }
83 trc_level = (enum trace_level)(int)level;
84
85 /* 初回呼び出し: トレースプロバイダを初期化する。 */
86 if (s_trace == NULL)
87 {
88 s_trace = trace_init();
89 if (s_trace == NULL)
90 {
91 return POTR_ERROR;
92 }
93 trace_modify_name(s_trace, "porter", 0);
94 }
95 else
96 {
97 /* stopped 状態に遷移させる (冪等)。 */
98 trace_stop(s_trace);
99 }
100
101 /* OS トレース (syslog / ETW) のしきい値レベルを設定する。 */
102 trace_modify_ostrc(s_trace, trc_level);
103
104 /* ファイルトレースを設定する。
105 * log_file が NULL または空文字列の場合は path=NULL を渡してファイルトレースを無効化する。
106 * max_bytes=0, generations=0 で既定値 (10 MB / 5 世代) を使用する。 */
107 if (trace_modify_filetrc(s_trace,
108 (log_file != NULL && log_file[0] != '\0') ? log_file : NULL,
109 trc_level, 0, 0) != 0)
110 {
111 return POTR_ERROR;
112 }
113
114 /* stderr: console フラグに応じて trace-util のスレッショルドを設定する。
115 * console != 0 の場合は trc_level 以上を出力、0 の場合は完全に抑止する。 */
116 trace_modify_stderrtrc(s_trace, console ? trc_level : TRACE_LV_NONE);
117
118 /* POTR_TRACE_NONE でない場合のみ出力を開始する。 */
119 if (level != POTR_TRACE_NONE)
120 {
121 trace_start(s_trace);
122 }
123
124 return POTR_SUCCESS;
125}
126
127/* doxygen コメントは potrLog.h に記載 */
128 void potr_log_write(PotrLogLevel level, const char *file, int line,
129 const char *fmt, ...)
130{
131 char msg[512];
132 va_list ap;
133 enum trace_level min_lv;
134 enum trace_level lv;
135
136 if (s_trace == NULL)
137 {
138 return;
139 }
140
141 /* 3 出力先のうち最も緩いスレッショルドより重大度が低ければ早期リターンする。
142 * (数値が大きい = 重大度が低い)
143 * trace_writef 内部でも同等のチェックが行われるが、vsnprintf の実行を
144 * 省くためにここで確認する。 */
145 min_lv = trace_get_ostrc(s_trace);
146 lv = trace_get_filetrc(s_trace);
147 if ((int)lv < (int)min_lv) { min_lv = lv; }
148 lv = trace_get_stderrtrc(s_trace);
149 if ((int)lv < (int)min_lv) { min_lv = lv; }
150 if ((int)level > (int)min_lv || (int)min_lv >= (int)TRACE_LV_NONE)
151 {
152 return;
153 }
154
155 /* メッセージをフォーマット */
156 va_start(ap, fmt);
157 (void)vsnprintf(msg, sizeof(msg), fmt, ap);
158 va_end(ap);
159
160 /* trace-util 経由で OS (syslog / ETW)、ファイル、stderr に出力する。
161 * trace_writef は内部でスレッドセーフのため、ロック不要。
162 * PotrLogLevel と enum trace_level は値が一致するため直接キャストする。
163 * メッセージに [file:line] を含めてソース位置を記録する。 */
164 (void)trace_writef(s_trace, (enum trace_level)(int)level,
165 "[%s:%d] %s",
166 log_basename(file), line, msg);
167}
POTR_SUCCESS
#define POTR_SUCCESS
成功の戻り値を表す定数。
Definition porter_const.h:30
POTR_ERROR
#define POTR_ERROR
失敗の戻り値を表す定数。
Definition porter_const.h:31
porter.h
通信ライブラリ (動的リンク用) のヘッダーファイル。
POTR_API
#define POTR_API
呼び出し規約マクロ。
Definition porter.h:46
POTR_EXPORT
#define POTR_EXPORT
DLL エクスポート/インポート制御マクロ。
Definition porter.h:37
porter_const.h
通信ライブラリの定数ファイル。
PotrLogLevel
PotrLogLevel
ログレベル。
Definition porter_type.h:333
POTR_TRACE_NONE
@ POTR_TRACE_NONE
ログ出力無効。TRACE_LV_NONE (5) と同値。
Definition porter_type.h:339
potrLogConfig
POTR_EXPORT int POTR_API potrLogConfig(PotrLogLevel level, const char *log_file, int console)
ロガーを設定します。
Definition potrLog.c:72
potr_log_write
void potr_log_write(PotrLogLevel level, const char *file, int line, const char *fmt,...)
ログメッセージを書き込みます (内部関数)。
Definition potrLog.c:128
s_trace
static trace_provider_t * s_trace
トレースプロバイダハンドル。trace_init() で一度だけ初期化する。
Definition potrLog.c:42
log_basename
static const char * log_basename(const char *path)
パスの末尾ファイル名部分を返す。
Definition potrLog.c:53
potrLog.h
porter 内部ログマクロ定義ヘッダー。