zoukankan      html  css  js  c++  java
  • 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 "33[1;31m$(echo "$1" | sed -r 's/(\n)?$/\033[0m1/')" "${@:2}"; }
    function yellow() { printf "33[1;33m$(echo "$1" | sed -r 's/(\n)?$/\033[0m1/')" "${@:2}"; }
    function green() { printf "33[1;32m$(echo "$1" | sed -r 's/(\n)?$/\033[0m1/')" "${@:2}"; }
    function blue() { printf "33[1;34m$(echo "$1" | sed -r 's/(\n)?$/\033[0m1/')" "${@:2}"; }
    function cyan() { printf "33[1;36m$(echo "$1" | sed -r 's/(\n)?$/\033[0m1/')" "${@:2}"; }
    function purple() { printf "33[1;35m$(echo "$1" | sed -r 's/(\n)?$/\033[0m1/')" "${@: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
    "
        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
    "
        fi
    }
    
    # Set log format
    function set_logfmt()
    {
        if [ -z "$1" ]; then
            die_msg "the log format is empty, please check
    "
        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
    "
        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
    "
    info_msg 'hello,world
    '
    warn_msg 'hello,world
    '
    warning_msg 'hello,world
    '
    error_msg 'hello,world
    '
    g
    echo
    echo "2. set loglevel to $LOG_INFO"
    echo
    
    set_loglevel $LOG_INFO
    debug_msg "hello,world
    "
    info_msg 'hello,world
    '
    warn_msg 'hello,world
    '
    error_msg 'hello,world
    '
    
    echo
    echo "3. set log fmt to [<asctime> - <levelname>] <message>"
    echo
    
    set_logfmt "[<asctime> - <levelname>] <message>"
    info_msg 'hello,%s
    ' world
    warn_msg 'hello,%s
    ' 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
    '
    warn_msg 'hello,world
    '
    
    echo
    echo '5. use colorful print'
    echo
    
    red "hello,world
    "
    green "hello,world
    "
    yellow "hello,world
    "
    cyan "hello,world
    "
    purple "hello,world
    "
    blue "hello,world
    "
    
    echo
    echo '6. exit script'
    echo
    die_msg "exit script
    "
    
  • 相关阅读:
    记录:2019-06-15
    安卓APP环境搭建
    delphi 各版本的特性
    php.ini文件下载
    mysql数据库目录my.ini的内容
    Windows2008 R2 X64 PHP环境搭建步骤
    窗口关闭时弹出内存不能为read
    Delphi编译选项
    Android中EditText无法再次获得焦点
    Android设置分隔线
  • 原文地址:https://www.cnblogs.com/muahao/p/6252447.html
Copyright © 2011-2022 走看看