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_