1POE::Wheel::FollowTail(U3s)er Contributed Perl DocumentatPiOoEn::Wheel::FollowTail(3)
2
3
4
6 POE::Wheel::FollowTail - follow the tail of an ever-growing file
7
9 #!perl
10
11 use POE qw(Wheel::FollowTail);
12
13 POE::Session->create(
14 inline_states => {
15 _start => sub {
16 $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
17 Filename => "/var/log/system.log",
18 InputEvent => "got_log_line",
19 ResetEvent => "got_log_rollover",
20 );
21 },
22 got_log_line => sub {
23 print "Log: $_[ARG0]\n";
24 },
25 got_log_rollover => sub {
26 print "Log rolled over.\n";
27 },
28 }
29 );
30
31 POE::Kernel->run();
32 exit;
33
35 POE::Wheel::FollowTail objects watch for new data at the end of a file
36 and generate new events when things happen to the file. Its "Filter"
37 parameter defines how to parse data from the file. Each new item is
38 sent to the creator's session as an "InputEvent" event. Log rotation
39 will trigger a "ResetEvent".
40
41 POE::Wheel::FollowTail only reads from a file, so it doesn't implement
42 a put() method.
43
45 new
46 new() returns a new POE::Wheel::FollowTail object. As long as this
47 object exists, it will generate events when the corresponding file's
48 status changes.
49
50 new() accepts a small set of named parameters:
51
52 Driver
53
54 The optional "Driver" parameter specifies which driver to use when
55 reading from the tailed file. If omitted, POE::Wheel::FollowTail will
56 use POE::Driver::SysRW. This is almost always the right thing to do.
57
58 Filter
59
60 "Filter" is an optional constructor parameter that specifies how to
61 parse data from the followed file. By default, POE::Wheel::FollowTail
62 will use POE::Filter::Line to parse files as plain, newline-separated
63 text.
64
65 $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
66 Filename => "/var/log/snort/alert",
67 Filter => POE::Filter::Snort->new(),
68 InputEvent => "got_snort_alert",
69 );
70
71 PollInterval
72
73 POE::Wheel::FollowTail needs to periodically check for new data on the
74 followed file. "PollInterval" specifies the number of seconds to wait
75 between checks. Applications that need to poll once per second may
76 omit "PollInterval", as it defaults to 1.
77
78 Longer poll intervals may be used to reduce the polling overhead for
79 infrequently updated files.
80
81 $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
82 ...,
83 PollInterval => 10,
84 );
85
86 Seek
87
88 If specified, "Seek" instructs POE::Wheel::FollowTail to seek to a
89 specific spot in the tailed file before beginning to read from it. A
90 positive "Seek" value is interpreted as the number of octets to seek
91 from the start of the file. Negative "Seek" will, like negative array
92 indices, seek backwards from the end of the file. Zero "Seek" starts
93 reading from the beginning of the file.
94
95 Be careful when using "Seek", as it's quite easy to seek into the
96 middle of a record. When in doubt, and when beginning at the end of
97 the file, omit "Seek" entirely. POE::Wheel::FollowTail will seek 4
98 kilobytes back from the end of the file, then parse and discard all
99 records unto EOF. As long as the file's records are smaller than 4
100 kilobytes, this will guarantee that the first record returned will be
101 complete.
102
103 "Seek" may also be used with the wheel's tell() method to restore the
104 file position after a program restart. Save the tell() value prior to
105 exiting, and load and "Seek" back to it on subsequent start-up.
106
107 SeekBack
108
109 "SeekBack" behaves like the inverse of "Seek". A positive value acts
110 like a negative "Seek". A negative value acts like a positive "Seek".
111 A zero "SeekBack" instructs POE::Wheel::FollowTail to begin at the very
112 end of the file.
113
114 "Seek" and "SeekBack" are mutually exclusive.
115
116 See "Seek" for caveats, techniques, and an explanation of the magic
117 that happens when neither "Seek" nor "SeekBack" is specified.
118
119 Handle
120
121 POE::Wheel::FollowTail may follow a previously opened file "Handle".
122 Unfortunately it cannot follow log resets this way, as it won't be able
123 to reopen the file once it has been reset. Applications that must
124 follow resets should use "Filename" instead.
125
126 "Handle" is still useful for files that will never be reset, or for
127 devices that require setup outside of POE::Wheel::FollowTail's purview.
128
129 "Handle" and "Filename" are mutually exclusive. One of them is
130 required, however.
131
132 Filename
133
134 Specify the "Filename" to watch. POE::Wheel::FollowTail will wait for
135 the file to appear if it doesn't exist. The wheel will also reopen the
136 file if it disappears, such as when it has been reset or rolled over.
137 In the case of a reset, POE::Wheel::FollowTail will also emit a
138 "ResetEvent", if one has been requested.
139
140 "Handle" and "Filename" are mutually exclusive. One of them is
141 required, however.
142
143 See the "SYNOPSIS" for an example.
144
145 IdleEvent
146
147 "IdleEvent" is an optional event. If specified, it will fire whenever
148 POE::Wheel::FollowTail checks for activity but sees nothing. It was
149 added in POE 1.362 as a way to advance certain test programs without
150 needing to wait conservatively large amounts of time.
151
152 "IdleEvent" is described in "PUBLIC EVENTS".
153
154 InputEvent
155
156 The "InputEvent" parameter is required, and it specifies the event to
157 emit when new data arrives in the watched file. "InputEvent" is
158 described in detail in "PUBLIC EVENTS".
159
160 ResetEvent
161
162 "ResetEvent" is an optional. It specifies the name of the event that
163 indicates file rollover or reset. Please see "PUBLIC EVENTS" for more
164 details.
165
166 ErrorEvent
167
168 POE::Wheel::FollowTail may emit optional "ErrorEvent"s whenever it runs
169 into trouble. The data that comes with this event is explained in
170 "PUBLIC EVENTS".
171
172 event
173 event() allows a session to change the events emitted by a wheel
174 without destroying and re-creating the object. It accepts one or more
175 of the events listed in "PUBLIC EVENTS". Undefined event names disable
176 those events.
177
178 Stop handling log resets:
179
180 sub some_event_handler {
181 $_[HEAP]{tailor}->event( ResetEvent => undef );
182 }
183
184 The events are described in more detail in "PUBLIC EVENTS".
185
186 ID
187 The ID() method returns the wheel's unique ID. It's useful for storing
188 the wheel in a hash. All POE::Wheel events should be accompanied by a
189 wheel ID, which allows the wheel to be referenced in their event
190 handlers.
191
192 sub setup_tailor {
193 my $wheel = POE::Wheel::FollowTail->new(... incomplete ...);
194 $_[HEAP]{tailors}{$wheel->ID} = $wheel;
195 }
196
197 See the example in "ErrorEvent" for a handler that will find this wheel
198 again.
199
200 tell
201 tell() returns the current position for the file being watched by
202 POE::Wheel::FollowTail. It may be useful for saving the position
203 program termination. new()'s "Seek" parameter may be used to resume
204 watching the file where tell() left off.
205
206 sub handle_shutdown {
207 # Not robust. Do better in production.
208 open my $save, ">", "position.save" or die $!;
209 print $save $_[HEAP]{tailor}->tell(), "\n";
210 close $save;
211 }
212
213 sub handle_startup {
214 open my $save, "<", "position.save" or die $!;
215 chomp(my $seek = <$save>);
216 $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
217 ...,
218 Seek => $seek,
219 );
220 }
221
223 POE::Wheel::FollowTail emits a small number of events.
224
225 IdleEvent
226 "IdleEvent" specifies the name of an event to be fired when
227 POE::Wheel::FollowTail doesn't detect activity on the watched file.
228
229 $_[ARG0] contains the ID of the POE::Wheel::FollowTail object that
230 fired the event.
231
232 InputEvent
233 "InputEvent" sets the name of the event to emit when new data arrives
234 into the tailed file. The event will be accompanied by two parameters:
235
236 $_[ARG0] contains the data that was read from the file, after being
237 parsed by the current "Filter".
238
239 $_[ARG1] contains the wheel's ID, which may be used as a key into a
240 data structure tracking multiple wheels. No assumption should be made
241 about the nature or format of this ID, as it may change at any time.
242 Therefore, track your wheels in a hash.
243
244 See the "SYNOPSIS" for an example.
245
246 ResetEvent
247 "ResetEvent" names the event to be emitted whenever the wheel detects
248 that the followed file has been reset. It's only available when
249 watching files by name, as POE::Wheel::FollowTail must reopen the file
250 after it has been reset.
251
252 "ResetEvent" comes with only one parameter, $_[ARG0], which contains
253 the wheel's ID. See "InputEvent" for some notes about what may be done
254 with wheel IDs.
255
256 See the "SYNOPSIS" for an example.
257
258 ErrorEvent
259 "ErrorEvent" names the event emitted when POE::Wheel::FollowTail
260 encounters a problem. Every "ErrorEvent" comes with four parameters
261 that describe the error and its situation:
262
263 $_[ARG0] describes the operation that failed. This is usually "read",
264 since POE::Wheel::FollowTail spends most of its time reading from a
265 file.
266
267 $_[ARG1] and $_[ARG2] contain the numeric and stringified values of $!,
268 respectively. They will never contain EAGAIN (or its local equivalent)
269 since POE::Wheel::FollowTail handles that error itself.
270
271 $_[ARG3] contains the wheel's ID, which has been discussed in
272 "InputEvent".
273
274 This error handler logs a message to STDERR and then shuts down the
275 wheel. It assumes that the session is watching multiple files.
276
277 sub handle_tail_error {
278 my ($operation, $errnum, $errstr, $wheel_id) = @_[ARG0..ARG3];
279 warn "Wheel $wheel_id: $operation error $errnum: $errstr\n";
280 delete $_[HEAP]{tailors}{$wheel_id};
281 }
282
284 POE::Wheel describes the basic operations of all wheels in more depth.
285 You need to know this.
286
287 The SEE ALSO section in POE contains a table of contents covering the
288 entire POE distribution.
289
291 This wheel can't tail pipes and consoles on some operating systems.
292
293 POE::Wheel::FollowTail generally reads ahead of the data it returns, so
294 the tell() position may be later in the file than the data an
295 application has already received.
296
298 Please see POE for more information about authors and contributors.
299
300
301
302perl v5.36.0 2023-01-20 POE::Wheel::FollowTail(3)