nohup.out过大导致磁盘爆满

刚被告知服务器磁盘严重预警,最近刚加大的磁盘感觉有点诡异,于是跟踪排查了一下,最终发现是Elasticsearch的启动方式导致的。在此记录一下排查步骤,以备后用。

问题排查

第一步:肯定是确认磁盘占用率

 df -h

查看磁盘占用率的确超过80%

第二步:查找大目录

 du -h --max-depth=1

跟踪到文件目录为logstash的bin目录

第三步:定位大文件

ls -lht

第四步:保留最近1万条数据,清空nohup.out

log=`tail -n 10000 nohup.out`; 
echo "$log" > nohup.out 

至此磁盘占用率恢复正常

原因回顾

为了使我们的项目不会因为其他原因而挂掉,大家一般会使用nohup命令,我这个最初启动logstash的脚本也是

nohup ./logstash -f start.conf &

用nohup命令会在当前的目录产生一个nohup.out的日志文件,时间长了磁盘消耗很大。elasticsearch吃内存,logstash吃磁盘,这就很尴尬了。

扩展阅读

1. nohup.out的由来及作用

用途:LINUX命令用法,不挂断地运行命令。

语法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 &( 表示“and”的符号)到命令尾部。

例子: nohup ./startWeblogic.sh & 意思是即使退出ssh界面,命令仍然在后台执行,并且打印过程日志到nohup.out,当然也可以将nohup.out的输出转向到其他文件

2. nohup.out的查看方法

实际使用过程中往往因为懒,经常没有给nohup.out进行重定向输出,也没有按日期分割文件,会造成这个文件特别巨大,这个使用想查看文件,搜索出错内容就比较痛苦了。一般有两种方式:

  • linux本机查看:使用tail 命令查看最新的日志,或滚动监控日志打印。

tail -1000 nohup.out (查看最后1000行日志文本) 
tail -f nohup.out(监控日志打印)
  • 采用Ftp等工具下载到本地,用编辑器查看

3. nohup.out维护管理方法

如果直接使用rm -rf nohup.out删除,目录中没有这个文件了,但是磁盘空间还是没有减少。这是因为我们的项目正在使用中,就像我们熟悉的Windos系统打开一个文件你是无法删除的。

这种问题处理办法:

  • 关闭当前的服务,rm -rf 直接删掉,启动服务。生产环境勿用。

  • 清空nohup.out,这个不需要关闭服务

第一种:echo ''  > nohup.out
第一种:cp /dev/null nohup.out
第三种:cat /dev/null > nohup.out

4. 一劳永逸解决nohup.out文件过大的问题

以下是定义日志打印级别,除了高于级别2的告警信息记录到log文件外,其余直接不记录

# 只输出错误信息到日志文件
nohup ./logstash - f start.conf  > /dev/null 2 > log &

# 指定到黑洞目录,什么信息也不要
nohup ./logstash - f  > /dev/null 2 > &1 &

Linux的三种重定向

  • 0: 表示标准输入
  • 1: 标准输出,在一般使用时默认的是标准输出
  • 2: 标准错误信息输出,可以用来指定需要重定向的标准输入或输出

    例如将某个程序的错误信息输出到log文件中:./program 2 > log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。另外也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。

    关于/dev/null文件

    Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。



作者:聂云⻜
链接:https://www.jianshu.com/p/d0f55a25486b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<think>我们正在讨论Java/Kotlin应用的日志查看和存储路径问题。根据用户需求,需要明确如何查看日志以及日志文件在系统中的存储位置。 注意:日志的存储路径和查看方式取决于具体的日志框架和配置。常见的日志框架有Log4j、Logback、java.util.logging等,而Spring Boot默认使用Logback。 步骤: 1. 首先,日志的存储路径不是固定的,它由日志配置文件决定。 2. 在Spring Boot应用中,默认的日志配置通常在`application.properties`或`application.yml`中设置。 3. 如果没有特别配置,Spring Boot默认将日志输出到控制台,不会写入文件。如果需要写入文件,则必须进行配置。 常见的配置项(以Logback为例,在application.properties中): - `logging.file.name` 或 `logging.file.path`:用于指定日志文件的位置和名称。 - `logging.file.name`:设置具体的日志文件名(可以包含路径),例如`myapp.log`,则会在当前目录生成`myapp.log`文件;如果指定路径如`/var/log/myapp.log`,则生成在指定路径。 - `logging.file.path`:设置日志文件的目录,Spring Boot会自动在该目录下生成名为`spring.log`的文件。 注意:如果同时指定了`logging.file.name`和`logging.file.path`,则`logging.file.name`生效。 4. 查看日志的方式: - 如果配置了日志文件,直接查看该文件即可。 - 如果没有配置日志文件,但部署在服务器上,可能会使用系统日志服务(如syslog)或者将日志重定向到文件(通过启动脚本)。 5. 另外,在开发环境中,我们通常可以在IDE的控制台查看日志。 6. 对于生产环境,日志路径可能因部署方式(如Docker容器、普通服务器)而不同。 因此,我们需要根据实际配置来确定日志路径。 示例配置: 在`application.properties`中: logging.file.name=/var/log/myapp.log 那么日志文件就在`/var/log/myapp.log`。 如果没有配置,则默认只输出到控制台。 另外,Spring Boot也支持使用自定义的Logback配置文件(如`logback-spring.xml`),此时日志的存储位置由该文件中的配置决定。 总结步骤: 1. 检查应用配置文件(application.properties/yml)中是否有`logging.file.name`或`logging.file.path`配置。 2. 如果没有,检查是否使用了自定义的日志配置文件(如`logback-spring.xml`),并查看其中的配置。 3. 如果都没有配置,则日志不会写入文件,只能从控制台获取(此时需要确保在启动时将控制台输出重定向到文件,例如使用`nohup`命令或者Docker的日志驱动)。 在Linux服务器上,如果使用systemd服务启动,可能会配置日志重定向,此时需要查看服务的配置文件。 因此,用户需要根据自己项目的配置来确定日志路径。 为了帮助用户,我们可以给出常见的默认行为: - 如果配置了`logging.file.path`(例如`logging.file.path=/var/log`),那么日志文件路径为`/var/log/spring.log`。 - 如果配置了`logging.file.name`(例如`logging.file.name=myapp.log`),那么文件路径为当前工作目录下的`myapp.log`;如果指定了绝对路径,则位于该绝对路径。 另外,Spring Boot默认的日志文件会在文件小达到10MB时进行轮转(rolling),并生成类似`spring.log.1.gz`的压缩文件。 如何查看日志: - 使用`tail`命令:`tail -f /var/log/myapp.log` - 使用文本编辑器或查看工具。 考虑到用户可能使用不同的环境,我们应建议用户检查自己的日志配置。 生成相关问题: 1. 如何在Spring Boot中配置Logback日志? 2. 如何将日志同时输出到控制台和文件? 3. 如何设置日志轮转(rolling)策略? 4. 在Docker容器中如何查看Java/Kotlin应用的日志? 根据以上分析,给出回答。</think>### Java/Kotlin 应用日志查看与存储路径指南 #### 一、日志查看方式 1. **控制台输出** 开发环境中,日志默认输出到 IDE 控制台(如 IntelliJ IDEA)。通过 `System.out.println()` 或日志框架(如 Logback/SLF4J)直接查看实时日志。 2. **日志文件查看** ```bash # 使用 tail 命令实时追踪日志 tail -f /path/to/your/app.log # 使用 grep 过滤关键信息 grep "ERROR" /var/log/app/app.log ``` 3. **日志管理工具** - ELK Stack(Elasticsearch + Logstash + Kibana) - Splunk - Grafana Loki 适用于集中管理分布式系统的日志[^1]。 #### 二、日志存储路径 日志路径**由日志框架配置决定**,常见位置如下: 1. **默认路径(Spring Boot)** - 未配置时,默认**不生成日志文件**(仅控制台输出) - 若配置 `logging.file.name` 或 `logging.file.path`: ```properties # application.properties 示例 logging.file.name=/var/log/myapp/app.log # 完整路径 logging.file.path=logs/ # 目录路径,生成 spring.log ``` - Linux: `/var/log/` - Windows: `C:\ProgramData\app\logs\` 2. **自定义配置路径(Logback)** 在 `logback-spring.xml` 中指定路径: ```xml <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>/opt/app/logs/application.log</file> </appender> ``` 3. **容器环境路径** - **Docker 容器**: 日志存储在容器内部,需挂载卷到宿主机: ```bash docker run -v /host/logs:/app/logs my-app-image ``` - **Kubernetes**: 通过 PersistentVolume 挂载到 `/var/log/pods`[^2]。 #### 三、关键配置说明 | 配置项 | 作用 | 示例值 | |-------------------------|-----------------------------|---------------------------| | `logging.file.name` | 指定完整日志文件路径 | `/var/log/app.log` | | `logging.file.path` | 指定日志目录(自动生成文件名) | `/opt/logs` | | `logging.pattern.file` | 自定义日志格式 | `%d{yyyy-MM-dd} %msg%n` | | `logging.level.root` | 设置全局日志级别 | `INFO` | > ⚠️ **注意**:生产环境务必配置日志轮转(Log Rotation),避免磁盘爆满。Logback 示例配置: > ```xml > <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> > <file>app.log</file> > <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> > <fileNamePattern>app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> > <maxFileSize>100MB</maxFileSize> > <maxHistory>30</maxHistory> > </rollingPolicy> > </appender> > ``` #### 四、常见日志框架 1. **SLF4J + Logback**(Spring Boot 默认) 2. **Log4j 2** 3. **java.util.logging (JUL)** --- ### 相关问题 1. 如何在 Spring Boot 中自定义 Logback 的日志格式和分级? 2. Docker 容器中如何将 Java 日志实时输出到宿主机? 3. 日志过导致磁盘空间不足时,如何配置自动压缩和删除旧日志? 4. 如何在 Kotlin 中使用 SLF4J 实现结构化日志(JSON 格式)? [^1]: Spring Boot 官方文档明确说明日志路径需主动配置,未配置时仅控制台输出。 [^2]: Kubernetes 官方文档指出容器日志默认存储在 `/var/log/pods`,但需 volume 挂载实现持久化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值