Java应用的日志通常分布在以下位置,需根据部署方式选择:
my-webapp.service),使用journalctl命令查看服务专属日志:sudo journalctl -u your-java-service.service # 查看指定服务日志 sudo journalctl -f -n 1000 -u your-java-service.service # 实时查看最新1000行 $CATALINA_HOME/logs/catalina.out(标准输出)、localhost.<date>.log(本地主机日志);spring-boot.log(路径可通过logging.file.name配置),或logs/目录下的应用日志;log4j.properties、logback.xml)中的file.path设置。/var/log/java/目录下生成hs_err_pid<pid>.log文件(<pid>为Java进程ID),包含崩溃原因(如内存溢出、非法指令)。使用grep命令过滤日志中的关键信息,快速定位异常:
grep -i "error" /path/to/app.log # 不区分大小写搜索error grep -i "exception" /path/to/app.log # 不区分大小写搜索exception OutOfMemoryError):grep -E "OutOfMemoryError|Deadlock|NullPointerException" /path/to/app.log tail -f结合grep实时查看新增错误日志:tail -f /path/to/app.log | grep -i "error" NullPointerException):grep -c "NullPointerException" /path/to/app.log java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/app/gc.log -jar your-app.jar 使用VisualVM、GCViewer等工具打开gc.log,查看GC频率、耗时、内存占用趋势,判断是否存在内存泄漏(如老年代持续增长)。hs_err_pid<pid>.log文件,重点关注以下内容: OutOfMemoryError: Java heap space、StackOverflowError);对于海量日志,可使用工具提高分析效率:
awk:提取日志中的特定字段(如时间戳、类名):awk '{print $1, $2, $4}' /path/to/app.log # 提取第1、2、4列(假设为时间、级别、类名) sed:提取包含关键字的行并格式化:sed -n '/ERROR/{s/.*\[(.*?)\].*/\1/p}' /path/to/app.log # 提取ERROR级别及类名 根据日志中的关键字快速关联常见Java问题:
OutOfMemoryError,查看GC日志中的老年代使用率(若持续接近100%),需调整JVM内存参数(-Xms初始堆大小、-Xmx最大堆大小)。Deadlock,查看线程转储(jstack <pid> > thread_dump.txt),分析线程阻塞链(如多个线程互相等待锁)。NullPointerException,查看堆栈中的对象引用,添加空指针检查(如if (obj != null))。通过以上方法,可系统性地从Ubuntu Java日志中提取关键信息,快速定位并解决问题。需根据实际场景选择合适的方法(如小日志用grep,大日志用ELK),并结合常见错误模式提高排查效率。