diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-02-05 10:52:16 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-02-05 10:52:16 +0100 |
| commit | 897fb7ece0b10736524991a7421f6fce20e9225a (patch) | |
| tree | d0a1f6722e2474eec324c64b2e0b6902712ee49e | |
| parent | e9bf0d84b8bc456e958eda5b52a0e9218fab6163 (diff) | |
| download | kazbek-897fb7ece0b10736524991a7421f6fce20e9225a.tar.gz | |
Add read_logs.rb scripts
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | README.md | 25 | ||||
| -rwxr-xr-x | bin/read_logs.rb | 59 |
3 files changed, 85 insertions, 0 deletions
@@ -1,2 +1,3 @@ /dist-newstyle/ /config.toml +/log/ @@ -25,4 +25,29 @@ and in another session: 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 diff --git a/bin/read_logs.rb b/bin/read_logs.rb new file mode 100755 index 0000000..76627bc --- /dev/null +++ b/bin/read_logs.rb @@ -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 |
