buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

e.printStackTrace()打印到哪里去?

 

你问:e.printStackTrace()会打印到.log文件里吗?


我先举个例子,你来琢磨琢磨。套圈游戏大家应该都玩过,至少儿时玩过,规则很简单,花5块钱买20个套圈,然后你套中什么就拿走什么。如果你套中了小手枪,你能拿走旁边的BMWX7模型汽车吗?
显然不行,老板不会同意呀。
同样,你没有调用日志框架的api,诸如logger.error()/logger.warn()/logger.info(),你还想从log文件里看到日志,这也是不可能的。

 

那么,e.printStackTrace()的日志,print到哪里去了?

首先强调一下,也是所有的JAVA开发规范所指出的,程序里不允许出现e.printStackTrace()。

当然,规范是规范,日常开发过程中,e.printStackTrace()却也难免。而往往在排查生产问题时,碰巧就遇到了e.printStackTrace(),在log文件里没有日志,找不到线索,是不是一头雾水?所以,还是有必要知道e.printStackTrace()打印到哪里去了。

三种情况:

  1. 如果本地调试,那么,会出现在调试器控制台里。
  2. 如果是spring项目tomcat容器部署,那么,会在tomcat下logs/catalina.yyyy-MM-dd.out里。
  3. 如果不是部署在tomcat下,比如springboot项目,那么,就要看启动脚本了。

下面解释第三种情况。

在Jenkins环境发布系统上,构建某个springboot服务,我们来看一下控制台输出的最后几行log:

+ cd /var/lib/jenkins/workspace/test_channel-provider/channel-provider/target/
+ mv channel-provider-bin.zip channel-provider.zip
+ scp channel-provider.zip 192.168.40.84:/www/jenkins/publish
+ ssh 192.168.40.84 'nohup /www/jenkins/service_deployment.sh channel-provider zip > myout.file 2>&1'
Finished: SUCCESS

 其中,scp命令(security copy)用于以安全方式在主机之间复制文件,这里是将本地文件/var/lib/jenkins/workspace/test_channel-provider/channel-provider/target/channel-provider.zip 拷贝到远程服务器192.168.40.84下的指定目录/www/jenkins/publish。    后面的一行是执行nohup命令,并将结果输出到myout.fle里。 详解见后文附录。

 

Linux服务器上查看/www/jenkins/service_deployment.sh文件内容。从这个shell脚本可知,会将程序包从/www/jenkins/publish/拷贝到/www/service下,并解压缩程序包,然后执行解压后的程序目录里bin/server.sh,启动应用程序。

#/bin/bash


#--------------------------------变量--------------------------------------------------------
source /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
BUILD_ID=pleaseDontKillMe
curtime=`date +%Y%m%d_%H%M%S`                                       #当前时间     
date_dir=`date +%Y%m%d`                                             #路径
jk_home=/www/jenkins                                               #备份目录                       
backup_dir=/www/jenkins/backup                                     #tomcat备份路径    
publish_dir=/www/jenkins/publish                                   #jenkins 发布路径
tomcat_web_dir=/www/service                                        #tomcat webapp路径
tomcat_home_dir=/www/service                                        #tomcat启动路径
proc_name=$1                                                        #进程名称
ID=`ps -ef | grep -v "grep"|grep -v "tomcat_deployment"|grep -i ${proc_name} |awk '{print $2}'` #进程PID
log_dir=/www/$1/logs                                                  #追加输出日志 

#---------------------------创建服务备份----------------------------------------------------

echo "开始备份 $1 项目"
mkdir -p $backup_dir/$date_dir                                            #创建备份目录
cp -rf $tomcat_web_dir/$1/  $backup_dir/$date_dir/$1_$curtime              #备份
echo "备份 $1 项目完成"

#---------------------------关闭正在运行的服务-------------------------------------------------

echo "现在结束正在运行的 $1 进程"
$tomcat_home_dir/$1/bin/server.sh stop &                               #停止服务
sleep 10
$jk_home/shutdown.sh $1
#if [ -n "$ID" ]; then                                               #强杀服务
#    echo " 服务 $1 已被正常关闭"
#kill -9 $ID
#kill -9 $ID
#kill -9 $ID
#else
#    echo "$1 仍在运行,现在强制 kill 服务 $1" 
#sleep 15
#kill -9 $ID 
#kill -9 $ID 
#kill -9 $ID 
#kill -9 $ID 
#fi
java -version
#---------------------------更新新版本-------------------------------------------------------
echo "开始删除旧 $1 "
ls $tomcat_web_dir/$1/ | grep -v logs| xargs rm -rf
unzip -q -o $publish_dir/$1.$2 -d $tomcat_web_dir/
chmod 775 $tomcat_web_dir/$1/bin/server.sh
sleep 10
echo "更新 $1 项目文件完成"

#--------------------------- 重启服务--------------------------------------------------------
$tomcat_web_dir/$1/bin/server.sh start &
sleep 10

echo "启动 $1 项目完成,部署完成"
echo ${proc_name}" is start , pid:"  && echo `ps -ef | grep -v "grep" | grep  "${proc_name}" |awk "{print $2}"`
View Code

 

在/www/jenkins/publish/myout.file文件里,会有程序执行的log

[viewlog@localhost publish]$ cd /www/jenkins/publish
[viewlog@localhost publish]$ grep 'UMFFileClient' myout.file
Binary file myout.file matches
[viewlog@localhost publish]$ cat myout.file | grep 'UMFFileClient' -C50 |grep 'Exception' -c
236

 

 

↓↓相关Linux命令说明:

ssh 192.168.40.84 'nohup /www/jenkins/service_deployment.sh channel-provider zip > myout.file 2>&1' 执行指定服务器上的命令, 输出到myout.file文件里。至于myout.file的路径,与当前Jenkins任务的配置参数Remote-directory(/www/jenkins/publish)有关。当然,这里也可以直接指定为 /www/jenkins/publish/myout.file。

nohup /www/jenkins/service_deployment.sh channel-provider zip > myout.file 2>&1
nohup(no hang up的缩写)用途:不挂断地运行命令。
nohup ./start.sh & 默认输出到nohup.out文件
nohup ./start.sh >output 2>&1 & 指定输出到output文件
这里,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到output文件中。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。 【本案中nohup指定的myout.file,在其他服务器上也可能出现在当前用户目录下,比如/root(root用户)下】

scp channel-provider.zip 192.168.40.84:/www/jenkins/publish
scp 命令用于Linux机器之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。

mv channel-provider-bin.zip channel-provider.zip 文件重命名

chmod 775 $tomcat_web_dir/$1/bin/server.sh 给文件赋拥有者权限

 

↓↓附图:tomcat catalina.out截图

↓↓附图:springboot项目部署截图

 myout.file文件存放在哪里?

 

posted on 2021-03-25 13:36  buguge  阅读(3263)  评论(1编辑  收藏  举报