Viewlog Log-Streamer CLI

Description:
 View a number of live log feeds from the entire cluster in a single stream
 Or just a single server, should you prefer.
 Further capabilities allow searching all archived logs for upto 2 keywords at a time.

 Also view a number of other logs depending on your cluster’s features
 including Raffle Logs, API Logs, as well as viewing and searching your ArkShop Logs.

Usage:

   viewlog -a                  – View this session’s ServerLogs (All Maps) (LIVE)
   viewlog -o <map>            – View this session’s ServerLog (One Map) (LIVE)
   viewlog -s <search>         – Search ALL EXISTING Serverlogs (All Maps)
   viewlog -s1 <map> <search>  – Search ALL EXISTING Serverlogs (All Maps)

   viewlog -as            – View All ArkShop Logs (LIVE)
   viewlog -sas <search>  – Search All ArkShop logs

   viewlog -r             – View the Raffle Logs (LIVE)
   viewlog -w             – View the Raffle Winners Log  

   viewlog -api           – View this session’s ArkAPI Logs  

 Map Keys:
   Abe Ext Rag Ast Isl Gen  

 Examples:
   viewlog -a
   viewlog -o ast
   viewlog -s Player
   viewlog -s Player Froze
   viewlog -sas Astraeos

Download viewlog.sh

#!/bin/bash
# tail logfiles
#
####################
# CONFIGURATION
####################

# Raffle Logfile Locations
Raffle_log="/c/Ark/Raffle/raffle-log.txt"
Raffle_win="/c/Ark/Raffle/raffle-winners.txt"

# ARK SERVERS
declare -A SERVER_PATHS=(
    [Island]="/C/ARK/Island"
    [Ragnarok]="/C/ARK/Ragnarok"
    [Aberration]="/C/ARK/Aberration"
    [Extinction]="/C/ARK/Extinction"
    [Astraeos]="/C/ARK/Astraeos"
    [Genesis]="/C/ARK/Genesis"
)

# Server Title Colours
BOLD="\033[1m"

CLR_ISL="${BOLD}\033[38;5;105m"
CLR_RAG="${BOLD}\033[38;5;143m"
CLR_ABE="${BOLD}\033[38;5;79m"
CLR_EXT="${BOLD}\033[38;5;175m"
CLR_AST="${BOLD}\033[38;5;191m"
CLR_GEN="${BOLD}\033[38;5;189m"

declare -A SERVER_COLOURS=(
    [Island]="$CLR_ISL"
    [Ragnarok]="$CLR_RAG"
    [Aberration]="$CLR_ABE"
    [Extinction]="$CLR_EXT"
    [Astraeos]="$CLR_AST"
    [Genesis]="$CLR_GEN"
)

#
# END CONFIGURATION
#

VERSION="Viewlog v3.2.1"

####################
# DATA ARRAYS
####################

declare -A CURRENT_LOGS
declare -A SHOPLOGS
declare -A API_LOGS

shopt -s nullglob

ALL_LOGS=()

for map in "${!SERVER_PATHS[@]}"; do

    path="${SERVER_PATHS[$map]}"

    CURRENT_LOGS[$map]="$path/ShooterGame/Saved/Logs/ShooterGame.log"

    ALL_LOGS+=("$path/ShooterGame/Saved/Logs/"*.log)

    SHOPLOGS[$map]="$path/ShooterGame/Binaries/Win64/ArkApi/Plugins/ArkShop/"

    API_LOGS[$map]="$path/ShooterGame/Binaries/Win64/logs"

done

shopt -u nullglob

# Generate map keys from first 3 letters of map-name - eg: extinction > ext
all=""
for map in "${!CURRENT_LOGS[@]}"; do
    all+="${map:0:3} "
done

####################
# COLOUR VARIABLES
####################

# Terminal Formatting
RESET="\033[0m"


# UI Colours
CLR_RED="\033[38;5;196m"  # Bright Red
CLR_GREEN="\033[38;5;46m" # Bright Lime Green

CLR_GOLD="\033[38;5;226m"         # Gold
CLR_PURPLE="\033[38;5;141m"       # Light Purple / Lavender
CLR_BLUE="\033[38;5;4m"           # Bright Sky Blue
CLR_DGREEN="\033[38;5;2m"         # Dark Forest Green
CLR_ORANGE="\033[38;5;208m"       # Orange
CLR_AQUA="\033[38;5;51m"          # Aqua
CLR_PINK="\033[38;5;199m"         # PINK
CLR_TEXT="\033[38;5;250m"         # Light Grey
CLR_TITLE="\033[38;5;147m"        # Pale Blue
CLR_SAVE="\033[38;5;245m"         # Darker Grey
CLR_PAQUA="\033[38;5;195m"        # Pale Aqua
CLR_LEFT="\033[38;5;9m"           # Pale Red
CLR_HIDE="\033[38;5;234m"         # Almost Black
CLR_FROZEN="\033[38;5;147m"       # Pale Purple
CLR_TAMED="\033[38;5;146m"

set -e

####################
# FUNCTIONS
####################
usage() {
    echo
    echo -e "${CLR_TITLE}${BOLD}${VERSION}${RESET}"
    echo
    echo -e "${BOLD}Description:${RESET}"
    echo -e "  ${CLR_TEXT}View a number of live log feeds from the entire cluster in a single stream"
    echo -e "  ${CLR_TEXT}Or just a single server, should you prefer."
    echo -e "  ${CLR_TEXT}Further capabilities allow searching all archived logs for upto 2 keywords at a time."
    echo
    echo -e "  ${CLR_TEXT}Also view a number of other logs depending on your cluster's features"
    echo -e "  ${CLR_TEXT}including Raffle Logs, API Logs, as well as viewing and searching your ArkShop Logs.${RESET}"
    echo
    echo -e "${BOLD}Usage:${RESET}"
    echo
    echo -e "  ${CLR_TEXT}  viewlog -a                  - View this session's ServerLogs (All Maps)${CLR_GREEN} (LIVE)${CLR_TEXT}"
    echo -e "  ${CLR_TEXT}  viewlog -o <map>            - View this session's ServerLog (One Map)${CLR_GREEN} (LIVE)${CLR_TEXT}"
    echo -e "  ${CLR_TEXT}  viewlog -s <search>         - Search ${BOLD}ALL EXISTING${RESET}${CLR_TEXT} Serverlogs (All Maps)"
    echo -e "  ${CLR_TEXT}  viewlog -s1 <map> <search>  - Search ${BOLD}ALL EXISTING${RESET}${CLR_TEXT} Serverlogs (All Maps)"
    echo
    echo -e "  ${CLR_TEXT}  viewlog -as            - View All ArkShop Logs ${CLR_GREEN}(LIVE)${CLR_TEXT}"
    echo -e "  ${CLR_TEXT}  viewlog -sas <search>  - Search All ArkShop logs"
    echo
    echo -e "  ${CLR_TEXT}  viewlog -r             - View the Raffle Logs ${CLR_GREEN}(LIVE)"
    echo -e "  ${CLR_TEXT}  viewlog -w             - View the Raffle Winners Log ${RESET}"
    echo
    echo -e "  ${CLR_TEXT}  viewlog -api           - View this session's ArkAPI Logs ${RESET}"
    echo
    echo -e "  ${BOLD}Map Keys:${CLR_TEXT}"
    echo -e "    $all${RESET}"
    echo
    echo -e "  ${BOLD}Examples:${RESET}${CLR_TEXT}"
    echo -e "    viewlog -a"
    echo -e "    viewlog -o ast"
    echo -e "    viewlog -s Player"
    echo -e "    viewlog -s Player Froze"
    echo -e "    viewlog -sas Astraeos${RESET}"

    exit 1
}

#
# Server Logs
#
cmd_all() {
    echo
    echo "Loading Live Feed..."
    echo -e "${CLR_AQUA}${BOLD}  CTRL + C to Exit${RESET}"
    sleep 1
    tail -n 50 -F "${CURRENT_LOGS[@]}" | colour_logs
}

cmd_one() {
    echo
    echo "Loading Live Feed..."
    echo -e "${CLR_AQUA}${BOLD}  CTRL + C to Exit${RESET}"
    sleep 1

    shopt -s nocasematch
    for map in "${!CURRENT_LOGS[@]}"; do
        if [[ "${map:0:3}" == "$1" ]]; then
            server="${CURRENT_LOGS[$map]}"
            tail -n 500 -F "$server" | colour_logs
            shopt -u nocasematch
            return
        fi
    done
    shopt -u nocasematch

    echo "Unknown map: $1"
    exit 1
}

cmd_search() {
    echo "Searching ALL existing logs..."
    sleep 2

    if [[ -n $2 ]]; then
        grep -H -i --color=always "$1" "${ALL_LOGS[@]}" |
            grep -i --color=always "$2" |
            sed 's/<RichColor Color="1, 0, 0, 1">//g'
    else
        grep -H -i --color=always "$1" "${ALL_LOGS[@]}" |
            sed 's/<RichColor Color="1, 0, 0, 1">//g'
    fi
}

cmd_search_one() {
    local map_key="$1"
    local search="$2"

    echo "Searching ${map_key^^} logs..."
    sleep 1

    shopt -s nocasematch

    for map in "${!CURRENT_LOGS[@]}"; do
        if [[ "${map:0:3}" == "$map_key" ]]; then
            logdir="$(dirname "${CURRENT_LOGS[$map]}")"

            grep -H -i --color=always "$search" "$logdir"/*.log 2>/dev/null |
                sed 's/<RichColor Color="1, 0, 0, 1">//g'

            shopt -u nocasematch
            return
        fi
    done

    shopt -u nocasematch

    echo "Unknown map: $map_key"
    exit 1
}

#
# ArkAPI Logs
#
cmd_latest_api() {
    for server in "${!API_LOGS[@]}"; do
        logfile=$(ls -t "${API_LOGS[$server]}"/ArkApi_*.log 2>/dev/null | head -n1)

        echo -e "${CLR_DGREEN}───────────────────────────────────────────────────────────────────────────────────────────────────"
        echo -e "${BOLD}${CLR_AQUA}${server^^}:${RESET}${BOLD} $logfile ${RESET}"
        echo -e "${CLR_DGREEN}───────────────────────────────────────────────────────────────────────────────────────────────────${RESET}"
        cat "$logfile"
        echo -e "${CLR_PURPLE}──────────────────────────────────────────────── END LOG ───────────────────────────────────────────────────${RESET}"
        echo
    done
}

#
# Raffle logs
#
cmd_raffle() {
    echo
    echo "Loading Live Raffle Log..."
    echo -e "${CLR_AQUA}${BOLD}  CTRL + C to Exit${RESET}"
    sleep 1
    tail -n 100 -F "$Raffle_log" | colour_logs
}

cmd_winners() {
    echo
    echo "Loading Raffle Winners Log..."
    echo -e "${CLR_AQUA}${BOLD}  CTRL + C to Exit${RESET}"
    sleep 1
    tail -n 200 -F "$Raffle_win" | colour_logs
}

#
# Shop Logs
#
cmd_shop_logs() {
    echo
    echo "Loading Live Feed..."
    echo -e "${CLR_AQUA}${BOLD}  CTRL + C to Exit${RESET}"
    sleep 1
    tail -n 500 -F "${SHOPLOGS[@]}"/*.log | colour_shop_logs
}

cmd_shop_search() {
    echo "Searching existing logs..."
    sleep 1

    local logs=()

    for dir in "${SHOPLOGS[@]}"; do
        logs+=("$dir"/*.log)
    done

    grep -H -i --color=never "$1" "${logs[@]}" | colour_shop_logs
}

####################
# OUTPUT COLOURING
####################
colour_shop_logs() {
    while IFS= read -r line; do
        line=$(sed -E 's|.*/ShopLog_([^/]+)_WP\.log:|\1: |' <<<"$line")
        echo "$line"
    done
}

colour_logs() {
    shopt -s nocasematch

    while IFS= read -r line; do
        #Remove Richcolor Spam
        line=$(sed -E 's/<RichColor[^>]*>//g; s#</RichColor>##g' <<<"$line")

        line=$(sed -E 's|.*/ShopLog_([^/]+)_WP\.log:|\1: |' <<<"$line")

        # Server Log path to Simple Server Name
        for map in "${!SERVER_PATHS[@]}"; do
            path="${SERVER_PATHS[$map]}"

            if [[ "$line" == *"$path"* ]]; then
                echo -e "${SERVER_COLOURS[$map]}[$map]${RESET}"
                continue 2
            fi
        done

        # Remaining server activity colour-coding
        case $line in

            # Server Activity
            *ERROR*)    echo -e "${CLR_RED}$line${RESET}";;
            *warning*)    echo -e "${CLR_GOLD}$line${RESET}";;
            *info*)    echo -e "${CLR_DGREEN}$line${RESET}";;
            *Loaded\ Plugin*)    echo -e "${CLR_DGREEN}$line${RESET}";;

            # Player Activity
            *Tamed\ a*)    echo -e "${CLR_TAMED}$line${RESET}";;
            *FROZEN*)    echo -e "${CLR_FROZEN}$line${RESET}";;
            *KILLED*)   echo -e "${CLR_ORANGE}$line${RESET}";;
            *TRIBE*)    echo -e "${CLR_PAQUA}$line${RESET}";;
            *JOINED*)   echo -e "${CLR_GREEN}$line${RESET}";;
            *incoming*)   echo -e "${CLR_GREEN}$line${RESET}";;
            *LEFT*)     echo -e "${CLR_LEFT}$line${RESET}";;
            *upload\ terminal*)     echo -e "${CLR_LEFT}$line${RESET}";;

            # Server State & Map Updates
            *ADVERTISING*)      echo -e "${BOLD}${CLR_GOLD}$line${RESET}";;
            *SHUTDOWN*) echo -e "${BOLD}${CLR_PINK}$line${RESET}";;
            *WORLD*) echo -e "${CLR_SAVE}$line${RESET}";;
            *Garbage\ Collection*) echo -e "${CLR_HIDE}$line${RESET}";;

            # Genesis Mission
            *MISSION*) echo -e "${CLR_PURPLE}$line${RESET}";;

            # Raffle Logs
            *RAFFLE\ INITIATED*)    echo -e "${CLR_GOLD}$line${RESET}";;
            *Active\ Servers*)    echo -e "${CLR_AQUA}$line${RESET}";;
            *Excluded\ player*)    echo -e "${BOLD}${CLR_ORANGE}$line${RESET}";;
            *Querying\ players*)    echo -e "${CLR_PAQUA}$line${RESET}";;
            *Entry:*)               echo -e "${CLR_PAQUA}$line${RESET}";;
            *▶\ Winner*)               echo -e "${CLR_GREEN}$line${RESET}";;
            *▶*)               echo -e "${CLR_PURPLE}$line${RESET}";;
            *Eligible\ Players*)    echo -e "${BOLD}${CLR_AQUA}$line${RESET}";;
            *\ \-\ WINNER:*)    echo -e "${BOLD}${CLR_GREEN}$line${RESET}";;
            *sent\ to*)    echo -e "${BOLD}${CLR_GREEN}$line${RESET}";;
            *RAFFLE\ COMPLETE*)    echo -e "${CLR_GOLD}$line${RESET}";;

            *) echo "$line" ;;
        esac

    done

    shopt -u nocasematch
}

####################
# COMMANDS
####################
case "$1" in
    -o | --one)
        shift
        cmd_one "$1"
        ;;

    -s | --search)
        shift
        cmd_search "$@"
        ;;
    -s1 | --search-one)
        shift
        cmd_search_one "$@"
        ;;

    -a | --all)
        cmd_all "$@"
    ;;
    -r | --raffle)
        cmd_raffle "$@"
        ;;
    -w | --winners)
        cmd_winners "$@"
        ;;
    -as | --arkshop)
        cmd_shop_logs "$@"
        ;;
    -sas | --searcharkshop)
        shift
        cmd_shop_search "$@"
        ;;
    -api | --api)
        cmd_latest_api
        ;;
    *)
        usage
        ;;
esac