
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
#!/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
