mirror of
https://github.com/gosticks/PaperWM.git
synced 2026-02-19 07:12:51 +00:00
The assumption that every line was timestamped turned out to be wrong [1] causing the skip filters to break (and distort the output) Abandon timestamp and message on separate line. Print only the time part of the timestamp to save horizontal space.
89 lines
2.2 KiB
Bash
Executable File
89 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env zsh
|
||
|
||
indent=" "
|
||
|
||
# Ref: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1
|
||
function skip-crap {
|
||
local datep="[0-9][0-9]:[0-9][0-9]:[0-9][0-9]: "
|
||
local crap_start="^${datep}Object [^ ]+ \(.*\), has been already finalized. Impossible to \w* any property \w* it.*"
|
||
|
||
local crap_continue=(
|
||
"^${datep}== Stack trace for context.*"
|
||
"^${datep}#[0-9]+\s*0x.*"
|
||
)
|
||
|
||
local skip=0
|
||
local skipped=0
|
||
local begin_skip_date
|
||
|
||
# Could probably be done more elegantly with awk/sed ?
|
||
while IFS=$'\n' read -r line; do
|
||
if [[ $line =~ $crap_start ]]; then
|
||
# echo setting skip
|
||
skip=1
|
||
begin_skip=$line
|
||
((skipped += 1))
|
||
continue
|
||
fi
|
||
|
||
if [[ $skip == 1 ]]; then
|
||
if [[ ($line =~ $crap_continue[1]) ||
|
||
($line =~ $crap_continue[2]) ]]; then
|
||
((skipped += 1))
|
||
continue
|
||
else
|
||
# echo reset skip
|
||
echo -E "$begin_skip"
|
||
printf "${indent}... skipped \"already finalized\" crap ($skipped lines)\n"
|
||
skip=0
|
||
skipped=0
|
||
fi
|
||
fi
|
||
|
||
echo -E "$line"
|
||
done
|
||
}
|
||
|
||
|
||
# We use non-breaking space to encode newlines in multiline messages
|
||
function decode-multiline-message {
|
||
stdbuf -oL sed -e 's| |\n |g'
|
||
}
|
||
|
||
function gnome-shell-exe-path {
|
||
if uname -a | grep --silent "NixOS"; then
|
||
echo $(dirname =gnome-shell(:A))/.gnome-shell-wrapped
|
||
else
|
||
echo =gnome-shell
|
||
fi
|
||
}
|
||
|
||
function procees {
|
||
jq --unbuffered --raw-output '
|
||
{ts: .__REALTIME_TIMESTAMP, message: .MESSAGE}
|
||
| @sh "TS=\(.ts); MESSAGE=\(.message)\u0000"
|
||
' | while read -r -d $'\0' DATA; do
|
||
eval $DATA
|
||
|
||
TS=$((TS/1000000))
|
||
|
||
PP_TS=$(date -d @${TS} +'%T')
|
||
|
||
if [[ $MESSAGE == *$'\n'* ]]; then
|
||
echo $PP_TS:
|
||
echo -E $MESSAGE | sed 's/^/ /'
|
||
else
|
||
echo -E "$PP_TS: $MESSAGE"
|
||
fi
|
||
done
|
||
|
||
}
|
||
|
||
journalctl --follow --lines 400 -o json --output-fields MESSAGE \
|
||
$@ $(gnome-shell-exe-path) \
|
||
| procees \
|
||
| skip-crap \
|
||
| decode-multiline-message
|
||
|
||
|