Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
spdlog
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
spdlog
Commits
54456aee
Commit
54456aee
authored
Jul 15, 2019
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored padding handling in formatter using templates
parent
2a31cdcd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
170 additions
and
187 deletions
+170
-187
include/spdlog/details/pattern_formatter-inl.h
include/spdlog/details/pattern_formatter-inl.h
+169
-187
include/spdlog/details/pattern_formatter.h
include/spdlog/details/pattern_formatter.h
+1
-0
No files found.
include/spdlog/details/pattern_formatter-inl.h
View file @
54456aee
...
...
@@ -32,10 +32,10 @@ namespace details {
// name & level pattern appender
///////////////////////////////////////////////////////////////////////
class
scoped_pad
class
scoped_pad
der
{
public:
scoped_pad
(
size_t
wrapped_size
,
const
padding_info
&
padinfo
,
fmt
::
memory_buffer
&
dest
)
scoped_pad
der
(
size_t
wrapped_size
,
const
padding_info
&
padinfo
,
fmt
::
memory_buffer
&
dest
)
:
padinfo_
(
padinfo
)
,
dest_
(
dest
)
{
...
...
@@ -60,12 +60,8 @@ public:
total_pad_
=
half_pad
+
reminder
;
// for the right side
}
}
scoped_pad
(
const
spdlog
::
string_view_t
&
txt
,
padding_info
&
padinfo
,
fmt
::
memory_buffer
&
dest
)
:
scoped_pad
(
txt
.
size
(),
padinfo
,
dest
)
{}
~
scoped_pad
()
~
scoped_padder
()
{
if
(
total_pad_
)
{
...
...
@@ -87,6 +83,13 @@ private:
string_view_t
spaces_
{
" "
,
64
};
};
struct
null_scoped_padder
{
null_scoped_padder
(
size_t
/*wrapped_size*/
,
const
padding_info
&
/*padinfo*/
,
fmt
::
memory_buffer
&
/*dest*/
)
{}
};
template
<
typename
ScopedPadder
>
class
name_formatter
:
public
flag_formatter
{
public:
...
...
@@ -96,19 +99,13 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
if
(
padinfo_
.
enabled
())
{
scoped_pad
p
(
msg
.
logger_name
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
logger_name
,
dest
);
}
else
{
fmt_helper
::
append_string_view
(
msg
.
logger_name
,
dest
);
}
ScopedPadder
p
(
msg
.
logger_name
.
size
(),
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
logger_name
,
dest
);
}
};
// log level appender
template
<
typename
ScopedPadder
>
class
level_formatter
:
public
flag_formatter
{
public:
...
...
@@ -119,19 +116,13 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
string_view_t
&
level_name
=
level
::
to_string_view
(
msg
.
level
);
if
(
padinfo_
.
enabled
())
{
scoped_pad
p
(
level_name
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
level_name
,
dest
);
}
else
{
fmt_helper
::
append_string_view
(
level_name
,
dest
);
}
ScopedPadder
p
(
level_name
.
size
(),
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
level_name
,
dest
);
}
};
// short log level appender
template
<
typename
ScopedPadder
>
class
short_level_formatter
:
public
flag_formatter
{
public:
...
...
@@ -142,7 +133,7 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
string_view_t
level_name
{
level
::
to_short_c_str
(
msg
.
level
)};
scoped_pad
p
(
level_name
,
padinfo_
,
dest
);
ScopedPadder
p
(
level_name
.
size
()
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
level_name
,
dest
);
}
};
...
...
@@ -163,6 +154,8 @@ static int to12h(const tm &t)
// Abbreviated weekday name
static
std
::
array
<
const
char
*
,
7
>
days
{
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
};
template
<
typename
ScopedPadder
>
class
a_formatter
:
public
flag_formatter
{
public:
...
...
@@ -173,13 +166,15 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
string_view_t
field_value
{
days
[
static_cast
<
size_t
>
(
tm_time
.
tm_wday
)]};
scoped_pad
p
(
field_value
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_value
.
size
()
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
field_value
,
dest
);
}
};
// Full weekday name
static
std
::
array
<
const
char
*
,
7
>
full_days
{
"Sunday"
,
"Monday"
,
"Tuesday"
,
"Wednesday"
,
"Thursday"
,
"Friday"
,
"Saturday"
};
template
<
typename
ScopedPadder
>
class
A_formatter
:
public
flag_formatter
{
public:
...
...
@@ -190,13 +185,15 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
string_view_t
field_value
{
full_days
[
static_cast
<
size_t
>
(
tm_time
.
tm_wday
)]};
scoped_pad
p
(
field_value
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_value
.
size
()
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
field_value
,
dest
);
}
};
// Abbreviated month
static
const
std
::
array
<
const
char
*
,
12
>
months
{
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sept"
,
"Oct"
,
"Nov"
,
"Dec"
};
template
<
typename
ScopedPadder
>
class
b_formatter
:
public
flag_formatter
{
public:
...
...
@@ -207,7 +204,7 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
string_view_t
field_value
{
months
[
static_cast
<
size_t
>
(
tm_time
.
tm_mon
)]};
scoped_pad
p
(
field_value
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_value
.
size
()
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
field_value
,
dest
);
}
};
...
...
@@ -216,6 +213,7 @@ public:
static
const
std
::
array
<
const
char
*
,
12
>
full_months
{
"January"
,
"February"
,
"March"
,
"April"
,
"May"
,
"June"
,
"July"
,
"August"
,
"September"
,
"October"
,
"November"
,
"December"
};
template
<
typename
ScopedPadder
>
class
B_formatter
:
public
flag_formatter
{
public:
...
...
@@ -226,12 +224,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
string_view_t
field_value
{
full_months
[
static_cast
<
size_t
>
(
tm_time
.
tm_mon
)]};
scoped_pad
p
(
field_value
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_value
.
size
()
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
field_value
,
dest
);
}
};
// Date and time representation (Thu Aug 23 15:35:46 2014)
template
<
typename
ScopedPadder
>
class
c_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -242,7 +241,7 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
24
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
days
[
static_cast
<
size_t
>
(
tm_time
.
tm_wday
)],
dest
);
dest
.
push_back
(
' '
);
...
...
@@ -263,6 +262,7 @@ public:
};
// year - 2 digit
template
<
typename
ScopedPadder
>
class
C_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -273,12 +273,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_year
%
100
,
dest
);
}
};
// Short MM/DD/YY date, equivalent to %m/%d/%y 08/23/01
template
<
typename
ScopedPadder
>
class
D_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -289,7 +290,7 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
10
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_mon
+
1
,
dest
);
dest
.
push_back
(
'/'
);
...
...
@@ -300,6 +301,7 @@ public:
};
// year - 4 digit
template
<
typename
ScopedPadder
>
class
Y_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -310,12 +312,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
4
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
tm_time
.
tm_year
+
1900
,
dest
);
}
};
// month 1-12
template
<
typename
ScopedPadder
>
class
m_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -326,12 +329,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_mon
+
1
,
dest
);
}
};
// day of month 1-31
template
<
typename
ScopedPadder
>
class
d_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -342,12 +346,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_mday
,
dest
);
}
};
// hours in 24 format 0-23
template
<
typename
ScopedPadder
>
class
H_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -358,12 +363,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_hour
,
dest
);
}
};
// hours in 12 format 1-12
template
<
typename
ScopedPadder
>
class
I_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -374,12 +380,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
to12h
(
tm_time
),
dest
);
}
};
// minutes 0-59
template
<
typename
ScopedPadder
>
class
M_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -390,12 +397,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_min
,
dest
);
}
};
// seconds 0-59
template
<
typename
ScopedPadder
>
class
S_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -406,12 +414,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_sec
,
dest
);
}
};
// milliseconds
template
<
typename
ScopedPadder
>
class
e_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -422,20 +431,15 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
auto
millis
=
fmt_helper
::
time_fraction
<
std
::
chrono
::
milliseconds
>
(
msg
.
time
);
if
(
padinfo_
.
enabled
())
{
const
size_t
field_size
=
3
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad3
(
static_cast
<
uint32_t
>
(
millis
.
count
()),
dest
);
}
else
{
fmt_helper
::
pad3
(
static_cast
<
uint32_t
>
(
millis
.
count
()),
dest
);
}
const
size_t
field_size
=
3
;
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad3
(
static_cast
<
uint32_t
>
(
millis
.
count
()),
dest
);
}
};
// microseconds
template
<
typename
ScopedPadder
>
class
f_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -446,20 +450,16 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
auto
micros
=
fmt_helper
::
time_fraction
<
std
::
chrono
::
microseconds
>
(
msg
.
time
);
if
(
padinfo_
.
enabled
())
{
const
size_t
field_size
=
6
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad6
(
static_cast
<
size_t
>
(
micros
.
count
()),
dest
);
}
else
{
fmt_helper
::
pad6
(
static_cast
<
size_t
>
(
micros
.
count
()),
dest
);
}
const
size_t
field_size
=
6
;
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad6
(
static_cast
<
size_t
>
(
micros
.
count
()),
dest
);
}
};
// nanoseconds
template
<
typename
ScopedPadder
>
class
F_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -470,20 +470,14 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
auto
ns
=
fmt_helper
::
time_fraction
<
std
::
chrono
::
nanoseconds
>
(
msg
.
time
);
if
(
padinfo_
.
enabled
())
{
const
size_t
field_size
=
9
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad9
(
static_cast
<
size_t
>
(
ns
.
count
()),
dest
);
}
else
{
fmt_helper
::
pad9
(
static_cast
<
size_t
>
(
ns
.
count
()),
dest
);
}
const
size_t
field_size
=
9
;
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad9
(
static_cast
<
size_t
>
(
ns
.
count
()),
dest
);
}
};
// seconds since epoch
template
<
typename
ScopedPadder
>
class
E_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -494,7 +488,7 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
10
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
auto
duration
=
msg
.
time
.
time_since_epoch
();
auto
seconds
=
std
::
chrono
::
duration_cast
<
std
::
chrono
::
seconds
>
(
duration
).
count
();
fmt_helper
::
append_int
(
seconds
,
dest
);
...
...
@@ -502,6 +496,7 @@ public:
};
// AM/PM
template
<
typename
ScopedPadder
>
class
p_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -512,12 +507,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
2
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
ampm
(
tm_time
),
dest
);
}
};
// 12 hour clock 02:55:02 pm
template
<
typename
ScopedPadder
>
class
r_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -528,7 +524,7 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
11
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
to12h
(
tm_time
),
dest
);
dest
.
push_back
(
':'
);
...
...
@@ -541,6 +537,7 @@ public:
};
// 24-hour HH:MM time, equivalent to %H:%M
template
<
typename
ScopedPadder
>
class
R_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -551,7 +548,7 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
5
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_hour
,
dest
);
dest
.
push_back
(
':'
);
...
...
@@ -560,6 +557,7 @@ public:
};
// ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S
template
<
typename
ScopedPadder
>
class
T_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -570,7 +568,7 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
8
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
pad2
(
tm_time
.
tm_hour
,
dest
);
dest
.
push_back
(
':'
);
...
...
@@ -581,6 +579,7 @@ public:
};
// ISO 8601 offset from UTC in timezone (+-HH:MM)
template
<
typename
ScopedPadder
>
class
z_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -595,7 +594,7 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
tm_time
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
6
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
#ifdef _WIN32
int
total_minutes
=
get_cached_offset
(
msg
,
tm_time
);
...
...
@@ -640,6 +639,7 @@ private:
};
// Thread id
template
<
typename
ScopedPadder
>
class
t_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -649,20 +649,14 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
if
(
padinfo_
.
enabled
())
{
const
auto
field_size
=
fmt_helper
::
count_digits
(
msg
.
thread_id
);
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
msg
.
thread_id
,
dest
);
}
else
{
fmt_helper
::
append_int
(
msg
.
thread_id
,
dest
);
}
const
auto
field_size
=
fmt_helper
::
count_digits
(
msg
.
thread_id
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
msg
.
thread_id
,
dest
);
}
};
// Current pid
template
<
typename
ScopedPadder
>
class
pid_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -673,19 +667,13 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
const
auto
pid
=
static_cast
<
uint32_t
>
(
details
::
os
::
pid
());
if
(
padinfo_
.
enabled
())
{
auto
field_size
=
fmt_helper
::
count_digits
(
pid
);
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
pid
,
dest
);
}
else
{
fmt_helper
::
append_int
(
pid
,
dest
);
}
auto
field_size
=
fmt_helper
::
count_digits
(
pid
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
pid
,
dest
);
}
};
template
<
typename
ScopedPadder
>
class
v_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -695,15 +683,8 @@ public:
void
format
(
const
details
::
log_msg
&
msg
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
if
(
padinfo_
.
enabled
())
{
scoped_pad
p
(
msg
.
payload
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
payload
,
dest
);
}
else
{
fmt_helper
::
append_string_view
(
msg
.
payload
,
dest
);
}
ScopedPadder
p
(
msg
.
payload
.
size
(),
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
payload
,
dest
);
}
};
...
...
@@ -716,8 +697,6 @@ public:
void
format
(
const
details
::
log_msg
&
,
const
std
::
tm
&
,
fmt
::
memory_buffer
&
dest
)
override
{
const
size_t
field_size
=
1
;
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
dest
.
push_back
(
ch_
);
}
...
...
@@ -757,6 +736,7 @@ public:
msg
.
color_range_start
=
dest
.
size
();
}
};
class
color_stop_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -771,6 +751,7 @@ public:
};
// print source location
template
<
typename
ScopedPadder
>
class
source_location_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -784,23 +765,20 @@ public:
{
return
;
}
if
(
padinfo_
.
enabled
())
{
const
auto
text_size
=
std
::
char_traits
<
char
>::
length
(
msg
.
source
.
filename
)
+
fmt_helper
::
count_digits
(
msg
.
source
.
line
)
+
1
;
scoped_pad
p
(
text_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
source
.
filename
,
dest
);
dest
.
push_back
(
':'
);
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
}
else
{
fmt_helper
::
append_string_view
(
msg
.
source
.
filename
,
dest
);
dest
.
push_back
(
':'
);
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
}
size_t
text_size
=
padinfo_
.
enabled
()
?
std
::
char_traits
<
char
>::
length
(
msg
.
source
.
filename
)
+
fmt_helper
::
count_digits
(
msg
.
source
.
line
)
+
1
:
0
;
ScopedPadder
p
(
text_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
source
.
filename
,
dest
);
dest
.
push_back
(
':'
);
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
}
};
// print source filename
template
<
typename
ScopedPadder
>
class
source_filename_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -814,11 +792,13 @@ public:
{
return
;
}
scoped_pad
p
(
msg
.
source
.
filename
,
padinfo_
,
dest
);
size_t
text_size
=
padinfo_
.
enabled
()
?
std
::
char_traits
<
char
>::
length
(
msg
.
source
.
filename
)
:
0
;
ScopedPadder
p
(
text_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
source
.
filename
,
dest
);
}
};
template
<
typename
ScopedPadder
>
class
short_filename_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -839,11 +819,13 @@ public:
return
;
}
auto
filename
=
basename
(
msg
.
source
.
filename
);
scoped_pad
p
(
filename
,
padinfo_
,
dest
);
size_t
text_size
=
padinfo_
.
enabled
()
?
std
::
char_traits
<
char
>::
length
(
filename
)
:
0
;
ScopedPadder
p
(
text_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
filename
,
dest
);
}
};
template
<
typename
ScopedPadder
>
class
source_linenum_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -857,19 +839,15 @@ public:
{
return
;
}
if
(
padinfo_
.
enabled
())
{
auto
field_size
=
fmt_helper
::
count_digits
(
msg
.
source
.
line
);
scoped_pad
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
}
else
{
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
}
auto
field_size
=
fmt_helper
::
count_digits
(
msg
.
source
.
line
);
ScopedPadder
p
(
field_size
,
padinfo_
,
dest
);
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
}
};
// print source funcname
template
<
typename
ScopedPadder
>
class
source_funcname_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -883,13 +861,15 @@ public:
{
return
;
}
scoped_pad
p
(
msg
.
source
.
funcname
,
padinfo_
,
dest
);
size_t
text_size
=
padinfo_
.
enabled
()
?
std
::
char_traits
<
char
>::
length
(
msg
.
source
.
funcname
)
:
0
;
ScopedPadder
p
(
text_size
,
padinfo_
,
dest
);
fmt_helper
::
append_string_view
(
msg
.
source
.
funcname
,
dest
);
}
};
// print elapsed time since last message
template
<
typename
Units
>
template
<
typename
ScopedPadder
,
typename
Units
>
class
elapsed_formatter
final
:
public
flag_formatter
{
public:
...
...
@@ -905,15 +885,8 @@ public:
auto
delta
=
msg
.
time
-
last_message_time_
;
auto
delta_units
=
std
::
chrono
::
duration_cast
<
DurationUnits
>
(
delta
);
last_message_time_
=
msg
.
time
;
if
(
padinfo_
.
enabled
())
{
scoped_pad
p
(
6
,
padinfo_
,
dest
);
fmt_helper
::
pad6
(
static_cast
<
size_t
>
(
delta_units
.
count
()),
dest
);
}
else
{
fmt_helper
::
pad6
(
static_cast
<
size_t
>
(
delta_units
.
count
()),
dest
);
}
ScopedPadder
p
(
6
,
padinfo_
,
dest
);
fmt_helper
::
pad6
(
static_cast
<
size_t
>
(
delta_units
.
count
()),
dest
);
}
protected:
...
...
@@ -986,7 +959,6 @@ public:
dest
.
push_back
(
' '
);
}
#endif
dest
.
push_back
(
'['
);
// wrap the level name with color
msg
.
color_range_start
=
dest
.
size
();
...
...
@@ -1000,7 +972,7 @@ public:
if
(
!
msg
.
source
.
empty
())
{
dest
.
push_back
(
'['
);
const
char
*
filename
=
details
::
short_filename_formatter
::
basename
(
msg
.
source
.
filename
);
const
char
*
filename
=
details
::
short_filename_formatter
<
details
::
null_scoped_padder
>
::
basename
(
msg
.
source
.
filename
);
fmt_helper
::
append_string_view
(
filename
,
dest
);
dest
.
push_back
(
':'
);
fmt_helper
::
append_int
(
msg
.
source
.
line
,
dest
);
...
...
@@ -1071,6 +1043,8 @@ SPDLOG_INLINE std::tm pattern_formatter::get_time_(const details::log_msg &msg)
return
details
::
os
::
gmtime
(
log_clock
::
to_time_t
(
msg
.
time
));
}
template
<
typename
Padder
>
SPDLOG_INLINE
void
pattern_formatter
::
handle_flag_
(
char
flag
,
details
::
padding_info
padding
)
{
switch
(
flag
)
...
...
@@ -1081,122 +1055,122 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
break
;
case
'n'
:
// logger name
formatters_
.
push_back
(
details
::
make_unique
<
details
::
name_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
name_formatter
<
Padder
>
>
(
padding
));
break
;
case
'l'
:
// level
formatters_
.
push_back
(
details
::
make_unique
<
details
::
level_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
level_formatter
<
Padder
>
>
(
padding
));
break
;
case
'L'
:
// short level
formatters_
.
push_back
(
details
::
make_unique
<
details
::
short_level_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
short_level_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
't'
):
// thread id
formatters_
.
push_back
(
details
::
make_unique
<
details
::
t_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
t_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'v'
):
// the message text
formatters_
.
push_back
(
details
::
make_unique
<
details
::
v_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
v_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'a'
):
// weekday
formatters_
.
push_back
(
details
::
make_unique
<
details
::
a_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
a_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'A'
):
// short weekday
formatters_
.
push_back
(
details
::
make_unique
<
details
::
A_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
A_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'b'
):
case
(
'h'
):
// month
formatters_
.
push_back
(
details
::
make_unique
<
details
::
b_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
b_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'B'
):
// short month
formatters_
.
push_back
(
details
::
make_unique
<
details
::
B_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
B_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'c'
):
// datetime
formatters_
.
push_back
(
details
::
make_unique
<
details
::
c_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
c_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'C'
):
// year 2 digits
formatters_
.
push_back
(
details
::
make_unique
<
details
::
C_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
C_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'Y'
):
// year 4 digits
formatters_
.
push_back
(
details
::
make_unique
<
details
::
Y_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
Y_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'D'
):
case
(
'x'
):
// datetime MM/DD/YY
formatters_
.
push_back
(
details
::
make_unique
<
details
::
D_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
D_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'm'
):
// month 1-12
formatters_
.
push_back
(
details
::
make_unique
<
details
::
m_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
m_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'd'
):
// day of month 1-31
formatters_
.
push_back
(
details
::
make_unique
<
details
::
d_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
d_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'H'
):
// hours 24
formatters_
.
push_back
(
details
::
make_unique
<
details
::
H_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
H_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'I'
):
// hours 12
formatters_
.
push_back
(
details
::
make_unique
<
details
::
I_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
I_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'M'
):
// minutes
formatters_
.
push_back
(
details
::
make_unique
<
details
::
M_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
M_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'S'
):
// seconds
formatters_
.
push_back
(
details
::
make_unique
<
details
::
S_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
S_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'e'
):
// milliseconds
formatters_
.
push_back
(
details
::
make_unique
<
details
::
e_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
e_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'f'
):
// microseconds
formatters_
.
push_back
(
details
::
make_unique
<
details
::
f_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
f_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'F'
):
// nanoseconds
formatters_
.
push_back
(
details
::
make_unique
<
details
::
F_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
F_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'E'
):
// seconds since epoch
formatters_
.
push_back
(
details
::
make_unique
<
details
::
E_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
E_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'p'
):
// am/pm
formatters_
.
push_back
(
details
::
make_unique
<
details
::
p_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
p_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'r'
):
// 12 hour clock 02:55:02 pm
formatters_
.
push_back
(
details
::
make_unique
<
details
::
r_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
r_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'R'
):
// 24-hour HH:MM time
formatters_
.
push_back
(
details
::
make_unique
<
details
::
R_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
R_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'T'
):
case
(
'X'
):
// ISO 8601 time format (HH:MM:SS)
formatters_
.
push_back
(
details
::
make_unique
<
details
::
T_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
T_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'z'
):
// timezone
formatters_
.
push_back
(
details
::
make_unique
<
details
::
z_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
z_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'P'
):
// pid
formatters_
.
push_back
(
details
::
make_unique
<
details
::
pid_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
pid_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'^'
):
// color range start
...
...
@@ -1208,23 +1182,23 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
break
;
case
(
'@'
):
// source location (filename:filenumber)
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_location_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_location_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
's'
):
// short source filename - without directory name
formatters_
.
push_back
(
details
::
make_unique
<
details
::
short_filename_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
short_filename_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'g'
):
// full source filename
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_filename_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_filename_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'#'
):
// source line number
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_linenum_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_linenum_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'!'
):
// source funcname
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_funcname_formatter
>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
source_funcname_formatter
<
Padder
>
>
(
padding
));
break
;
case
(
'%'
):
// % char
...
...
@@ -1232,19 +1206,19 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
break
;
case
(
'u'
):
// elapsed time since last log message in nanos
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
std
::
chrono
::
nanoseconds
>>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
Padder
,
std
::
chrono
::
nanoseconds
>>
(
padding
));
break
;
case
(
'i'
):
// elapsed time since last log message in micros
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
std
::
chrono
::
microseconds
>>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
Padder
,
std
::
chrono
::
microseconds
>>
(
padding
));
break
;
case
(
'o'
):
// elapsed time since last log message in millis
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
std
::
chrono
::
milliseconds
>>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
Padder
,
std
::
chrono
::
milliseconds
>>
(
padding
));
break
;
case
(
'O'
):
// elapsed time since last log message in seconds
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
std
::
chrono
::
seconds
>>
(
padding
));
formatters_
.
push_back
(
details
::
make_unique
<
details
::
elapsed_formatter
<
Padder
,
std
::
chrono
::
seconds
>>
(
padding
));
break
;
default:
// Unknown flag appears as is
...
...
@@ -1262,7 +1236,7 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
SPDLOG_INLINE
details
::
padding_info
pattern_formatter
::
handle_padspec_
(
std
::
string
::
const_iterator
&
it
,
std
::
string
::
const_iterator
end
)
{
using
details
::
padding_info
;
using
details
::
scoped_pad
;
using
details
::
scoped_pad
der
;
const
size_t
max_width
=
64
;
if
(
it
==
end
)
{
...
...
@@ -1317,7 +1291,15 @@ SPDLOG_INLINE void pattern_formatter::compile_pattern_(const std::string &patter
if
(
it
!=
end
)
{
handle_flag_
(
*
it
,
padding
);
if
(
padding
.
enabled
())
{
handle_flag_
<
details
::
scoped_padder
>
(
*
it
,
padding
);
}
else
{
handle_flag_
<
details
::
null_scoped_padder
>
(
*
it
,
padding
);
}
}
else
{
...
...
include/spdlog/details/pattern_formatter.h
View file @
54456aee
...
...
@@ -82,6 +82,7 @@ private:
std
::
vector
<
std
::
unique_ptr
<
details
::
flag_formatter
>>
formatters_
;
std
::
tm
get_time_
(
const
details
::
log_msg
&
msg
);
template
<
typename
Padder
>
void
handle_flag_
(
char
flag
,
details
::
padding_info
padding
);
// Extract given pad spec (e.g. %8X)
...
...
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