
# 日志分析(C SDK)
#### 日志路径
OBS C SDK的日志路径是通过OBS.ini中LogPath字段指定的，默认存放于C SDK动态库所在目录的同级logs目录中。定位问题请查看logs目录下的运行日志：Linux环境为 eSDK-OBS-API-\*-C.run.log，Windows环境为 obs-sdk-c.run.log。
OBS.ini文件应与动态库同一目录（Linux为 libeSDKLogAPI.so，Windows为 eSDKLogAPI.dll）。
也可通过 set_obs_log_path 函数在代码中指定日志路径，详见[配置SDK日志(C SDK)](https://support.huaweicloud.com/sdk-c-devg-obs/obs_20_0204.html)。
#### 日志内容格式
SDK日志格式为：日志时间\|日志级别\|线程号\|日志内容。示例如下：
```
2018-05-15 22:22:54 803| INFO|[140677572568864]|request_perform start
```
#### 日志级别
当系统出现问题需要定位且当前的日志无法满足要求时，可以通过修改日志的级别来获取更多的信息。日志级别从低到高为DEBUG(0) \> INFO(1) \> WARN(2) \> ERROR(3)，低级别包含高级别的所有日志信息。其中DEBUG(0)日志信息最丰富，ERROR(3)日志信息最少。
具体说明如下：
- DEBUG(0)：调试级别，包含所有日志信息，额外打印调试信息。
- INFO(1)：信息级别，包含WARN和ERROR的日志，额外打印OBS接口调用过程和关键信息。
- WARN(2)：告警级别，包含ERROR的日志，额外打印关键事件信息（如curl_global_init初始化失败等）。
- ERROR(3)：错误级别，仅打印异常错误信息。
 
#### 设置方式一：通过OBS.ini配置文件设置
修改与动态库同一目录下的OBS.ini文件，配置日志的大小、个数以及级别（其中\*_Run参数的配置为最常用的配置项）：
```
;Every line must be less than 1024
[LogConfig]
;Log Size: unit=KB, 10MB = 10KB * 1024 = 10240KB
LogSize_Interface=10240
LogSize_Operation=10240
LogSize_Run=10240
;Log Num
LogNum_Interface=10
LogNum_Operation=10
LogNum_Run=10
;Log level: debug = 0,info = 1,warn = 2,error = 3
LogLevel_Interface=0
LogLevel_Operation=0
LogLevel_Run=0
;LogFilePermission
LogFilePermission=0600
[ProductConfig]
;Product Name
sdkname=eSDK-OBS-API-Linux-C
[LogPath]
;Log Path is relative to the path of configuration file
LogPath=../logs
```
表1参数说明 
| 配置项               | 说明                                                         | 示例值                  |
|:---|:---|:---|
| LogSize_\*        | 单个日志文件大小，单位KB                                              | 10240（即10MB）         |
| LogNum_\*         | 日志文件保留个数                                                   | 10                   |
| LogLevel_\*       | 日志级别：0=DEBUG, 1=INFO, 2=WARN, 3=ERROR                      | 0                    |
| LogFilePermission | 日志文件权限（仅Linux）                                             | 0600                 |
| sdkname           | 产品名称，Linux为eSDK-OBS-API-Linux-C，Windows为eSDK-OBS-API-Win-C | eSDK-OBS-API-Linux-C |
| LogPath           | 日志存放路径，相对于OBS.ini文件的相对路径                                   | ../logs              |
   
#### 设置方式二：通过代码设置日志路径
通过 set_obs_log_path 函数在代码中指定日志路径，详见[配置SDK日志(C SDK)](https://support.huaweicloud.com/sdk-c-devg-obs/obs_20_0204.html)。示例：
```
// 设置日志路径（在obs_initialize之前调用），SDK将在该路径下创建OBS.ini和日志文件
obs_status ret_status = set_obs_log_path("/var/log/obs_sdk", false);
if (OBS_STATUS_OK != ret_status)
{
    printf("set_obs_log_path failed(%s).\n", obs_get_status_name(ret_status));
}
ret_status = obs_initialize(OBS_INIT_ALL);
if (OBS_STATUS_OK != ret_status)
{
    printf("obs_initialize failed(%s).\n", obs_get_status_name(ret_status));
    return -1;
}
```
#### Windows下Unicode路径配置
Windows下，如果日志路径或文件路径包含中文字符，可通过 set_file_path_code 函数将文件路径编码设置为Unicode模式（默认为ANSI_CODE）。设置后，以下函数的文件路径参数需传入宽字符（UTF-16）编码的字节序列，参数类型仍为 const char\*，但实际内容为 wchar_t 的字节表示。
函数声明：
```
// 仅Windows可用
void set_file_path_code(file_path_code code);
file_path_code get_file_path_code();
typedef enum {
    ANSI_CODE    = 0,  // 文件路径使用ANSI编码（默认）
    UNICODE_CODE = 1   // 文件路径使用Unicode（UTF-16）编码
} file_path_code;
```
使用方法：
```
// 在obs_initialize之前调用（仅Windows可用）
set_file_path_code(UNICODE_CODE);  // 默认为ANSI_CODE
// 设置后，set_obs_log_path的log_path参数需传入宽字符编码路径
// 例如：将wchar_t路径转换为char*传入
set_obs_log_path((const char *)L"D:\\日志目录", false);
```
设置后，以下函数的本地文件路径参数也受影响：
| 影响函数             | 说明                                                                 |
|:---|:---|
| download_file    | download_file_config 的 downLoad_file、check_point_file 成员需传入宽字符编码路径 |
| upload_file      | upload_file_config 的 upload_file、check_point_file 成员需传入宽字符编码路径     |
| set_obs_log_path | log_path 参数需传入宽字符编码路径                                              |
   
