Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
S
spdlog
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
spdlog
Commits
32a8b51d
Commit
32a8b51d
authored
Oct 18, 2014
by
gabi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
pattern_formatter support most strftime format
parent
0c6a0d52
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
265 additions
and
50 deletions
+265
-50
bench.cpp
example/bench.cpp
+6
-4
fast_istostr.h
include/c11log/details/fast_istostr.h
+1
-1
fast_oss.h
include/c11log/details/fast_oss.h
+5
-0
line_logger.h
include/c11log/details/line_logger.h
+1
-2
log_msg.h
include/c11log/details/log_msg.h
+1
-1
os.h
include/c11log/details/os.h
+14
-0
pattern_formatter.h
include/c11log/details/pattern_formatter.h
+231
-36
async_sink.h
include/c11log/sinks/async_sink.h
+1
-1
base_sink.h
include/c11log/sinks/base_sink.h
+1
-1
file_sinks.h
include/c11log/sinks/file_sinks.h
+1
-1
null_sink.h
include/c11log/sinks/null_sink.h
+1
-1
ostream_sink.h
include/c11log/sinks/ostream_sink.h
+1
-1
stdout_sinks.h
include/c11log/sinks/stdout_sinks.h
+1
-1
No files found.
example/bench.cpp
View file @
32a8b51d
...
...
@@ -17,16 +17,18 @@ int main(int argc, char* argv[])
{
const
unsigned
int
howmany
=
argc
<=
1
?
500000
:
atoi
(
argv
[
1
]);
//std::string pattern = "%Y:%m:%d %H:%M:%S.%e ---> [%n:%l] %t";
//auto formatter = std::make_shared<details::pattern_formatter>(pattern);
//std::string pattern = "%B %d, %Y %H:%M:%S.%e **************[%n:%l] %t";
std
::
string
pattern
=
" [%z] %t"
;
auto
formatter
=
std
::
make_shared
<
details
::
pattern_formatter
>
(
pattern
);
logger
cout_logger
(
"bench"
,
{
std
::
make_shared
<
sinks
::
stderr_sink_mt
>
()
});
cout_logger
.
formatter
(
formatter
);
cout_logger
.
info
()
<<
"Hello logger "
<<
1234
;
auto
nullsink
=
std
::
make_shared
<
sinks
::
null_sink_st
>
();
auto
rotating
=
std
::
make_shared
<
sinks
::
rotating_file_sink_mt
>
(
"myrotating"
,
"txt"
,
1024
*
1024
*
5
,
5
,
1
);
auto
rotating
=
std
::
make_shared
<
sinks
::
rotating_file_sink_mt
>
(
"myrotating"
,
"txt"
,
1024
*
1024
*
5
,
5
,
1
00
);
logger
my_logger
(
"my_logger"
,
{
rotating
}
);
logger
my_logger
(
"my_logger"
,
{
nullsink
},
formatter
);
auto
start
=
system_clock
::
now
();
for
(
unsigned
int
i
=
1
;
i
<=
howmany
;
++
i
)
...
...
include/c11log/details/fast_istostr.h
View file @
32a8b51d
...
...
@@ -26,7 +26,7 @@ inline std::string& fast_itostr(int n, std::string& s, int padding)
{
if
(
n
==
0
)
{
s
=
"0"
;
s
=
std
::
string
(
padding
,
'0'
)
;
return
s
;
}
...
...
include/c11log/details/fast_oss.h
View file @
32a8b51d
...
...
@@ -143,6 +143,11 @@ public:
_dev
.
sputn
(
s
.
data
(),
s
.
size
());
}
void
write_data
(
const
char
*
p
,
std
::
size_t
size
)
{
_dev
.
sputn
(
p
,
size
);
}
void
write_str
(
const
std
::
string
&
s
)
{
_dev
.
sputn
(
s
.
data
(),
s
.
size
());
...
...
include/c11log/details/line_logger.h
View file @
32a8b51d
#pragma once
#include <sstream>
#include "../common.h"
#include "../logger.h"
#include "fast_oss.h"
#include "
./
fast_oss.h"
// Line logger class - aggregates operator<< calls to fast ostream
...
...
include/c11log/details/log_msg.h
View file @
32a8b51d
#pragma once
#include "../common.h"
#include "fast_oss.h"
#include "
./
fast_oss.h"
namespace
c11log
{
...
...
include/c11log/details/os.h
View file @
32a8b51d
...
...
@@ -3,6 +3,9 @@
#include<string>
#include<cstdio>
#include<ctime>
#ifdef _WIN32
#include <Windows.h>
#endif
namespace
c11log
{
...
...
@@ -81,6 +84,17 @@ inline bool fopen_s(FILE** fp, const std::string& filename, const char* mode)
#endif
}
inline
float
tz_offset
()
{
#ifdef _WIN32
TIME_ZONE_INFORMATION
tzinfo
;
GetTimeZoneInformation
(
&
tzinfo
);
return
tzinfo
.
Bias
/
-
60
.
0
f
;
#else
return
0
.
0
f
;
#endif
}
}
//os
}
//details
...
...
include/c11log/details/pattern_formatter.h
View file @
32a8b51d
...
...
@@ -6,10 +6,10 @@
#include <vector>
#include "../formatter.h"
#include "log_msg.h"
#include "fast_oss.h"
#include "os.h"
#include "
./
log_msg.h"
#include "
./
fast_oss.h"
#include "
./
os.h"
#include "Windows.h"
namespace
c11log
{
...
...
@@ -42,23 +42,110 @@ class level_formatter :public flag_formatter
// Date time pattern appenders
///////////////////////////////////////////////////////////////////////
// year - 4 digit
class
Y_formatter
:
public
flag_formatter
static
const
char
*
ampm
(
const
tm
&
t
)
{
return
t
.
tm_hour
>=
12
?
"PM"
:
"AM"
;
}
static
int
to12h
(
const
tm
&
t
)
{
return
t
.
tm_hour
>
12
?
t
.
tm_hour
-
12
:
t
.
tm_hour
;
}
//Abbreviated weekday name
static
const
std
::
string
days
[]
{
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
};
class
a_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_year
+
1900
,
4
);
msg
.
formatted
.
write_str
(
days
[
msg
.
tm_time
.
tm_wday
]);
}
};
//Full weekday name
static
const
std
::
string
full_days
[]
{
"Sunday"
,
"Monday"
,
"Tuesday"
,
"Wednesday"
,
"Thursday"
,
"Friday"
,
"Saturday"
};
class
A_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_str
(
full_days
[
msg
.
tm_time
.
tm_wday
]);
}
};
//Abbreviated month
static
const
std
::
string
months
[]
{
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"June"
,
"July"
,
"Aug"
,
"Sept"
,
"Oct"
,
"Nov"
,
"Dec"
};
class
b_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_str
(
months
[
msg
.
tm_time
.
tm_mon
]);
}
};
//Full month name
static
const
std
::
string
full_months
[]
{
"January"
,
"February"
,
"March"
,
"April"
,
"May"
,
"June"
,
"July"
,
"August"
,
"September"
,
"October"
,
"November"
,
"December"
};
class
B_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_str
(
full_months
[
msg
.
tm_time
.
tm_mon
]);
}
};
//Date and time representation (Thu Aug 23 15:35:46 2014)
class
c_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_str
(
days
[
msg
.
tm_time
.
tm_wday
]);
msg
.
formatted
.
putc
(
' '
);
msg
.
formatted
.
write_str
(
months
[
msg
.
tm_time
.
tm_mon
]);
msg
.
formatted
.
putc
(
' '
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_mday
,
2
);
msg
.
formatted
.
putc
(
' '
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_hour
,
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_min
,
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_sec
,
2
);
}
};
// year - 2 digit
class
y_formatter
:
public
flag_formatter
class
C_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_year
%
100
,
2
);
}
};
// Short MM/DD/YY date, equivalent to %m/%d/%y 08/23/01
class
D_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_mon
+
1
,
2
);
msg
.
formatted
.
putc
(
'/'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_mday
,
2
);
msg
.
formatted
.
putc
(
'/'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_year
%
100
,
2
);
}
};
// year - 4 digit
class
Y_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_year
,
2
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_year
+
1900
,
4
);
}
};
// month 1-12
class
m_formatter
:
public
flag_formatter
{
...
...
@@ -91,7 +178,7 @@ class I_formatter :public flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
(
msg
.
tm_time
.
tm_hour
+
1
)
%
1
,
2
);
msg
.
formatted
.
write_int
(
to12h
(
msg
.
tm_time
)
,
2
);
}
};
...
...
@@ -124,6 +211,61 @@ class e_formatter :public flag_formatter
}
};
// AM/PM
class
p_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_data
(
ampm
(
msg
.
tm_time
),
2
);
}
};
// 12 hour clock 02:55:02 pm
class
r_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
int
hours
=
to12h
(
msg
.
tm_time
);
msg
.
formatted
.
write_int
(
to12h
(
msg
.
tm_time
),
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_min
,
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_sec
,
2
);
msg
.
formatted
.
putc
(
' '
);
msg
.
formatted
.
write_data
(
ampm
(
msg
.
tm_time
),
2
);
}
};
// 24-hour HH:MM time, equivalent to %H:%M
class
R_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_hour
,
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_min
,
2
);
}
};
// ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S
class
T_formatter
:
public
flag_formatter
{
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_hour
,
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_min
,
2
);
msg
.
formatted
.
putc
(
':'
);
msg
.
formatted
.
write_int
(
msg
.
tm_time
.
tm_sec
,
2
);
}
};
class
t_formatter
:
public
flag_formatter
{
...
...
@@ -147,10 +289,11 @@ private:
};
class
str_formatter
:
public
flag_formatter
//aggregate user chars to display as is
class
aggregate_formatter
:
public
flag_formatter
{
public
:
str
_formatter
()
aggregate
_formatter
()
{}
void
add_ch
(
char
ch
)
{
...
...
@@ -158,7 +301,7 @@ public:
}
void
format
(
details
::
log_msg
&
msg
)
override
{
msg
.
formatted
<<
_str
;
msg
.
formatted
.
write_str
(
_str
)
;
}
private
:
std
::
string
_str
;
...
...
@@ -181,32 +324,41 @@ private:
};
}
}
///////////////////////////////////////////////////////////////////////////////
// pattern_formatter inline impl
///////////////////////////////////////////////////////////////////////////////
inline
c11log
::
details
::
pattern_formatter
::
pattern_formatter
(
const
std
::
string
&
pattern
)
{
compile_pattern
(
pattern
);
}
inline
void
c11log
::
details
::
pattern_formatter
::
compile_pattern
(
const
std
::
string
&
pattern
)
{
auto
end
=
pattern
.
end
();
std
::
unique_ptr
<
aggregate_formatter
>
user_chars
;
for
(
auto
it
=
pattern
.
begin
();
it
!=
end
;
++
it
)
{
if
(
*
it
==
'%'
)
{
if
(
user_chars
)
//append user chars found so far
_formatters
.
push_back
(
std
::
move
(
user_chars
));
if
(
++
it
!=
end
)
handle_flag
(
*
it
);
else
return
;
break
;
}
else
else
// chars not following the % sign should be displayed as is
{
// chars not following the % sign should be displayed as is
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
ch_formatter
(
*
it
)));
if
(
!
user_chars
)
user_chars
=
std
::
unique_ptr
<
aggregate_formatter
>
(
new
aggregate_formatter
());
user_chars
->
add_ch
(
*
it
);
}
}
if
(
user_chars
)
//append raw chars found so far
{
_formatters
.
push_back
(
std
::
move
(
user_chars
));
}
}
inline
void
c11log
::
details
::
pattern_formatter
::
handle_flag
(
char
flag
)
...
...
@@ -217,54 +369,97 @@ inline void c11log::details::pattern_formatter::handle_flag(char flag)
case
'n'
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
name_formatter
()));
break
;
// message log level
case
'l'
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
level_formatter
()));
break
;
// message text
case
(
't'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
t_formatter
()));
break
;
// year
case
(
'a'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
a_formatter
()));
break
;
case
(
'A'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
A_formatter
()));
break
;
case
(
'b'
):
case
(
'h'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
b_formatter
()));
break
;
case
(
'B'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
B_formatter
()));
break
;
case
(
'c'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
c_formatter
()));
break
;
case
(
'C'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
C_formatter
()));
break
;
case
(
'Y'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
Y_formatter
()));
break
;
// year 2 digits
case
(
'y'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
y_formatter
()));
case
(
'D'
)
:
case
(
'x'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
D_formatter
()));
break
;
// month
case
(
'm'
)
:
// minute
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
m_formatter
()));
break
;
// day in month
case
(
'd'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
d_formatter
()));
break
;
// hour (24)
case
(
'H'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
H_formatter
()));
break
;
// hour (12)
case
(
'I'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
I_formatter
()));
break
;
// minutes
case
(
'M'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
M_formatter
()));
break
;
// seconds
case
(
'S'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
S_formatter
()));
break
;
// milliseconds part
case
(
'e'
):
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
e_formatter
()));
break
;
// % sign
case
(
'%'
)
:
case
(
'p'
):
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
p_formatter
()));
break
;
case
(
'r'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
r_formatter
()));
break
;
case
(
'R'
)
:
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
R_formatter
()));
break
;
case
(
'T'
)
:
case
(
'X'
):
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
T_formatter
()));
break
;
default
:
//Unkown flag appears as is
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
ch_formatter
(
'%'
)));
_formatters
.
push_back
(
std
::
unique_ptr
<
details
::
flag_formatter
>
(
new
details
::
ch_formatter
(
flag
)));
break
;
}
}
...
...
include/c11log/sinks/async_sink.h
View file @
32a8b51d
...
...
@@ -5,7 +5,7 @@
#include <atomic>
#include <algorithm>
#include "base_sink.h"
#include "
./
base_sink.h"
#include "../logger.h"
#include "../details/blocking_queue.h"
#include "../details/null_mutex.h"
...
...
include/c11log/sinks/base_sink.h
View file @
32a8b51d
...
...
@@ -3,7 +3,7 @@
#include<string>
#include<mutex>
#include<atomic>
#include "sink.h"
#include "
./
sink.h"
#include "../formatter.h"
#include "../common.h"
#include "../details/log_msg.h"
...
...
include/c11log/sinks/file_sinks.h
View file @
32a8b51d
...
...
@@ -3,7 +3,7 @@
#include <fstream>
#include <sstream>
#include <iomanip>
#include "base_sink.h"
#include "
./
base_sink.h"
#include <mutex>
#include "../details/null_mutex.h"
#include "../details/flush_helper.h"
...
...
include/c11log/sinks/null_sink.h
View file @
32a8b51d
#pragma once
#include <mutex>
#include "base_sink.h"
#include "
./
base_sink.h"
#include "../details/null_mutex.h"
...
...
include/c11log/sinks/ostream_sink.h
View file @
32a8b51d
...
...
@@ -5,7 +5,7 @@
#include <memory>
#include "../details/null_mutex.h"
#include "base_sink.h"
#include "
./
base_sink.h"
namespace
c11log
{
...
...
include/c11log/sinks/stdout_sinks.h
View file @
32a8b51d
...
...
@@ -2,7 +2,7 @@
#include <iostream>
#include <mutex>
#include "ostream_sink.h"
#include "
./
ostream_sink.h"
#include "../details/null_mutex.h"
namespace
c11log
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment