Spring Boot ⽇志

目录

1.⽇志使⽤

2.⽇志级别  

3.⽇志配置

3.1配置⽇志级别

 3.2⽇志持久化

3.3配置⽇志⽂件分割 

4.更简单的⽇志输出 


 

1.⽇志使⽤

在使用之前我们先来了解一下为什么要使用?

⽇志的⽤途
1.系统监控
我们可以通过⽇志记录这个系统的运⾏状态,对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警。
2.数据采集
数据采集是⼀个⽐较⼤的范围, 采集的数据可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等。
3.⽇志审计
通过系统⽇志分析,可以判断⼀些⾮法攻击, ⾮法调⽤,以及系统处理过程中的安全隐患

 ⽇志使⽤

SpringBoot 内置了⽇志框架 Slf4j , 我们可以直接在程序中调⽤ Slf4j 来输出⽇志 

1.在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory 

2.⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志 

代码1-1:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Logger")
@RestController
public class LoggerController {
    private  static Logger logger= LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/print")
    public void print(){
        logger.info("=======打印日志======");
    }
}

 结果:

 注意:Logger 对象是属于 org.slf4j 包下的, 不要导⼊错包.

从上图可以看到,⽇志输出内容元素具体如下: 

1.时间⽇期:精确到毫秒

2.⽇志级别

3.进程ID

4.线程名

5.Logger名(通常使⽤源代码的类名)

6.⽇志内容 


 

2.⽇志级别  

⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息。

⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE  

1.FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误

2.ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏

3. WARN: 警告信息, 不影响使⽤, 但需要注意的问题

4.INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息,

5.DEBUG: 调试信息, 需要调试时候的关键信息打印.

6.TRACE: 追踪信息

注意:⽇志级别通常和测试⼈员的Bug级别没有关系 

⽇志级别的使⽤

 ⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度

代码2-1: 

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Logger")
@RestController
public class LoggerController {
    private  static Logger logger= LoggerFactory.getLogger(LoggerController.class);

    @RequestMapping("/level")
    public void loggerLevel(){
        logger.error("=======error======");
        logger.warn("======warn======");
        logger.info("======info======");
        logger.debug("======debug======");
        logger.trace("======trace======");
    }
}

结果:

结果发现, 只打印了info, warn和error级别的⽇志
这与⽇志级别的配置有关, ⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就 是info, warn和error.

 


3.⽇志配置

3.1配置⽇志级别

yml配置
logging:
 level:
  root: debug    

 整个程序(root)⽇志的输出级别设置为debug级别 

 (也可以修改root,为具体路径)

重新运⾏上述代码2-1, 观察结果 

 

 3.2⽇志持久化

以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追 溯问题. 把⽇志保存下来就叫持久化. ⽇志持久化有两种⽅式:
1. 配置⽇志⽂件名
2. 配置⽇志的存储⽬录

1. 配置⽇志⽂件名

logging:
 file:
 name: logger/springboot.log

运行后:

 

 2.配置⽇志⽂件的保存路径

这种⽅式只能设置⽇志的路径, ⽂件名为固定的spring.log
logging:
 file:
  path: D:/temp

运行后:

注意:

logging.file.name logging.file.path 两个都配置的情况下, 只⽣效其⼀, 以 logging.file.name 为准

3.3配置⽇志⽂件分割 

如果我们的⽇志都放在⼀个⽂件中, 随着项⽬的运⾏, ⽇志⽂件会越来越⼤, 需要对⽇志⽂件进⾏分割
⽇志框架也帮我们考虑到了这⼀点, 所以如果不进⾏配置, 就⾛⾃动配置
默认⽇志⽂件超过10M就进⾏分割
logging:
 logback:
 rollingpolicy:
 max-file-size: 1KB
 file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
1.⽇志⽂件超过1KB就分割
2.分割后的⽇志⽂件名为: ⽇志名.⽇期.索引

 样图:


4.更简单的⽇志输出 

lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象 log, 我们直接使⽤就可以
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RequestMapping("/Logger2")
@RestController
public class LoggerApplication2 {

    @RequestMapping("/print2")
    public void log2(){
        log.info("--------------要输出⽇志的内容----------------");
    }
}

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

<think>嗯,用户之前已经问过Linux的常见指令,现在又问了关于部署项目到服务器后如何通过日定位报错的问题。看来用户可能是在实际工作中遇到了部署后的错误排查问题,需要具体的指导步骤。 首先,我需要确定用户对日分析的了解程度。他们可能已经知道一些基本指令,但需要更详细的流程。用户可能需要知道从哪里开始查找日,常见的日位置,以及分析日的方法。 接下来,我应该考虑不同应用场景下的日类型,比如Web服务器(Nginx/Apache)、应用日Java的Tomcat、Spring Boot)、数据库日(MySQL、Redis)、系统日(/var/log/messages)等。用户可能不清楚不同服务的日存储位置,需要给出具体路径和查看方法。 然后,分析日的常用工具,比如grep、tail、awk、sed,以及更高级的工具如ELK栈。用户可能需要基础的工具使用示例,比如实时查看日、过滤错误信息等。 还要注意权限问题,查看日可能需要sudo权限,特别是系统日。此外,日文件可能很大,需要压缩备份或分割处理,用户可能不知道如何高效处理大文件。 另外,用户可能遇到动态生成的日,比如使用Log4j或Logback的Java应用,需要指导他们如何根据配置查找日路径。容器化部署(如Docker)的日也需要特别说明,比如使用docker logs命令。 最后,要提醒用户注意日的安全性和定期归档,避免敏感信息泄露,并建议自动化监控工具,帮助及时发现问题。 总结下来,回答需要结构清晰,分步骤说明日定位的流程,涵盖常见日位置、分析工具、实战案例,以及注意事项,确保用户能一步步排查错误,同时给出实用示例和技巧,帮助他们高效解决问题。</think>以下是项目部署到服务器后,通过日定位报错的系统化方法: --- ### 一、明确日位置 #### 1. **通用系统日** - `/var/log/messages`:系统级日(CentOS/RHEL) - `/var/log/syslog`:系统级日(Debian/Ubuntu) - `/var/log/dmesg`:内核和硬件相关日 #### 2. **Web服务器日** - **Nginx**: ```bash /var/log/nginx/access.log # 访问日 /var/log/nginx/error.log # 错误日 ``` - **Apache**: ```bash /var/log/apache2/access.log /var/log/apache2/error.log ``` #### 3. **应用日** - **Java(Tomcat)**: ```bash $CATALINA_HOME/logs/catalina.out # 默认启动日 ``` - **Spring Boot**: ```bash # 默认输出到控制台,需配置logging.file或logging.path指定路径 ``` - **Python(Django/Flask)**: ```bash # 需在代码中配置日模块,如 logging.basicConfig(filename='app.log') ``` #### 4. **数据库日** - **MySQL**: ```bash /var/log/mysql/error.log # 错误日路径由my.cnf配置 ``` - **Redis**: ```bash # 在redis.conf中配置 logfile "/var/log/redis/redis-server.log" ``` --- ### 二、日分析工具与技巧 #### 1. **基础命令** - **实时追踪日**: ```bash tail -f /path/to/logfile.log # 动态查看日更新 ``` - **过滤错误关键词**: ```bash grep -i "error" /var/log/nginx/error.log # 忽略大小写搜索"error" grep -E "500|503" access.log # 匹配500或503状态码 ``` - **时间范围筛选**: ```bash sed -n '/2023-10-01 14:00:00/,/2023-10-01 15:00:00/p' app.log # 提取指定时间段日 ``` #### 2. **高级工具** - **`journalctl`**(Systemd服务日): ```bash journalctl -u nginx.service --since "10 minutes ago" # 查看Nginx最近10分钟日 ``` - **`awk`统计错误频率**: ```bash awk '{print $9}' access.log | sort | uniq -c # 统计HTTP状态码出现次数 ``` - **ELK Stack**: 使用Elasticsearch + Logstash + Kibana构建日分析平台,适合大规模日处理。 --- ### 三、实战步骤(以Web服务报错500为例) #### 1. **定位错误源头** - **检查Web服务器日**: ```bash tail -100 /var/log/nginx/error.log # 查看Nginx最新100行错误日 ``` - **检查应用日**: ```bash grep -C 5 "NullPointerException" /opt/app/app.log # 显示异常上下文5行 ``` #### 2. **分析错误信息** - **关注关键字段**: - **时间戳**:确认错误发生时间是否与用户反馈一致 - **错误类型**:如`ClassNotFoundException`(依赖缺失)、`SQLSyntaxError`(数据库语句错误) - **堆栈跟踪**:定位到具体代码文件和行号(需结合代码仓库) #### 3. **复现与调试** - **模拟请求**: ```bash curl -v http://example.com/api # 查看详细请求/响应头 ``` - **临时日增强**: 在代码中临时增加调试日(如输出变量值),重新部署后复现问题。 --- ### 四、常见问题与解决 #### 1. **日文件过大** - **日切割**: 使用`logrotate`工具自动压缩旧日: ```bash logrotate -f /etc/logrotate.d/nginx # 手动执行Nginx日切割 ``` #### 2. **权限问题** - **查看日权限**: ```bash ls -l /var/log/nginx/error.log # 确认当前用户是否有读取权限 ``` - **临时提权**(慎用): ```bash sudo chmod 644 /var/log/nginx/error.log # 开放读取权限 ``` #### 3. **容器化部署日** - **Docker容器日**: ```bash docker logs <container_id> # 查看容器标准输出 docker logs --tail 100 <container_id> # 查看最后100行 ``` --- ### 五、注意事项 1. **日安全**:避免日中包含敏感信息(如密码、密钥) 2. **监控告警**:配置Prometheus + Grafana或Sentry实现错误实时告警
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值