2017-09-20 2 views
4

일부 텍스트를 공용 로그 형식으로 인쇄하려고합니다.printf() - 잘못된 순서를 인쇄합니다. 개별적으로 인쇄 할 때 작동합니다.

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를 추가 할 때 문제가 시작 보인다. 나는 이유가 없다. 어떤 도움을 주셔서 감사합니다. 나는 문제가 row에서 오는 생각

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)); 
} 
+1

strchr(...)는 데이터 유형이 일치하는지 확신으로 수정? 그렇지 않으면 정의되지 않은 동작이 발생합니다. –

+7

[MCVE] (https://stackoverflow.com/help/mcve) – vasek

+0

디버깅 도움말을 찾는 질문 (이 코드가 작동하지 않는 이유는 무엇입니까?)에는 원하는 문제, 오류 및 필요한 최단 코드가 포함되어야합니다. 질문 자체에서 그것을 재현하는 것. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [mcve]를 만드는 방법 ._ –

답변

7

: 누군가가이는 IP 변수에 문제가 될 수 말했듯이

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. 
} 

: 여기

내가 prinft()를 사용하는 기능입니다 \r 문자가 포함되어 있습니다.

그냥

/* replace all '\r' by 'R' in row */ 
char *p = strchr(row, '\r'); 
while(p) 
{ 
    *p = 'R'; 
    p = strchr(row, '\r'); 
} 
+0

프로그램에서 아무것도 인쇄하지 않을 때 사용합니다. 다른 일을해야합니까? – gel

+0

@alain 수정 한 줄을 쓰려고합니다. – purplepsycho

+0

나는 당신이 정말로 정확하다고 생각하지만 '\ r'을 '\ n'으로 바꿀 것입니다. 의도 한 용도라고 생각합니까? – Girauder

관련 문제