查看tomcat的日志
先切换到:cd usr/local/tomcat5/logs
tail -f catalina.out
这样运行时就可以实时查看运行日志了,Ctrl+c 是退出tail命令,alt+E+R重置
查看运行的java的控制台输出
程序正在运行会不定时System.out.println,但是每次把putty关闭后就看不到了。。。求解决方案、
原理:
linux提供了一个daemon函数,daemon主要做两件事:
1、创建子进程,退出当前进程,并且以子进程创建新会话。这样,就算父进程退出,子进程也不会被关闭
2、将标准输入,标准输出,标准错误都重定向/dev/null。Linux下这个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。
所以,想取回进程的控制台数据,只要将标准输出,标准错误重定向到指定文件,然后读取这个文件就好了。
第一个方法:
启动的时候,加一个重定向就好了。
java xxx.jar > stdout.txt
然后换一个终端去tail -f stdout.txt
第二个方法:
通过Linux的日志系统,daemon的调试信息通过syslog输出到log,然后tail -f log
http://www.cnblogs.com/yingsong/p/6022181.html
第三个方法:
改造应用程序,将日志输出到文件
https://blog.csdn.net/FuYaoPingBu/article/details/86300279
https://www.jianshu.com/p/969e47cefa78
怎样查看springboot内置tomcat的日志
strace实时查看进程日志输出
2016年05月26日 22:20:19 wwyyxx26 阅读数:6930
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwyyxx26/article/details/51510868
在linux下有的时候程序的运行出现问题了,但是这时如果没有将日志打印到文件,想查看一下日志的输出都看不了,停了程序重新跑又一时不能浮现问题,是一件很纠结的事情。
这个时候就可以利用strace 来变通的看一下日志,strace是一个用来跟踪进程执行时的系统调用和所接收的信号的程序会将程序的系统调用情况打印出来。而我们的日志输出,比如printf到了系统调用这一层,使用的是write,于是我们可以利用这一点动态的查看printf的输出。
比如如下命令来查看进程pid为1648的printf输出
strace -e trace=write -s 200 -f -p 1648
-e trace=write 的意思是设置一个表达式,用来控制如何跟踪,这里表示只跟踪write的系统调用情况
-s 200 的意思是字符串输出显示时的最大长度,默认是32个字节,对于printf的打印可能不够,这里我们设置为200
-f 的意思是需要跟踪子进程forks,这里对线程同样适用,不加这个参数只能输出main所在的线程的信息。
-p 1648 指定要跟踪的进程号为1648
然后,输出大概是这样的
27754 write(2, "[jt_close_video_stream]enter\n", 29) = 29
27754 write(2, "[get_device_by_stream]find device record, stm 0xf6300de8\n", 57) = 57
27754 write(2, "[hb_close_video_stream]\n", 24) = 24
27754 write(2, "[hb_close_video_stream]ip 192.168.40.10, port 8154\n", 51) = 51
27754 write(2, "[hb_close_video_stream]stm->playhandle==0, chn 0, stm 0, aready closed\n", 71) = 71
27754 write(2, "[LeaveSection]index 1973, type 4, time cost 1\n", 46) = 46
27754 write(2, "[static_task_with_parameter] leave, pend_cnt 0, total_cnt 83893\n", 64) = 64
27754 +++ exited with 0 +++
27755 write(2, "[static_task_with_parameter] enter\n", 35) = 35
27755 write(2, "[EnterSection]index 1974, type 3, time 143780434\n", 49) = 49
27755 write(2, "[Process]request->type 3\n", 25) = 25
27755 write(2, "[Process]OPENSTREAM VEDIO, userid=4130344424, 192.168.40.10, Channel=0, Codec=0, c3346a77\n", 90) = 90
27755 write(2, "[hb_open_video_stream]ip 192.168.40.10, port 8154\n", 50) = 50
27755 write(2, "[hb_open_video_stream]hbdev->DEVICECFG.dwDevType 0\n", 51) = 51
27755 write(2, "[hb_open_video_stream]before HB_NET_RealPlay -164611536, channel 0, nStream 0\n", 78) = 78
27755 write(2, "[JtAsynReceiver::Start]sem_wait before\n", 39) = 39
27755 write(2, "[JtAsynReceiver::Start]sem_wait after, res 0\n", 45) = 45
这里"[JtAsynReceiver::Start]sem_wait after, res 0\n"就是printf输出的内容
虽然可能有其他的write干扰,但这样变相的实现了查看printf的输出
如需要保存到文件则使用-o 参数
strace -o out.strace -e trace=write -s 200 -f -p 1648
docker内的java的日志
查询相关 docker 文档确认: 只有主进程 (pid 为1)的相关进程日志会输出到 stdout ,即可以通过docker logs查询
当我们通过run.sh作为启动脚本时,pid为1的是run.sh,tomcat是run.sh的子进程
如果我们需要通过docker logs查看docker内的java日志,需要更改 logback.xml 的 console 为 file, 或者更改镜像把 tomcat 的启动脚本直接作为主进程