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()打印到哪里去了。
三种情况:
- 如果本地调试,那么,会出现在调试器控制台里。
- 如果是spring项目tomcat容器部署,那么,会在tomcat下logs/catalina.yyyy-MM-dd.out里。
- 如果不是部署在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,启动应用程序。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#/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}"`
在/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文件存放在哪里?
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/14555798.html