zoukankan      html  css  js  c++  java
  • weblogic每天日志合并shell脚本 [个人记录]【转】【补】

     from RogerZhu modified by King

    sh logback.rb "/data/logs/" "/tmp/domain" "analysis esb"

    相关文件下载地址

    https://pan.baidu.com/s/1qY7ggW0  参见 固定脚本无参方式 

    目录结构如下

    /data/script/logback目录下有文件(该目录用于存放需要执行的shell脚本,shell可以以任何后缀结尾,这里定义为.rb是因为editplus文本编辑器可以着色显示rb文件中的关键字)

    logback.rb
    logMerge.rb

    /data/tarPath目录下暂无文件(该目录用于存放压缩后的tar文件)

    ..

    /data/bea/weblogic11/user_projects/domains/zsins_domain/servers/esb_server/logs有文件

    access.log       
    access.log00001  
    access.log00002  
    access.log00003  
    access.log00004  
    access.log00005  
    access.log00006   
    diagnostic_images
    esb_server.log     
    esb_server.log00027
    esb_server.log00028
    esb_server.log00029
    esb_server.log00030
    esb_server.log00031
    esb_server.log00032
    esb_server.log00033
    esb_server.out     
    esb_server.out00001
    esb_server.out00002
    esb_server.out00003
    esb_server.out00004

    主shell文件logback.rb

    ##进入logback.rb所在文件目录
    logbackScriptPath=/data/script/logback/
    ##logbackScriptPath=$(cd "$(dirname "$0")" && pwd)该语句可以动态获取当前执行文件所在目录
    ##定义压缩后的tar文件存放路径
    tarTargetPath=/data/tarPath/
    cd $logbackScriptPath
    ##定义domain所在地
    domainPath=/data/bea/weblogic11/user_projects/domains/base_domain
    #定义域名domain/server/下的需要做日志合并的几个server文件夹名 用空格分隔,如"esb_server ilog_server"
    multiServers="esb_server"
    ##定义当天的lock文件名
    #old:    lockfile="`date +%Y%m%d`.lock"
    lockfile=$(date +%Y%m%d).lock
    ##判断当前lockback.rb所在文件目录中是否存在lockfile文件名,如存在则表明已执行过,不存在则表明今天还未执行过
    if [ -e $lockfile ] 
    then
        echo "程序今日已执行"
        exit
    else
        echo "backup begin"
    fi
    
    ##for循环server名,当localservers = esb_server,以此类推,in中包含几个则循环几次
    for serName in $multiServers
    do
        ##创建各系统的独立目录用以放置压缩文件
        systemTarPath=$tarTargetPath${serName}
        if [ ! -e $systemTarPath ]
            then
                mkdir $systemTarPath
            else
                echo $systemTarPath 已存在
        fi
    
        #参数定义
        #old:    back_path=`date +%Y%m%d`
        #old :    back_path=`echo "${back_path}_${serName}"`
        back_path=$(date +%Y%m%d)_${serName}
        echo -----------------------------------------------------------absolute backPath is : $logbackScriptPath$back_path
        
        cd $domainPath/servers
        
        if [ ! -e $back_path ]
            then
                mkdir $back_path
            else
                echo $back_path is existed
        fi
    
        echo -----------------------------------------------------------logback pwd is $(pwd)
        #调用其它shell脚本,并传2个参数,到时用$1 $2来分别取参
        sh $logbackScriptPath/logMerge.rb $serName $domainPath
        echo -----------------------------------------------------------logback pwd is $(pwd)
    
        mv $domainPath/servers/$serName/logs/${serName}_$(date +%Y%m%d).out        ./$back_path/
        mv $domainPath/servers/$serName/logs/${serName}_$(date +%Y%m%d).log        ./$back_path/
        mv $domainPath/servers/$serName/logs/access_$(date +%Y%m%d).log            ./$back_path/
        
        tar cvf $back_path.tar $back_path
        rm -rf ./$back_path
    
        mv ./$back_path.tar $systemTarPath
    done
    cd $logbackScriptPath
    echo 'backup finished...' >>$lockfile

    被引用shell文件logMerge.rb

    #对单个server下面的access.logXXXX,esb_server.outXXX,esb_server.logXXX做日志合并
    #serName=$1=esb_server  通过传参引用
    serName=$1
    #domainPath=$2=/data/bea/weblogic11/user_projects/domains/base_domain 通过传参引用
    domainPath=$2
    
    keepfile="${serName}.out"
    keepfilelog="${serName}.log"
    accesslog=access.log
    
    # old:    newdate=`date +%Y%m%d`
    newdate=$(date +%Y%m%d)
    
    cd $domainPath/servers/$serName/logs/
    
    ls -lrt ${keepfile}* | awk '{print $9;}' | while read filename
    do
        cat $filename >> ${serName}_${newdate}.out
        if [ $filename != $keepfile ]
            then
                rm $filename
            else
                echo 'null' > $filename
        fi
    done
    
    
    ls -lrt ${keepfilelog}* | awk '{print $9;}' | while read filename
    do
            cat $filename >> ${serName}_${newdate}.log
            if [ $filename != $keepfilelog ]
                    then
                            rm $filename
                    else
                            echo 'null' > $filename
            fi
    done
    
    
    ls -lrt ${accesslog}* | awk '{print $9;}' | while read filename
    do
            cat $filename >> access_${newdate}.log
            if [ $filename != $accesslog ]
                    then
                            rm $filename
                    else
                            echo 'null' > $filename
            fi
    done
    
    echo -----------------------------------------------------------logMerge pwd is $(pwd)

    开始执行以上shell脚本,如果异常,请参考下一小节"特别声明"

    控制台显示如下表示正常执行,而且在/data/script/logback目录会生成一个今日已执行的日志文件

    [weblogic@dwxapptest logback]$ pwd
    /data/script/logback
    [weblogic@dwxapptest logback]$ sh ./logbak.rb
    -----------------------------------------------------------back_path is 20170802_ping
    -----------------------------------------------------------logback pwd is /data/bea/weblogic11/user_projects/domains/base_domain/servers
    -----------------------------------------------------------logMerge pwd is /data/bea/weblogic11/user_projects/domains/base_domain/servers/ping/logs
    -----------------------------------------------------------logback pwd is /data/bea/weblogic11/user_projects/domains/base_domain/servers
    20170802_ping/
    20170802_ping/access_20170802.log
    20170802_ping/ping_20170802.log
    20170802_ping/ping_20170802.out
    [weblogic@dwxapptest logback]$

    完成在/data/tarPath目录下生成日志合并后的压缩文件

    20170802_esb_server.tar

    特别声明-编码问题

    快速解决入口--解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi'错误的问题【纯转】【$$$$$】 http://www.cnblogs.com/whatlonelytear/p/9060380.html

    由于windows环境生成的文件默认是ANSI编码的,而linux环境下默认的是UTF-8编码的.

    所以如果直接把以上shell脚本代码贴到windows的txt文件中,再上传到linux环境,其实由于编码不一致的问题,运行该shell脚本运行会报类似错误如下:

    : No such file or directoryta/script/logback/
    : command not found 
    logback.rb: line 18: syntax error near unexpected token `else'
    'ogback.rb: line 18: `else  

    从这个错误信息逆推,发现连打印数据都有丢失,于是怀疑是编码不一致导致的问题.

    那么如何确定windows和linux环境文件的编码呢,其中一个方法就是把文件都放到windows环境中,然后用文本编辑器打开,再另存为时会显示该文件默认编码.如下图所示:

    那么我们如何把ANSI文件转换成UTF-8文件呢,可按如下两步骤:

    • 把windows下的文件上传到linux系统
    • 在linux系统中,在当前文件所在目录执行以下语句,把ANSI转成UTF8
      iconv -f GBK -t UTF-8 logback.rb > logbackUTF-8.rb 

    iconv参考资料  

    http://blog.csdn.net/s1070/article/details/52302713

    http://blog.csdn.net/w1242245/article/details/20483183

    此时再把该logbackUTF-8.rb文件拉取到windows,会发现已经是UTF-8编码的了.

    用vi编缉器也可以对比出前后差异,发现原始logback.rb会乱码,而logbackUTF-8.rb显示正常

    但是linux下执行sh logback.rb还是报错,仔细对比之前linux环境成功的脚本文件,发现没有特别地差异了,于是还是怀疑windows环境修改的文件到linux后导致了异常.

    于是用vi -b logback.rb查看文件发现后面多了^M (之前遇到过这个问题)

    [weblogic@dwxapptest logback]$ vi -b logback.rb 
    
    ##进入lockback.rb所在文件目录^M
    logbackScriptPath=/data/script/logback/^M
    ##定义压缩后的tar文件存放路径^M
    tarTargetPath=/data/tarPath/^M
    cd $logbackScriptPath^M
    ##定义domain所在地^M
    domainPath=/data/temp/domain^M
    #定义域名domain/server/下的需要做日志合并的几个server文件夹名 用空格分隔,如 esb_server ilog_server^M
    multiServers=esb_server ^M
    ##定义当天的lock文件名^M
    #old:    lockfile="`date +%Y%m%d`.lock"^M
    lockfile=$(date +%Y%m%d).lock^M
    ##判断当前lockback.rb所在文件目录中是否存在lockfile文件名,如存在则表明已执行过,不存在则表明今天还未执行过^M
    if [ -e $lockfile ] ^M
    then^M
        echo "程序今日已执行"     >> $lockfile^M
        #exit^M
    else    ^M
        echo "backup begin"     >>$lockfile^M
    fi^M

    看来就是这些^M搞的鬼了,接下来我们去掉这些^M,用以下链接中的三种方式都可去掉.在此不详述.

    http://www.cnblogs.com/whatlonelytear/articles/7269202.html(我的笔记)

    syntax error near unexpected token 脚本报错误解决

     

    最后成功执行shell脚本.

    由于合并的是每天的日志,所以需要把2个shell脚本做成定时任务,每晚23:55:00左右开始执行一次

    我的logback3arg.rb记录 

    ##用以下带3参数的命令启动本程序sh logback3arg.rb "/data/tarPath/" "/tmp/domain" "esb_server ilog_server"
    
    sh /data/script/zsins_domain/logback/logback3arg.rb "/data/logs/zsins_domain_logs/" "/data/bea/weblogic11/user_projects/domains/zsins_domain" "esb_server ilog_server kingtool"
    
    sh /data/script/zsins_domain/logback/logback3arg.rb "/data/logs/other_domain_logs/" "/tmp/domain" "analysis"
    View Code

    其它参考

    Shell命令_Cron使用

    shell book

  • 相关阅读:
    0Day – 2011.01.26
    JQuery_PHP 开始新的旅途
    0Day – 2011.01.25
    0Day – 2011.02.04
    Delphi 必须的一致.
    0Day – 2011.01.28
    0Day – 2011.02.23[From B4A]
    足球 看球悲惨的回忆.
    Delphi – EurekaLog6.1.01Ent下载地址
    ubuntu 拨号
  • 原文地址:https://www.cnblogs.com/whatlonelytear/p/7274292.html
Copyright © 2011-2022 走看看