我正在尝试以常见的日志格式打印一些文本。
printf("%s - - [%s] %s %d %zu\n", ip, _time, row, statuscode, size);
问题是订单混乱了。输出是:
200 1511 - - [20/Sep/2017:13:07:32 +0200] GET / HTTP/1.1
我认为(1511
)正在打印ip
。不知道为什么。
当我这样打印时:
printf("1. %s\n", ip);
printf("2. %s\n", _time);
printf("3. %s\n", row);
printf("4. %d\n", statuscode);
printf("5. %zu\n", size);
它的工作方式与预期相符:
1. 127.0.0.1
2. 20/Sep/2017:13:11:24 +0200
3. GET / HTTP/1.1
4. 200
5. 151
当我因某种原因添加statuscode
时似乎问题就出现了。我不知道为什么。任何帮助表示赞赏。
这是我使用prinft()的函数:
static void handlelogging(char* method, struct sockaddr_storage client_addr, size_t size, char* row, int statuscode) {
char* ip;
char _time[80];
struct tm *info;
time_t rawtime;
time(&rawtime);
info = localtime(&rawtime);
strftime(_time, 80,"%d/%b/%Y:%H:%M:%S %z", info)
ip = getip(client_addr);
//Print goes here, see above.
}
有人说这可能是ip变量的问题:
static char* getip(struct sockaddr_storage client_addr) {
char ipstr[20];
struct sockaddr_in *s;
s = (struct sockaddr_in *) &client_addr;
/**
* Converts network address (s) in the IPV_4 family into a string.
*/
return strdup(inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr));
}
答案 0 :(得分:7)
我认为问题来自row
,其中包含\r
字符。
只需使用strchr(...)
/* replace all '\r' by 'R' in row */
char *p = strchr(row, '\r');
while(p)
{
*p = 'R';
p = strchr(row, '\r');
}