File: accesslog.cpp

package info (click to toggle)
cubemap 1.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 380 kB
  • ctags: 398
  • sloc: cpp: 3,895; sh: 114; perl: 86; makefile: 61
file content (82 lines) | stat: -rw-r--r-- 1,670 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <string>
#include <vector>

#include "accesslog.h"
#include "client.h"
#include "log.h"
#include "mutexlock.h"

using namespace std;

AccessLogThread::AccessLogThread()
{
	pthread_mutex_init(&mutex, NULL);
}

AccessLogThread::AccessLogThread(const string &filename)
	: filename(filename) {
	pthread_mutex_init(&mutex, NULL);
}

void AccessLogThread::write(const ClientStats& client)
{
	{
		MutexLock lock(&mutex);
		pending_writes.push_back(client);
	}
	wakeup();
}

void AccessLogThread::do_work()
{
	// Open the file.
	if (filename.empty()) {
		logfp = NULL;
	} else {
		logfp = fopen(filename.c_str(), "a+");
		if (logfp == NULL) {
			log_perror(filename.c_str());
			// Continue as before.
		}
	}

	while (!should_stop()) {
		// Empty the queue.
		vector<ClientStats> writes;
		{
			MutexLock lock(&mutex);
			swap(pending_writes, writes);
		}

		if (logfp != NULL) {
			// Do the actual writes.
			time_t now = time(NULL);
			for (size_t i = 0; i < writes.size(); ++i) {
				fprintf(logfp, "%llu %s %s %d %llu %llu %llu\n",
					(long long unsigned)(writes[i].connect_time),
					writes[i].remote_addr.c_str(),
					writes[i].url.c_str(),
					int(now - writes[i].connect_time),
					(long long unsigned)(writes[i].bytes_sent),
					(long long unsigned)(writes[i].bytes_lost),
					(long long unsigned)(writes[i].num_loss_events));
			}
			fflush(logfp);
		}

		// Wait until we are being woken up, either to quit or because
		// there is material in pending_writes.
		wait_for_wakeup(NULL);
	}

	if (logfp != NULL) {	
		if (fclose(logfp) == EOF) {
			log_perror("fclose");
		}
	}

	logfp = NULL;
}