Add read_logs.rb scripts

This commit is contained in:
Eugen Wissner 2025-02-05 10:52:16 +01:00
parent e9bf0d84b8
commit 897fb7ece0
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
3 changed files with 85 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/dist-newstyle/ /dist-newstyle/
/config.toml /config.toml
/log/

View File

@ -25,4 +25,29 @@ and in another session:
curl localhost:8082 curl localhost:8082
``` ```
## read\_logs.rb
read\_logs.rb looks in the `log/` directory for files ending with `.log`,
`.log.1`, `.log.2.gz`, `.log.3.gz` and so forth. It filters out lines starting
with a timestamp, `yyyy-mm-ddThh:mm:ss`, followed by random characters and a
custom string provided as the only command line parameter. Finally
it outputs all matched content after the provided string along with the date.
The log files are read in the order based on the number in the filename.
For example calling the script as
```sh
./bin/read_logs.rb 'doctrine.INFO:'
```
on a log file containing
`[2025-02-04T19:51:49.356093+01:00] doctrine.INFO: Disconnecting [] []`
will print:
```
2025-02-04 (Disconnecting [])
```
## tea-cleaner ## tea-cleaner

59
bin/read_logs.rb Executable file
View File

@ -0,0 +1,59 @@
#!/usr/bin/env ruby
require 'date'
require 'zlib'
require 'pathname'
class Visit
attr_accessor :page, :date
def initialize(match_data)
@date = Date.iso8601 match_data[1]
@page = match_data[2].strip
end
end
def numeric_extension(filename)
if filename.extname == '.gz'
filename.sub_ext('').extname[1..-1].to_i
elsif filename.extname == '.log'
0
else
filename.extname[1..-1].to_i
end
end
entries = Dir.new('log')
.entries
.reject { |entry| entry.start_with? '.' }
.map { |entry| Pathname.new entry }
.sort { |a, b| numeric_extension(b) <=> numeric_extension(a) }
def read_lines(stream)
if ARGV.length > 0
regex = /([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}).+#{ARGV[0]}(.+) /
else
regex = /([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2})(.+) /
end
stream
.map { |line| line.match regex }
.reject { |line| line.nil? }
.map { |match_data| Visit.new match_data }
end
lines_in_all_files = entries.flat_map do |log|
log_path = Pathname.new('log') + log
if log_path.extname == '.gz'
File.open log_path.to_s do |file|
read_lines Zlib::GzipReader.new(file).readlines
end
else
read_lines File.readlines(log_path.to_s)
end
end
lines_in_all_files.each do |visit|
puts "#{visit.date.strftime} (#{visit.page})"
end