1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_
6 #define THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_
12 #include "base/format_macros.h"
13 #include "base/strings/string_util.h"
14 #include "base/time/time.h"
15 #include "third_party/leveldatabase/src/include/leveldb/env.h"
19 class ChromiumLogger
: public Logger
{
21 explicit ChromiumLogger(FILE* f
) : file_(f
) {}
22 virtual ~ChromiumLogger() {
25 virtual void Logv(const char* format
, va_list ap
) {
26 const base::PlatformThreadId thread_id
=
27 ::base::PlatformThread::CurrentId();
29 // We try twice: the first time with a fixed-size stack allocated buffer,
30 // and the second time with a much larger dynamically allocated buffer.
32 for (int iter
= 0; iter
< 2; iter
++) {
36 bufsize
= sizeof(buffer
);
40 base
= new char[bufsize
];
43 char* limit
= base
+ bufsize
;
45 ::base::Time::Exploded t
;
46 ::base::Time::Now().LocalExplode(&t
);
48 p
+= ::base::snprintf(p
, limit
- p
,
49 "%04d/%02d/%02d-%02d:%02d:%02d.%03d %" PRIu64
" ",
57 static_cast<uint64
>(thread_id
));
62 GG_VA_COPY(backup_ap
, ap
);
63 p
+= vsnprintf(p
, limit
- p
, format
, backup_ap
);
67 // Truncate to available space if necessary
70 continue; // Try again with larger buffer
76 // Add newline if necessary
77 if (p
== base
|| p
[-1] != '\n') {
82 fwrite(base
, 1, p
- base
, file_
);
95 } // namespace leveldb
97 #endif // THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_