root/logging.c

Revision 429:483423657805, 5.7 KB (checked in by roberto@…, 5 weeks ago)

64 bit fixes [2]

Line 
1#include "uwsgi.h"
2
3#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
4#include <kvm.h>
5#include <sys/user.h>
6#elif defined(__sun__)
7/* Terrible Hack !!! */
8#ifndef _LP64
9#undef _FILE_OFFSET_BITS
10#endif
11#include <procfs.h>
12#define _FILE_OFFSET_BITS 64
13#endif
14
15#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
16#include <sys/sysctl.h>
17#endif
18
19extern struct uwsgi_server uwsgi;
20
21void log_request(struct wsgi_request *wsgi_req) {
22
23        // optimize this (please)
24        char *time_request;
25        time_t microseconds, microseconds2;
26        int rlen;
27        int app_req = -1;
28        char *msg2 = " ";
29        char *via = msg2;
30
31        char mempkt[4096];
32        char logpkt[4096];
33
34        struct iovec logvec[4] ;
35        int logvecpos = 0 ;
36
37#ifdef UWSGI_SENDFILE
38        char *msg1 = " via sendfile() ";
39
40        struct uwsgi_app *wi;
41
42        if (wsgi_req->app_id >= 0) {
43                wi = &uwsgi.wsgi_apps[wsgi_req->app_id];
44                if (wi->requests > 0) {
45                        app_req = wi->requests;
46                }
47        }
48
49        if (wsgi_req->sendfile_fd > -1) {
50                via = msg1;
51        }
52#endif
53
54        time_request = ctime((const time_t *) &wsgi_req->start_of_request.tv_sec);
55        microseconds = wsgi_req->end_of_request.tv_sec * 1000000 + wsgi_req->end_of_request.tv_usec;
56        microseconds2 = wsgi_req->start_of_request.tv_sec * 1000000 + wsgi_req->start_of_request.tv_usec;
57
58        if (uwsgi.vhost) {
59                logvec[logvecpos].iov_base = wsgi_req->host ;
60                logvec[logvecpos].iov_len = wsgi_req->host_len ;
61                logvecpos++;
62
63                logvec[logvecpos].iov_base = " " ;
64                logvec[logvecpos].iov_len = 1 ;
65                logvecpos++;
66        }
67
68        if (uwsgi.shared->options[UWSGI_OPTION_MEMORY_DEBUG] == 1) {
69#ifndef UNBIT
70                rlen = snprintf(mempkt, 4096, "{address space usage: %lld bytes/%lluMB} {rss usage: %llu bytes/%lluMB} ",
71                        (unsigned long long) uwsgi.workers[uwsgi.mywid].vsz_size, (unsigned long long ) uwsgi.workers[uwsgi.mywid].vsz_size / 1024 / 1024,
72                        (unsigned long long) uwsgi.workers[uwsgi.mywid].rss_size, (unsigned long long ) uwsgi.workers[uwsgi.mywid].rss_size / 1024 / 1024);
73#else
74                rlen = snprintf(mempkt, 4096, "{address space usage: %lld bytes/%lluMB} ",
75                        (unsigned long long) uwsgi.workers[uwsgi.mywid].vsz_size, (unsigned long long) uwsgi.workers[uwsgi.mywid].vsz_size / 1024 / 1024);
76#endif
77
78       
79                logvec[logvecpos].iov_base = mempkt ;
80                logvec[logvecpos].iov_len = rlen ;
81                logvecpos++;
82
83
84        }
85
86        rlen = snprintf(logpkt, 4096, "[pid: %d|app: %d|req: %d/%llu] %.*s (%.*s) {%d vars in %d bytes} [%.*s] %.*s %.*s => generated %llu bytes in %ld msecs%s(%.*s %d) %d headers in %d bytes (%d async switches on async core %d)\n",
87                uwsgi.mypid,
88                wsgi_req->app_id,
89                app_req,
90                (unsigned long long ) uwsgi.workers[0].requests,
91                wsgi_req->remote_addr_len, wsgi_req->remote_addr,
92                wsgi_req->remote_user_len, wsgi_req->remote_user,
93                wsgi_req->var_cnt,
94                wsgi_req->uh.pktsize,
95                24, time_request,
96                wsgi_req->method_len, wsgi_req->method,
97                wsgi_req->uri_len, wsgi_req->uri,
98                (unsigned long long) wsgi_req->response_size,
99                (long int) (microseconds - microseconds2) / 1000,
100                via,
101                wsgi_req->protocol_len, wsgi_req->protocol,
102                wsgi_req->status,
103                wsgi_req->header_cnt,
104                wsgi_req->headers_size,
105                wsgi_req->async_switches, wsgi_req->async_id);
106
107        logvec[logvecpos].iov_base = logpkt ;
108        logvec[logvecpos].iov_len = rlen ;
109
110        // do not check for errors
111        rlen = writev(2, logvec, logvecpos+1);
112
113}
114
115void get_memusage() {
116
117#ifdef UNBIT
118        uwsgi.workers[uwsgi.mywid].vsz_size = syscall(356);
119#elif defined(__linux__)
120        FILE *procfile;
121        int i;
122        procfile = fopen("/proc/self/stat", "r");
123        if (procfile) {
124                i = fscanf(procfile, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %llu %lld", (unsigned long long *) &uwsgi.workers[uwsgi.mywid].vsz_size, (unsigned long long *) &uwsgi.workers[uwsgi.mywid].rss_size);
125                if (i != 2) {
126                        uwsgi_log( "warning: invalid record in /proc/self/stat\n");
127                }
128                fclose(procfile);
129        }
130        uwsgi.workers[uwsgi.mywid].rss_size = uwsgi.workers[uwsgi.mywid].rss_size * uwsgi.page_size;
131#elif defined (__sun__)
132        psinfo_t info;
133        int procfd ;
134
135        procfd = open("/proc/self/psinfo", O_RDONLY);
136        if (procfd >= 0) {
137                if ( read(procfd, (char *) &info, sizeof(info)) > 0) {
138                        uwsgi.workers[uwsgi.mywid].rss_size = (uint64_t) info.pr_rssize * 1024 ;
139                        uwsgi.workers[uwsgi.mywid].vsz_size = (uint64_t) info.pr_size * 1024 ;
140                }
141                close(procfd);
142        }
143       
144#elif defined( __APPLE__)
145        /* darwin documentation says that the value are in pages, but they are bytes !!! */
146        struct task_basic_info t_info;
147        mach_msg_type_number_t t_size = sizeof(struct task_basic_info);
148
149        if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) & t_info, &t_size) == KERN_SUCCESS) {
150                uwsgi.workers[uwsgi.mywid].rss_size = t_info.resident_size;
151                uwsgi.workers[uwsgi.mywid].vsz_size = t_info.virtual_size;
152        }
153#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
154        kvm_t *kv;
155        int cnt;
156
157        kv = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
158        if (kv) {
159#if defined(__FreeBSD__) || defined(__DragonFly__)
160
161                struct kinfo_proc *kproc;
162                kproc = kvm_getprocs(kv, KERN_PROC_PID, uwsgi.mypid, &cnt);
163                if (kproc && cnt > 0) {
164                        uwsgi.workers[uwsgi.mywid].vsz_size = kproc->ki_size;
165                        uwsgi.workers[uwsgi.mywid].rss_size = kproc->ki_rssize * uwsgi.page_size;
166                }
167#elif defined(__NetBSD__) || defined(__OpenBSD__)
168                struct kinfo_proc2 *kproc2;
169               
170                kproc2 = kvm_getproc2(kv, KERN_PROC_PID, uwsgi.mypid, sizeof(struct kinfo_proc2), &cnt);
171                if (kproc2 && cnt > 0) {
172#ifdef __OpenBSD__
173                        uwsgi.workers[uwsgi.mywid].vsz_size = (kproc2->p_vm_dsize + kproc2->p_vm_ssize + kproc2->p_vm_tsize) * uwsgi.page_size;
174#else
175                        uwsgi.workers[uwsgi.mywid].vsz_size = kproc2->p_vm_msize * uwsgi.page_size;
176#endif
177                        uwsgi.workers[uwsgi.mywid].rss_size = kproc2->p_vm_rssize * uwsgi.page_size;
178                }
179#endif
180
181                kvm_close(kv);
182        }
183
184#endif
185}
Note: See TracBrowser for help on using the browser.