• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java工程如何打印程序日志过程解析

java 搞代码 4年前 (2022-01-09) 26次浏览 已收录 0个评论

很久之前,有个朋友问我,如果一个老项目让你接手去进行后续维护,你会先从哪里入手、让自己更快地上手项目?当时我没有特别正面去回答这个朋友的问题,我说:一个老项目是否容易上手,一个非常关键的地方就是这个项目的日志是否打得足够好。因为通常来说,一个老项目相对比较稳定了,后续大概率不会有比较大的变更和改动,那么对于这样的项目,核心就是“维稳”。但是任何人都无法保证项目在线上运行时不会出线上故障,在出现线上问题或者故障时,如何快速止损就是第一要义,而日志在止损过程中就扮演着非常重要的角色。日志打的足够明了清晰,可以帮助开发和运维人员快速定位问题,继而决定采取何种方案进行止损。

今天就让我们一起来聊一聊如何把项目程序日志打“好”。

一.为何需要规范地打印程序日志?

我们平时在写程序代码过程中,一般会把主要精力集中在功能实现上,往往会忽视日志的重要性,然而日志在系统上线后是极其重要的,因为系统上线后,只有通过日志才能了解当前系统的运行状态,在出现线上故障时,日志是否足够清晰明了决定了是否能够快速找到止损方案。我们可以看一下下面这段代码:

public class HttpClient {
  private static final Logger LOG = LoggerFactory.getLogger(HttpClient.class);
 
  private static int CONNECT_TIMEOUT = 5000;  // unit ms
  private static int READ_TIMEOUT = 10000;   // unit ms
   
  public static String sendPost(String url, String param) {
    OutputStream out = null;
    BufferedReader in = null;
    String result = "";
    try {
      URL realUrl = new URL(url);
      URLConnection conn = realUrl.openConnection();
      conn.setDoInput(true);
      conn.setDoOutput(true);
      conn.setConnectTimeout(CONNECT_TIMEOUT);
      conn.setReadTimeout(READ_TIMEOUT);
      conn.setRequestPropert<p style="color:transparent">本文来源gao!%daima.com搞$代*!码$网3</p>y("charset", "UTF-8");
      out = new PrintWriter(conn.getOutputStream());
      out.print(parm);
      out.flush();
      in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
      String line;
      while ((line = in.readLine()) != null) {
        result += line;
      }
    } catch (Exception ex) {
      LOG.error("post request error!!!");
    } finally {
      try {
        if (out != null) {
          out.close();
        }
        if (in != null) {
          in.close();
        }
      } catch (IOException ex) {
        LOG.error("close stream error!!!");
      }
      return result;
    }
  }
}

某一天线上突然大量http请求失败,然后查看日志,发现了大量的“post request error!!!”错误,此时假如看到这样的日志你可能完全不知道究竟是什么原因导致的,还得继续通过一些其他的手段来定位具体原因。

假如打印的错误日志是这样的:

post request error!!!, url:[http://www.123.test.com], param:[name=jack]
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)

那么便能很快地断定是下游http服务问题导致的,且下游http服务域名为www.123.test.com(Connection refused通常是由于下游服务端口未启动引起的),可以迅速找相应的人员进行止损,避免在故障定位阶段耗费大量的时间。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java工程如何打印程序日志过程解析
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址