18 #ifndef PSTORE_OS_ROTATING_LOG_HPP 19 #define PSTORE_OS_ROTATING_LOG_HPP 24 #include <type_traits> 47 template <
typename StreamTraits,
typename FileSystemTraits>
61 basic_rotating_log (std::string base_name, std::streamoff max_bytes,
unsigned num_backups,
62 StreamTraits
const & traits = StreamTraits (),
63 FileSystemTraits
const & fs_traits = FileSystemTraits ());
75 void log_impl (std::string
const & message)
override;
78 bool is_open ()
const {
return is_open_; }
79 StreamTraits & stream_traits () {
return stream_traits_; }
81 typename StreamTraits::stream_type & stream () {
return stream_; }
84 std::string make_file_name (
unsigned index)
const;
90 bool should_rollover (std::string
const & record);
92 static constexpr std::ios_base::openmode mode_flags_ =
93 std::ofstream::out | std::ofstream::app | std::ofstream::ate;
95 std::streamoff
const max_size_;
96 std::string
const base_name_;
97 unsigned const num_backups_;
99 typename StreamTraits::stream_type stream_;
100 bool is_open_ =
false;
101 StreamTraits stream_traits_;
102 FileSystemTraits file_system_traits_;
107 template <
typename StreamTraits,
typename FileSystemTraits>
109 std::string base_name, std::streamoff
const max_size,
unsigned const num_backups,
110 StreamTraits
const & stream_traits, FileSystemTraits
const & fs_traits)
111 : max_size_ (
std::max (max_size,
std::streamoff{0}))
112 , base_name_{std::move (base_name)}
113 , num_backups_ (num_backups)
115 , stream_traits_ (stream_traits)
116 , file_system_traits_ (fs_traits) {}
120 template <
typename StreamTraits,
typename FileSystemTraits>
122 PSTORE_TRY { this->close (); }
123 PSTORE_CATCH (..., {})
128 template <typename StreamTraits, typename FileSystemTraits>
131 if (this->should_rollover (message)) {
132 this->do_rollover ();
141 template <
typename StreamTraits,
typename FileSystemTraits>
143 unsigned const index)
const {
144 std::ostringstream str;
154 template <
typename StreamTraits,
typename FileSystemTraits>
157 stream_traits_.open (stream_, base_name_, mode_flags_);
164 template <
typename StreamTraits,
typename FileSystemTraits>
168 stream_traits_.close (stream_);
175 template <
typename StreamTraits,
typename FileSystemTraits>
179 for (
auto index = num_backups_; index > 0; --index) {
180 std::string
const & source = this->make_file_name (index - 1);
181 std::string
const & dest = this->make_file_name (index);
182 if (file_system_traits_.exists (source)) {
183 if (file_system_traits_.exists (dest)) {
184 file_system_traits_.unlink (dest);
187 file_system_traits_.rename (source, dest);
194 stream_traits_.clear (stream_);
199 template <
typename StreamTraits,
typename FileSystemTraits>
201 std::string
const & message) {
206 if (stream_.good () && num_backups_ > 0 && max_size_ > 0) {
207 using pos_type =
typename StreamTraits::stream_type::pos_type;
215 pos_type
const pos = stream_.tellp ();
219 std::streamoff
const remaining = max_size_ - pos;
220 using ustreamoff = std::make_unsigned<std::streamoff>::type;
221 if (remaining < 0 || message.length () >
static_cast<ustreamoff
> (remaining)) {
233 #endif // PSTORE_OS_ROTATING_LOG_HPP Definition: logging.hpp:173
bool is_open() const
(for testing)
Definition: rotating_log.hpp:78
Definition: chunked_sequence.hpp:607
Definition: logging.hpp:102
basic_rotating_log(std::string base_name, std::streamoff max_bytes, unsigned num_backups, StreamTraits const &traits=StreamTraits(), FileSystemTraits const &fs_traits=FileSystemTraits())
Definition: rotating_log.hpp:108
void log_impl(std::string const &message) override
Writes the supplied string to the log.
Definition: rotating_log.hpp:130
Definition: nonpod2.cpp:40
Definition: rotating_log.hpp:48