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
7d40244a
Commit
7d40244a
authored
Jul 13, 2018
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed issue #726 and changed default filename calculator to dateonly
parent
08ef5a2a
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
26 additions
and
77 deletions
+26
-77
include/spdlog/sinks/daily_file_sink.h
include/spdlog/sinks/daily_file_sink.h
+21
-33
tests/file_log.cpp
tests/file_log.cpp
+5
-44
No files found.
include/spdlog/sinks/daily_file_sink.h
View file @
7d40244a
...
@@ -19,37 +19,19 @@
...
@@ -19,37 +19,19 @@
namespace
spdlog
{
namespace
spdlog
{
namespace
sinks
{
namespace
sinks
{
/*
* Default generator of daily log file names.
*/
struct
default_daily_file_name_calculator
{
// Create filename for the form filename.YYYY-MM-DD_hh-mm.ext
static
filename_t
calc_filename
(
const
filename_t
&
filename
)
{
std
::
tm
tm
=
spdlog
::
details
::
os
::
localtime
();
filename_t
basename
,
ext
;
std
::
tie
(
basename
,
ext
)
=
details
::
file_helper
::
split_by_extenstion
(
filename
);
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
memory_buffer
,
fmt
::
wmemory_buffer
>::
type
w
;
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}{}"
),
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
tm
.
tm_hour
,
tm
.
tm_min
,
ext
);
return
fmt
::
to_string
(
w
);
}
};
/*
/*
* Generator of daily log file names in format basename.YYYY-MM-DD.ext
* Generator of daily log file names in format basename.YYYY-MM-DD.ext
*/
*/
struct
da
teonly_daily_file_
name_calculator
struct
da
ily_file
name_calculator
{
{
// Create filename for the form basename.YYYY-MM-DD
// Create filename for the form basename.YYYY-MM-DD
static
filename_t
calc_filename
(
const
filename_t
&
filename
)
static
filename_t
calc_filename
(
const
filename_t
&
filename
,
const
tm
&
now_tm
)
{
{
std
::
tm
tm
=
spdlog
::
details
::
os
::
localtime
();
filename_t
basename
,
ext
;
filename_t
basename
,
ext
;
std
::
tie
(
basename
,
ext
)
=
details
::
file_helper
::
split_by_extenstion
(
filename
);
std
::
tie
(
basename
,
ext
)
=
details
::
file_helper
::
split_by_extenstion
(
filename
);
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
memory_buffer
,
fmt
::
wmemory_buffer
>::
type
w
;
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
memory_buffer
,
fmt
::
wmemory_buffer
>::
type
w
;
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}{}"
),
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
ext
);
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}{}"
),
basename
,
now_tm
.
tm_year
+
1900
,
now_tm
.
tm_mon
+
1
,
now_tm
.
tm_mday
,
ext
);
return
fmt
::
to_string
(
w
);
return
fmt
::
to_string
(
w
);
}
}
};
};
...
@@ -57,7 +39,7 @@ struct dateonly_daily_file_name_calculator
...
@@ -57,7 +39,7 @@ struct dateonly_daily_file_name_calculator
/*
/*
* Rotating file sink based on date. rotates at midnight
* Rotating file sink based on date. rotates at midnight
*/
*/
template
<
class
Mutex
,
class
FileNameCalc
=
d
efault_daily_file_
name_calculator
>
template
<
class
Mutex
,
class
FileNameCalc
=
d
aily_file
name_calculator
>
class
daily_file_sink
SPDLOG_FINAL
:
public
base_sink
<
Mutex
>
class
daily_file_sink
SPDLOG_FINAL
:
public
base_sink
<
Mutex
>
{
{
public:
public:
...
@@ -71,16 +53,17 @@ public:
...
@@ -71,16 +53,17 @@ public:
{
{
throw
spdlog_ex
(
"daily_file_sink: Invalid rotation time in ctor"
);
throw
spdlog_ex
(
"daily_file_sink: Invalid rotation time in ctor"
);
}
}
auto
now
=
log_clock
::
now
();
file_helper_
.
open
(
FileNameCalc
::
calc_filename
(
base_filename_
,
now_tm
(
now
)));
rotation_tp_
=
next_rotation_tp_
();
rotation_tp_
=
next_rotation_tp_
();
file_helper_
.
open
(
FileNameCalc
::
calc_filename
(
base_filename_
));
}
}
protected:
protected:
void
sink_it_
(
const
details
::
log_msg
&
,
const
fmt
::
memory_buffer
&
formatted
)
override
void
sink_it_
(
const
details
::
log_msg
&
msg
,
const
fmt
::
memory_buffer
&
formatted
)
override
{
{
if
(
std
::
chrono
::
system_clock
::
now
()
>=
rotation_tp_
)
if
(
msg
.
time
>=
rotation_tp_
)
{
{
file_helper_
.
open
(
FileNameCalc
::
calc_filename
(
base_filename_
));
file_helper_
.
open
(
FileNameCalc
::
calc_filename
(
base_filename_
,
now_tm
(
msg
.
time
)
));
rotation_tp_
=
next_rotation_tp_
();
rotation_tp_
=
next_rotation_tp_
();
}
}
file_helper_
.
write
(
formatted
);
file_helper_
.
write
(
formatted
);
...
@@ -92,15 +75,20 @@ protected:
...
@@ -92,15 +75,20 @@ protected:
}
}
private:
private:
std
::
chrono
::
system_clock
::
time_point
next_rotation_tp_
()
tm
now_tm
(
log_clock
::
time_point
tp
)
{
time_t
tnow
=
log_clock
::
to_time_t
(
tp
);
return
spdlog
::
details
::
os
::
localtime
(
tnow
);
}
log_clock
::
time_point
next_rotation_tp_
()
{
{
auto
now
=
std
::
chrono
::
system_clock
::
now
();
auto
now
=
log_clock
::
now
();
time_t
tnow
=
std
::
chrono
::
system_clock
::
to_time_t
(
now
);
tm
date
=
now_tm
(
now
);
tm
date
=
spdlog
::
details
::
os
::
localtime
(
tnow
);
date
.
tm_hour
=
rotation_h_
;
date
.
tm_hour
=
rotation_h_
;
date
.
tm_min
=
rotation_m_
;
date
.
tm_min
=
rotation_m_
;
date
.
tm_sec
=
0
;
date
.
tm_sec
=
0
;
auto
rotation_time
=
std
::
chrono
::
system
_clock
::
from_time_t
(
std
::
mktime
(
&
date
));
auto
rotation_time
=
log
_clock
::
from_time_t
(
std
::
mktime
(
&
date
));
if
(
rotation_time
>
now
)
if
(
rotation_time
>
now
)
{
{
return
rotation_time
;
return
rotation_time
;
...
@@ -111,7 +99,7 @@ private:
...
@@ -111,7 +99,7 @@ private:
filename_t
base_filename_
;
filename_t
base_filename_
;
int
rotation_h_
;
int
rotation_h_
;
int
rotation_m_
;
int
rotation_m_
;
std
::
chrono
::
system
_clock
::
time_point
rotation_tp_
;
log
_clock
::
time_point
rotation_tp_
;
details
::
file_helper
file_helper_
;
details
::
file_helper
file_helper_
;
};
};
...
...
tests/file_log.cpp
View file @
7d40244a
...
@@ -79,30 +79,9 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]]")
...
@@ -79,30 +79,9 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]]")
REQUIRE
(
get_filesize
(
filename1
)
<=
max_size
);
REQUIRE
(
get_filesize
(
filename1
)
<=
max_size
);
}
}
TEST_CASE
(
"daily_logger"
,
"[daily_logger]]"
)
{
prepare_logdir
();
// calculate filename (time based)
std
::
string
basename
=
"logs/daily_log"
;
std
::
tm
tm
=
spdlog
::
details
::
os
::
localtime
();
fmt
::
memory_buffer
w
;
fmt
::
format_to
(
w
,
"{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}"
,
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
tm
.
tm_hour
,
tm
.
tm_min
);
auto
logger
=
spdlog
::
daily_logger_mt
(
"logger"
,
basename
,
0
,
0
);
logger
->
flush_on
(
spdlog
::
level
::
info
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
logger
->
info
(
"Test message {}"
,
i
);
}
auto
filename
=
fmt
::
to_string
(
w
);
REQUIRE
(
count_lines
(
filename
)
==
10
);
}
TEST_CASE
(
"daily_logger with dateonly calculator"
,
"[daily_logger_dateonly]]"
)
TEST_CASE
(
"daily_logger with dateonly calculator"
,
"[daily_logger_dateonly]]"
)
{
{
using
sink_type
=
spdlog
::
sinks
::
daily_file_sink
<
std
::
mutex
,
spdlog
::
sinks
::
da
teonly_daily_file_
name_calculator
>
;
using
sink_type
=
spdlog
::
sinks
::
daily_file_sink
<
std
::
mutex
,
spdlog
::
sinks
::
da
ily_file
name_calculator
>
;
prepare_logdir
();
prepare_logdir
();
// calculate filename (time based)
// calculate filename (time based)
...
@@ -124,11 +103,10 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]")
...
@@ -124,11 +103,10 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]")
struct
custom_daily_file_name_calculator
struct
custom_daily_file_name_calculator
{
{
static
spdlog
::
filename_t
calc_filename
(
const
spdlog
::
filename_t
&
basename
)
static
spdlog
::
filename_t
calc_filename
(
const
spdlog
::
filename_t
&
basename
,
const
tm
&
now_tm
)
{
{
std
::
tm
tm
=
spdlog
::
details
::
os
::
localtime
();
fmt
::
memory_buffer
w
;
fmt
::
memory_buffer
w
;
fmt
::
format_to
(
w
,
"{}{:04d}{:02d}{:02d}"
,
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
);
fmt
::
format_to
(
w
,
"{}{:04d}{:02d}{:02d}"
,
basename
,
now_tm
.
tm_year
+
1900
,
now_tm
.
tm_mon
+
1
,
now_
tm
.
tm_mday
);
return
fmt
::
to_string
(
w
);
return
fmt
::
to_string
(
w
);
}
}
};
};
...
@@ -180,28 +158,11 @@ TEST_CASE("rotating_file_sink::calc_filename3", "[rotating_file_sink]]")
...
@@ -180,28 +158,11 @@ TEST_CASE("rotating_file_sink::calc_filename3", "[rotating_file_sink]]")
// regex supported only from gcc 4.9 and above
// regex supported only from gcc 4.9 and above
#if defined(_MSC_VER) || !(__GNUC__ <= 4 && __GNUC_MINOR__ < 9)
#if defined(_MSC_VER) || !(__GNUC__ <= 4 && __GNUC_MINOR__ < 9)
#include <regex>
#include <regex>
TEST_CASE
(
"daily_file_sink::default_daily_file_name_calculator1"
,
"[daily_file_sink]]"
)
{
// daily_YYYY-MM-DD_hh-mm.txt
auto
filename
=
spdlog
::
sinks
::
default_daily_file_name_calculator
::
calc_filename
(
"daily.txt"
);
std
::
regex
re
(
R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])_\d\d-[0-5][0-9].txt$)"
);
std
::
smatch
match
;
REQUIRE
(
std
::
regex_match
(
filename
,
match
,
re
));
}
TEST_CASE
(
"daily_file_sink::default_daily_file_name_calculator2"
,
"[daily_file_sink]]"
)
{
// daily_YYYY-MM-DD_hh-mm.txt
auto
filename
=
spdlog
::
sinks
::
default_daily_file_name_calculator
::
calc_filename
(
"daily"
);
std
::
regex
re
(
R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])_\d\d-[0-5][0-9]$)"
);
std
::
smatch
match
;
REQUIRE
(
std
::
regex_match
(
filename
,
match
,
re
));
}
TEST_CASE
(
"daily_file_sink::da
teonly_daily_file_
name_calculator"
,
"[daily_file_sink]]"
)
TEST_CASE
(
"daily_file_sink::da
ily_file
name_calculator"
,
"[daily_file_sink]]"
)
{
{
// daily_YYYY-MM-DD_hh-mm.txt
// daily_YYYY-MM-DD_hh-mm.txt
auto
filename
=
spdlog
::
sinks
::
da
teonly_daily_file_name_calculator
::
calc_filename
(
"daily.txt"
);
auto
filename
=
spdlog
::
sinks
::
da
ily_filename_calculator
::
calc_filename
(
"daily.txt"
,
spdlog
::
details
::
os
::
localtime
()
);
// date regex based on https://www.regular-expressions.info/dates.html
// date regex based on https://www.regular-expressions.info/dates.html
std
::
regex
re
(
R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\.txt$)"
);
std
::
regex
re
(
R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\.txt$)"
);
std
::
smatch
match
;
std
::
smatch
match
;
...
...
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