Fórum Ubuntu CZ/SK

Ostatní => Tipy a triky pro Linux => Téma založeno: juwa2 11 Května 2022, 23:10:52

Název: Logování všeho co projde Terminálem
Přispěvatel: juwa2 11 Května 2022, 23:10:52
Standardně se logují pouze zadávané příkazy (ale nikoli výstup!!) do
Kód: [Vybrat]
~/.bash_history
Což není příliš praktické.   :-\

Pokud chceme logovat vše co proběhne terminálem, tj. včetně výstupů (platí i pro tildu, xterm a konsole):

1.) Do souboru ~/.bashrc
přidáme řádek:
Kód: [Vybrat]
smart_script
(Pokud chceme logování "vypnout", stačí potom tento řádek zakomentovat #), žádná další akce není potřeba...


2.) Do souboru ~/.bash_aliases  (pokud tento soubor neexistuje tak ho vytvoříme) vložíme:
Kód: [Vybrat]
# Execute "script" command just once
smart_script(){
    # if there's no SCRIPT_LOG_FILE exported yet
    if [ -z "$SCRIPT_LOG_FILE" ]; then
        # make folder paths
        logdirparent=~/.local/terminal_logs
        logdirraw=raw/$(date +%F)
        logdir=$logdirparent/$logdirraw
        logfile=$logdir/$(date +%F_%T).$$.rawlog

        # if no folder exist - make one
        if [ ! -d $logdir ]; then
            mkdir -p $logdir
        fi

        export SCRIPT_LOG_FILE=$logfile
        export SCRIPT_LOG_PARENT_FOLDER=$logdirparent

        # quiet output if no args are passed
        if [ ! -z "$1" ]; then
            script -f $logfile
        else
            script -f -q $logfile
        fi

        exit
    fi
}

# Start logging into new file
alias startnewlog='unset SCRIPT_LOG_FILE && smart_script -v'

# Manually saves current log file: $ savelog logname
savelog(){
    # make folder path
    manualdir=$SCRIPT_LOG_PARENT_FOLDER/manual
    # if no folder exists - make one
    if [ ! -d $manualdir ]; then
        mkdir -p $manualdir
    fi
    # make log name
    logname=${SCRIPT_LOG_FILE##*/}
    logname=${logname%.*}
    # add user logname if passed as argument
    if [ ! -z $1 ]; then
        logname=$logname'_'$1
    fi
    # make filepaths
    txtfile=$manualdir/$logname'.txt'
    rawfile=$manualdir/$logname'.rawlog'
    # make .rawlog readable and save it to .txt file
    cat $SCRIPT_LOG_FILE | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > $txtfile
    # copy corresponding .rawfile
    cp $SCRIPT_LOG_FILE $rawfile
    printf 'Saved logs:\n    '$txtfile'\n    '$rawfile'\n'
}

Pro každou session (otevřený terminál) se vytvoří samostatný soubor (v ~/.local/terminal_logs/raw s timestampem).  Soubory jsou ve formátu RAW (přípona  .rawlog)

Příkaz k (pozdějšímu ručnímu) převodu souborů .rawlog na .txt (aby byly lépe čitelné, názvy/datum souborů zůstanou zachovány):
Kód: [Vybrat]
for f in *.rawlog; do cat "$f" | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > "${f%.rawlog}.txt"; done
Tento postup umožní lépe využít systém v případě různých problémů (debugging).   ;)
Jelikož stále častěji se v dotazech vyskytuje/opakuje situace:
Co jsi všechno do té doby a kdy instaloval?   - Nevím, nepamatuji se, odkud to mám jako zjistit??  :(
Cos tam zadával za příkazy?  - Nevím, nepamatuji si to už, prostě jsem tam něco zadal do terminálu a potvrdil, kdo si to má všechno pamatovat....
Hlavně dělejte, ať mi to zase honem funguje a neotravujte mě zbytečnými dotazy.....