Merge lp:~registry/mysql-proxy/millisec_timestamp into lp:mysql-proxy

Proposed by Michael Schuster
Status: Merged
Merged at revision: 1104
Proposed branch: lp:~registry/mysql-proxy/millisec_timestamp
Merge into: lp:mysql-proxy
Diff against target: 134 lines (+64/-4)
3 files modified
src/chassis-log.c (+21/-4)
src/chassis-log.h (+8/-0)
tests/unit/check_chassis_log.c (+35/-0)
To merge this branch: bzr merge lp:~registry/mysql-proxy/millisec_timestamp
Reviewer Review Type Date Requested Status
Registry Administrators Pending
Review via email: mp+28636@code.launchpad.net

Description of the change

Bug #52063 Need millisec timestamps in src/chassis_log.c

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/chassis-log.c'
2--- src/chassis-log.c 2010-06-04 16:44:54 +0000
3+++ src/chassis-log.c 2010-06-28 13:09:28 +0000
4@@ -93,6 +93,7 @@
5
6 log->log_file_fd = -1;
7 log->log_ts_str = g_string_sized_new(sizeof("2004-01-01T00:00:00.000Z"));
8+ log->log_ts_resolution = CHASSIS_RESOLUTION_DEFAULT;
9 log->min_lvl = G_LOG_LEVEL_CRITICAL;
10
11 log->last_msg = g_string_new(NULL);
12@@ -173,18 +174,34 @@
13
14 static int chassis_log_update_timestamp(chassis_log *log) {
15 struct tm *tm;
16- time_t t;
17+ struct timeval tv;
18 GString *s = log->log_ts_str;
19
20- t = time(NULL);
21-
22- tm = localtime(&(t));
23+ gettimeofday(&tv, NULL);
24+ tm = localtime(&(tv.tv_sec));
25
26 s->len = strftime(s->str, s->allocated_len, "%Y-%m-%d %H:%M:%S", tm);
27+ if (log->log_ts_resolution == CHASSIS_RESOLUTION_MS)
28+ g_string_append_printf(s, ".%.3d", (int) tv.tv_usec/1000);
29
30 return 0;
31 }
32
33+void chassis_set_logtimestamp_resolution(chassis_log *log, int res) {
34+ if (log == NULL)
35+ return;
36+ /* only set resolution to valid values, ignore otherwise */
37+ if (res == CHASSIS_RESOLUTION_SEC || res == CHASSIS_RESOLUTION_MS)
38+ log->log_ts_resolution = res;
39+}
40+
41+int chassis_get_logtimestamp_resolution(chassis_log *log) {
42+ if (log == NULL)
43+ return -1;
44+ return log->log_ts_resolution;
45+}
46+
47+
48 static int chassis_log_write(chassis_log *log, int log_level, GString *str) {
49 if (-1 != log->log_file_fd) {
50 /* prepend a timestamp */
51
52=== modified file 'src/chassis-log.h'
53--- src/chassis-log.h 2010-06-04 16:44:54 +0000
54+++ src/chassis-log.h 2010-06-28 13:09:28 +0000
55@@ -29,6 +29,11 @@
56
57 #include "chassis-exports.h"
58
59+#define CHASSIS_RESOLUTION_SEC 0x0
60+#define CHASSIS_RESOLUTION_MS 0x1
61+
62+#define CHASSIS_RESOLUTION_DEFAULT CHASSIS_RESOLUTION_SEC
63+
64 /** @addtogroup chassis */
65 /*@{*/
66 typedef struct {
67@@ -46,6 +51,7 @@
68 gboolean rotate_logs;
69
70 GString *log_ts_str;
71+ gint log_ts_resolution; /*<< timestamp resolution (sec, ms) */
72
73 GString *last_msg;
74 time_t last_msg_ts;
75@@ -62,6 +68,8 @@
76 CHASSIS_API void chassis_log_set_logrotate(chassis_log *log);
77 CHASSIS_API int chassis_log_set_event_log(chassis_log *log, const char *app_name);
78 CHASSIS_API const char *chassis_log_skip_topsrcdir(const char *message);
79+CHASSIS_API void chassis_set_logtimestamp_resolution(chassis_log *log, int res);
80+CHASSIS_API int chassis_get_logtimestamp_resolution(chassis_log *log);
81 /*@}*/
82
83 #endif
84
85=== modified file 'tests/unit/check_chassis_log.c'
86--- tests/unit/check_chassis_log.c 2010-04-06 14:26:51 +0000
87+++ tests/unit/check_chassis_log.c 2010-06-28 13:09:28 +0000
88@@ -59,11 +59,46 @@
89 }
90 /*@}*/
91
92+/**
93+ * @test Test log timestamp resolution
94+ */
95+START_TEST(test_log_timestamp) {
96+ chassis_log *l;
97+ GLogFunc old_log_func;
98+
99+ l = chassis_log_new();
100+ chassis_set_logtimestamp_resolution(l, CHASSIS_RESOLUTION_SEC);
101+
102+ g_log_set_always_fatal(G_LOG_FATAL_MASK);
103+
104+ old_log_func = g_log_set_default_handler(chassis_log_func, l);
105+
106+ g_critical("this message has a second-resolution timestamp");
107+ chassis_set_logtimestamp_resolution(l, CHASSIS_RESOLUTION_MS);
108+ g_critical("this message has a millisecond-resolution timestamp");
109+
110+ g_assert_cmpint(CHASSIS_RESOLUTION_MS, ==, chassis_get_logtimestamp_resolution(l));
111+ /* try an illegal value, we should see no change */
112+ chassis_set_logtimestamp_resolution(l, -1);
113+ g_assert_cmpint(CHASSIS_RESOLUTION_MS, ==, chassis_get_logtimestamp_resolution(l));
114+ /* tset back top _SEC resolution */
115+ chassis_set_logtimestamp_resolution(l, CHASSIS_RESOLUTION_SEC);
116+ g_assert_cmpint(CHASSIS_RESOLUTION_SEC, ==, chassis_get_logtimestamp_resolution(l));
117+
118+
119+
120+ g_log_set_default_handler(old_log_func, NULL);
121+
122+ chassis_log_free(l);
123+}
124+/*@}*/
125+
126 int main(int argc, char **argv) {
127 g_test_init(&argc, &argv, NULL);
128 g_test_bug_base("http://bugs.mysql.com/");
129
130 g_test_add_func("/core/log_compress", test_log_compress);
131+ g_test_add_func("/core/log_timestamp", test_log_timestamp);
132
133 return g_test_run();
134 }

Subscribers

People subscribed via source and target branches