首页 > 其他分享 >记一次,工作中,日志打印的错误,你真的会打印日志吗?

记一次,工作中,日志打印的错误,你真的会打印日志吗?

时间:2023-09-29 10:04:58浏览次数:31  
标签:exception 错误 com 打印 error 日志 main TestLogError

问题

今天在工作中,Redis接收到消息,入库失败了,只看到了有报错,但是没有看到是什么异常,还有具体的堆栈信息。

public class ExceptionTest {
    public static void main(String[] args) {
        try {
            System.out.println(1 / 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上面这段程序只会将日志,输出到idea的控制台,并不会将,错误日志写入到log文件中。

e.printStackTrace()方法是用于打印异常堆栈信息到控制台,并不会将日志写入到log文件中。它会将异常的跟踪信息输出到标准错误流(System.err),通常会在控制台或终端显示。

Soga,原来是这样。。。。。

正确的日志打印方式是

@Slf4j
public class ExceptionTest {
    public static void main(String[] args) {
        try {
            System.out.println(1 / 0);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("程序出现异常:", e);
        }
    }
}

这样就可以将错误日志,写到log文件中,方便后续排查问题。

log.error 日志打印对比

public class TestLogError {
  public static final Logger LOGGER = LogManager.getLogger(TestLogError.class);
  
  public static void main(String[] args) {
    try{
      // 模拟空指针异常
      //Integer nullInt = Integer.valueOf(null);
      int[] array = {1,2,3,4,5};
      int outBoundInt = array[5];
    }catch (Exception e){
      // 直接打印,则只输出异常类型
      LOGGER.error(e);
      // 使用字符串拼接
      LOGGER.error("使用 + 号连接直接输出 e : " + e);
      LOGGER.error("使用 + 号连接直接输出 e.getMessage() : " + e.getMessage());
      LOGGER.error("使用 + 号连接直接输出 e.toString() : " + e.toString());
      // 使用逗号分隔,调用两个参数的error方法
      LOGGER.error("使用 , 号 使第二个参数作为Throwable : ", e);
      // 尝试使用分隔符,第二个参数为Throwable,会发现分隔符没有起作用,第二个参数的不同据,调用不同的重载方法
      LOGGER.error("第二个参数为Throwable,使用分隔符打印 {} : ", e);
      // 尝试使用分隔符,第二个参数为Object,会发现分隔符起作用了,根据第二个参数的不同类型,调用不同的重载方法
      LOGGER.error("第二个参数为Object,使用分隔符打印 {} ",123);
    }
  }
}

输出结果

23:24:04.753 [main] ERROR com.yu.test.exception.TestLogError - java.lang.ArrayIndexOutOfBoundsException: 5
23:24:04.760 [main] ERROR com.yu.test.exception.TestLogError - 使用 + 号连接直接输出 e : java.lang.ArrayIndexOutOfBoundsException: 5
23:24:04.760 [main] ERROR com.yu.test.exception.TestLogError - 使用 + 号连接直接输出 e.getMessage() : 5
23:24:04.760 [main] ERROR com.yu.test.exception.TestLogError - 使用 + 号连接直接输出 e.toString() : java.lang.ArrayIndexOutOfBoundsException: 5
23:24:04.764 [main] ERROR com.yu.test.exception.TestLogError - 使用 , 号 使第二个参数作为Throwable : 
java.lang.ArrayIndexOutOfBoundsException: 5
	at com.yupi.yupao.test.exception.TestLogError.main(TestLogError.java:14)
23:24:04.764 [main] ERROR com.yu.test.exception.TestLogError - 第二个参数为Throwable,使用分隔符打印 {} : 
java.lang.ArrayIndexOutOfBoundsException: 5
	at com.yu.test.exception.TestLogError.main(TestLogError.java:14)
23:24:04.771 [main] ERROR com.yu.test.exception.TestLogError - 第二个参数为Object,使用分隔符打印 123 

Process finished with exit code 0

总结:

使用Logger.error(e)、Logger.error(e.getMessage())、Logger.error("some msg" + e)、Logger.error("some msg" + e.getMessage()) 都是调用的error(Object message),这个方法都会将入参当作Object输出,不会打印堆栈信息。

在使用Logger.error("first param ",e)时会调用error(String message, Throwable t),此方法会完整的打印出错误堆栈信息。

最后,推荐一篇关于日志打印优秀实践的好文!值得收藏!

https://mp.weixin.qq.com/s/Bd7ldWUpUjDW_oHVM_IPhw?poc_token=HNyWFWWjd5_XINP7kwLWf2vkWVJrQi-hH6uMAuTC

标签:exception,错误,com,打印,error,日志,main,TestLogError
From: https://blog.51cto.com/AmbitionGarden/7644610

相关文章

  • npm install 报-4048错误
    报错原因:有缓存权限不够 有三种解决方法:第一种:找到.npmrc文件并删除在C:\Users\自己用户的文件夹\下找到.npmrc文件并删除注意:这个文件是隐藏的,需要显示隐藏才能看见第二种方法:直接用命令清理在控制台上输出 npmcacheclean--force 一样可以删除第三种方法:......
  • 日志输出
    //////////////////////////////////////////////////////////////////////_ooOoo_////o8888888o////88"."88......
  • centos567修改系统日志保留时间为1年
    linux系统cp-R/etc/logrotate.conf/etc/logrotate.conf20220829cat>/etc/logrotate.conf<<EOF####################################################################weekly#默认每个礼拜进行轮询rotate55#保留几个日志文件......
  • 学习Serilog日志笔记
       本学习笔记所有的.net 版本为6.0 首先引包nuget包为:serilog 和serilog.aspnetcore1、在控制台下使用日志:  需要引入Serilog.Sinks.Console包 然后在program.cs中写入以下语句:  Log.Logger=newLogerConfiguration().MinimumLevel.Debug()  .WriteT......
  • zabbix监控日志文本
    监控集群oracle数据库,掉盘情况1.创建监控项—>日志如果是否出现CLOSED字符,出现即报警vfs.file.regmatch[/home/oracle/db_check/log/asmdisk_check.log,CLOSED]2.创建触发器,警告—>出现CLOSED字符立即报警-hostnamexxxxxxx是服务器主机名{hostnamexxxxxxx:vfs.file.regmatch[/ho......
  • K8S错误整理
    目录1.calico-node报错Readinessprobefailed:calico/nodeisnotready:BIRDisnotready2.error:MetricsAPInotavailablea.k8s版本:v1.24.4b.k8s1.203.Unabletoupdatecniconfig:nonetworksfoundin/etc/cni/net.d 1.calico-node报错Readinessprobefailed:ca......
  • openfeign开启日志Logger.Level feignLoggerLevel()中Level爆红的解决
    问题原因:引错包了!!!应该引入如下这个包importfeign.Logger;......
  • 几种常用的日志管理系统
    日志管理系统是用于收集、存储、分析和可视化日志数据的工具,用于监控和维护应用程序和系统的运行状况。以下是几种常用的日志管理系统:ELKStack(Elasticsearch、Logstash、Kibana):ELKStack是一个流行的开源日志管理解决方案,它包括Elasticsearch用于存储和搜索日志数据,Logstash用......
  • filebeat 收集 nginx 日志到 kibana 展示
    首先是nginx.conf的日志格式json格式很多,不一定非要这个log_formatjson'{"access_time":"$time_iso8601","remote_addr":"$remote_addr","remote_user":"$remote_user","request":"$request&qu......
  • .NET开发者常会忽略的几个错误
    在运用Visiolstudio.NET开发Web应用程式中,开发者常常会遇到一些问题:如我开发好的程式,在开发环境下测试没问题,怎么一搬到应用环境下,就会有问题?不是程式的无法运行,就是程式的效率慢的同蜗牛在爬,这种情况在.NET的新手中尤其常见。我不知道为什么,一些介绍.NET开发的书本里引用的......