log.sh

#!/bin/echo Warnning, this library must only be sourced!
# vim: set expandtab smarttab shiftwidth=4 tabstop=4:

#
# Author: tuantuan.lv <tuantuan.lv@alibaba-inc.com>
# Description: a simple log library for pet
#

# Create the log file if not exists
# $1: the log file name
function _create_logfile()
{
    # FIXME: change the permission of log file
    if [ ! -f "$1" ]; then
        mkdir -p `dirname $1`; touch $1; chmod 666 $1
    fi
}

#
# Prevent the pet log library to be sourced again, so we can protect
# the log file to be created only once.
#
function _prevent_sourced_again()
{
    _petlog_sourced_="__petlog_sourced_$$__"

    if [ -n "${!_petlog_sourced_}" ]; then
        return
    fi

    eval "$_petlog_sourced_=1"

    # Set the default log file path
    if [ -f "$0" ]; then # Use the script name (not including the extension)
        _petlog_filename="/tmp/$(basename $0 | awk -F. '{print $1}').log.`date +'%Y%m%d'`"
    else # Otherwise, just using the default name
        _petlog_filename="/tmp/petlog.log.`date +'%Y%m%d'`"
    fi

    _create_logfile "$_petlog_filename"

    # The log level, we only print logs whose level less than this
    _petlog_level=3                                      # DEBUG
    # The log data format
    _petlog_datefmt='%Y-%m-%d %H:%M:%S'                  # 2014-11-11 11:11:11
    # The log line format
    _petlog_fmt="[<levelname>] [<asctime>] <message>"    # [DEUBG] [2014-11-11 11:11:11] a simple log
}

# Print log messages
# $1: The log level number
# $2: C-style printf format string
# $3..$N: C-style printf arguments
function _print_log()
{
    local level=$1 msg="$2" fmt="${_petlog_fmt}"
    local levelnames=('ERROR' 'WARNING' 'INFO' 'DEBUG')
    local logcolors=('red' 'yellow' 'green' '')

    # Prepare the log format strings
    fmt="${fmt//<asctime>/$(date +"$_petlog_datefmt")}"
    fmt="${fmt//<message>/$msg}"
    fmt="${fmt//<levelname>/${levelnames[$level]}}"

    # We also decide to print all the log messages to the log file
    shift 2 && printf "$fmt" "$@" >> $_petlog_filename

    # Only print the log whose level less than the log level we set before
    if [ $level -le $_petlog_level ]; then
        ${logcolors[level]:-printf} "$fmt" "$@"
    fi
}

#
# Make the strings to be echoed as differnt colors
#
function red() { printf "\033[1;31m$(echo "$1" | sed -r 's/(\\n)?$/\\033[0m\1/')" "${@:2}"; }
function yellow() { printf "\033[1;33m$(echo "$1" | sed -r 's/(\\n)?$/\\033[0m\1/')" "${@:2}"; }
function green() { printf "\033[1;32m$(echo "$1" | sed -r 's/(\\n)?$/\\033[0m\1/')" "${@:2}"; }
function blue() { printf "\033[1;34m$(echo "$1" | sed -r 's/(\\n)?$/\\033[0m\1/')" "${@:2}"; }
function cyan() { printf "\033[1;36m$(echo "$1" | sed -r 's/(\\n)?$/\\033[0m\1/')" "${@:2}"; }
function purple() { printf "\033[1;35m$(echo "$1" | sed -r 's/(\\n)?$/\\033[0m\1/')" "${@:2}"; }

#
# Log print functions, such as debug_msg, info_msg... etc.
#
# Define the log level constants, just for convenience
LOG_QUIET=-1 LOG_ERROR=0 LOG_WARNING=1 LOG_INFO=2 LOG_DEBUG=3

function debug_msg() { _print_log $LOG_DEBUG "$1" "${@:2}"; }
function info_msg() { _print_log $LOG_INFO "$1" "${@:2}"; }
function warn_msg() { _print_log $LOG_WARNING "$1" "${@:2}"; }
function error_msg() { _print_log $LOG_ERROR "$1" "${@:2}"; return 1; }
function die_msg() { error_msg "$@"; exit 1; }
function exit_msg() { die_msg "$@"; } # should be deprecated, use die_msg instead
function warning_msg() { warn_msg "$@"; } # the same as warn_msg

#
# Customize the log functions
#
# Set the default log file
# $1: the log filename
function set_logfile()
{
    if [ -z "$1" ]; then
        die_msg "the log filename is empty\n"
    fi

    _petlog_filename="$1"
    _create_logfile "$_petlog_filename"
}

# Get the log filename
function get_logfile() { echo "$_petlog_filename"; }

# Set the default log level
# $1: level name or level number
function set_loglevel()
{
    if echo "$1" | grep -qE "^(-1|0|1|2|3)$"; then
        _petlog_level="$1"
    elif echo "$1" | grep -qE '^LOG_(QUIET|DEBUG|INFO|ERROR|WARNING)$'; then
        _petlog_level="${!1}"
    else
        die_msg "the log level is not valid, please check\n"
    fi
}

# Set log format
function set_logfmt()
{
    if [ -z "$1" ]; then
        die_msg "the log format is empty, please check\n"
    fi

    _petlog_fmt="$1"
}

# Set the log date format
# $1: the log date format, see `man data`
function set_logdatefmt()
{
    if [ -z "$1" ]; then
        die_msg "the log data format is empty, please check\n"
    fi

    _petlog_datefmt="$1"
}

_prevent_sourced_again # Yeah, prevent to be sourced again
#!/bin/bash
. ./log.sh

echo "1. use default log settings"
echo

debug_msg "hello,world\n"
info_msg 'hello,world\n'
warn_msg 'hello,world\n'
warning_msg 'hello,world\n'
error_msg 'hello,world\n'
g
echo
echo "2. set loglevel to $LOG_INFO"
echo

set_loglevel $LOG_INFO
debug_msg "hello,world\n"
info_msg 'hello,world\n'
warn_msg 'hello,world\n'
error_msg 'hello,world\n'

echo
echo "3. set log fmt to [<asctime> - <levelname>] <message>"
echo

set_logfmt "[<asctime> - <levelname>] <message>"
info_msg 'hello,%s\n' world
warn_msg 'hello,%s\n' pet

echo
echo "4. set date fmt to %Y/%m/%d %H:%M:%S"
echo

set_logdatefmt "%Y/%m/%d %H:%M:%S"
info_msg 'hello,world\n'
warn_msg 'hello,world\n'

echo
echo '5. use colorful print'
echo

red "hello,world\n"
green "hello,world\n"
yellow "hello,world\n"
cyan "hello,world\n"
purple "hello,world\n"
blue "hello,world\n"

echo
echo '6. exit script'
echo
die_msg "exit script\n"
posted @ 2017-01-05 15:09  苏小北1024  阅读(266)  评论(0编辑  收藏  举报