37 static const char* FileCountOptionKey; |
37 static const char* FileCountOptionKey; |
38 static const char* FileSizeOptionKey; |
38 static const char* FileSizeOptionKey; |
39 static const char* PidFilenamePlaceholder; |
39 static const char* PidFilenamePlaceholder; |
40 static const char* TimestampFilenamePlaceholder; |
40 static const char* TimestampFilenamePlaceholder; |
41 static const char* TimestampFormat; |
41 static const char* TimestampFormat; |
|
42 static const size_t DefaultFileCount = 5; |
|
43 static const size_t DefaultFileSize = 20 * M; |
42 static const size_t StartTimeBufferSize = 20; |
44 static const size_t StartTimeBufferSize = 20; |
43 static const size_t PidBufferSize = 21; |
45 static const size_t PidBufferSize = 21; |
|
46 static const uint MaxRotationFileCount = 1000; |
44 static char _pid_str[PidBufferSize]; |
47 static char _pid_str[PidBufferSize]; |
45 static char _vm_start_time_str[StartTimeBufferSize]; |
48 static char _vm_start_time_str[StartTimeBufferSize]; |
46 |
49 |
47 const char* _name; |
50 const char* _name; |
48 char* _file_name; |
51 char* _file_name; |
59 // Semaphore used for synchronizing file rotations and writes |
62 // Semaphore used for synchronizing file rotations and writes |
60 Semaphore _rotation_semaphore; |
63 Semaphore _rotation_semaphore; |
61 |
64 |
62 void archive(); |
65 void archive(); |
63 void rotate(); |
66 void rotate(); |
64 bool configure_rotation(const char* options); |
67 bool parse_options(const char* options, outputStream* errstream); |
65 char *make_file_name(const char* file_name, const char* pid_string, const char* timestamp_string); |
68 char *make_file_name(const char* file_name, const char* pid_string, const char* timestamp_string); |
66 static size_t parse_value(const char* value_str); |
|
67 |
69 |
68 bool should_rotate() { |
70 bool should_rotate() { |
69 return _file_count > 0 && _rotate_size > 0 && _current_size >= _rotate_size; |
71 return _file_count > 0 && _rotate_size > 0 && _current_size >= _rotate_size; |
70 } |
72 } |
71 |
73 |
|
74 void increment_file_count() { |
|
75 _current_file++; |
|
76 if (_current_file == _file_count) { |
|
77 _current_file = 0; |
|
78 } |
|
79 } |
|
80 |
72 public: |
81 public: |
73 LogFileOutput(const char *name); |
82 LogFileOutput(const char *name); |
74 virtual ~LogFileOutput(); |
83 virtual ~LogFileOutput(); |
75 virtual bool initialize(const char* options); |
84 virtual bool initialize(const char* options, outputStream* errstream); |
76 virtual int write(const LogDecorations& decorations, const char* msg); |
85 virtual int write(const LogDecorations& decorations, const char* msg); |
77 virtual void force_rotate(); |
86 virtual void force_rotate(); |
78 |
87 |
79 virtual const char* name() const { |
88 virtual const char* name() const { |
80 return _name; |
89 return _name; |