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_
10 #include "base/format_macros.h"
11 #include "base/strings/string_util.h"
12 #include "base/time/time.h"
13 #include "leveldb/env.h"
17 class ChromiumLogger : public Logger {
19 ChromiumLogger(FILE* f) : file_(f) { }
20 virtual ~ChromiumLogger() {
23 virtual void Logv(const char* format, va_list ap) {
24 const long long unsigned int thread_id =
25 ::base::PlatformThread::CurrentId();
27 // We try twice: the first time with a fixed-size stack allocated buffer,
28 // and the second time with a much larger dynamically allocated buffer.
30 for (int iter = 0; iter < 2; iter++) {
34 bufsize = sizeof(buffer);
38 base = new char[bufsize];
41 char* limit = base + bufsize;
43 ::base::Time::Exploded t;
44 ::base::Time::Now().LocalExplode(&t);
46 p += ::base::snprintf(p, limit - p,
47 "%04d/%02d/%02d-%02d:%02d:%02d.%03d %" PRIu64 " ",
60 GG_VA_COPY(backup_ap, ap);
61 p += vsnprintf(p, limit - p, format, backup_ap);
65 // Truncate to available space if necessary
68 continue; // Try again with larger buffer
74 // Add newline if necessary
75 if (p == base || p[-1] != '\n') {
80 fwrite(base, 1, p - base, file_);
92 } // namespace leveldb
94 #endif // THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_