当前位置: 首页 > news >正文

Java日志系统(上)

Java日志系统(上)


最近一段时间,公司的应用架构在向微服务架构转型,基本框架是Dubbo + zookeeper。在转型过程种,笔者从网上、书本上,对日志系统有了一些初步了解。找了个时间,这里把学习到的知识做个总结。本文部分内容节选自网上各路大神的博客、《分布式服务架构——原理、设计与实践》第4章。

1. 概述

日志是程序设计中很重要的一部分,它提供了丰富的程序运行时信息,例如:程序运行时的逻辑信息、错误信息、事件描述信息、关键数据、状态信息,以及用户的登录信息、操作信息,等等。这些日志信息可以帮助开发人员快速发现和定位问题。在实际生产环境种,日志也是查找问题的重要来源,良好的日志格式和记录方式可以帮助我们快速找到解决问题的办法。没有日志,甚至会失去对系统的可控性。

题外话:一个部署在Tomcat中的应用程序,在Tomcat\logs\文件夹下,有如下几种常见的日志类型。

  • Tomcat本地日志:通常为localhost.*.txt,该日志是应用程序异常,但是没有被捕获时会被一直抛出到容器层,容器处理后记录在这个日志里。

  • Tomcat存取日志:通常为localhost_access_log.*.txt,该日志是客户端访问日志,清晰地记录了HTTP服务请求的来源、响应时间、返回的HTTP代码等,可用于统计服务的成功数和失败数、接口的响应时间、服务的请求数和吞吐量等。

  • Tomcat控制台日志:通常为catalina.*.log或者catalina.out,该日志是引擎的日志文件,包含Tomcat是否成功启动、启动所用时间,一级应用程序打印的控制台日志等信息。

  • 应用程序日志:一般使用Commons logging、Log4j、Slf4j、Logback、Log4j2等框架生成应用程序的业务系统日志。后续会详细介绍。

2. 日志系统的门面模式

在JDK的最初版本中,不包含日志相关的API,直到JDK1.4才出现了JDK Logger。在此期间,开源社区的Apache Commons Logging和Apache Log4j成了应用最广泛的日志工具,甚至成为Java日志系统的事实上的标准。其中,Apache Commons Logging是通用的日志API,而Apache Log4j则是日志实现。后来,Slf4j和LogBack逐渐取代了Apache Commons Logging和Apache Log4j;Log4j的继任者Log4j2也迅速流行起来。

由于现在开源的日志系统较多,作为应用开发者,我们希望自己的组件不依赖于某个具体的日志工具,毕竟有很多日志工具可以使用。例如,假如Log4j日志工具存在性能或者其他问题,我们就需要对日志工具进行切换。但是如果我们的应用程序是直接使用的Log4j,在切换时会带来大量的修改工作。为了解决这个问题,日志系统采用了门面模式

门面模式:提供一个统一的接口去访问多个子系统的多个不同接口,它为子系统中的一组接口提供一个统一的高层接口。

具体说来,Apache Commons Logging和Slf4j提供通用的日志API,充当门面角色;门面后面才是Log4j、Log4j2和LogBack等具体的实现。有人也将Apache Commons Logging和Slf4j称为日志框架。

日志框架仅仅提供日志接口,而具体的日志实现则在运行时根据配置,动态地决定具体使用哪个日志系统,也就是说,具体的日志实现交给Log4j这样的开源日志工具来完成。开发人员只需要针对API进行编程,而运行时可以根据配置切换不同的日志实现。这种方式将我们的应用程序和具体的日志实现进行了解耦,底层日志系统的改变,并不会影响上层的业务代码,大大提高了灵活性。

3. 开源日志系统

sun公司为了抗衡Log4j,在JDK1.4推出了一套日志系统JDK Logger,它的最大优点是不需要继承任何类库,只要有Jre环境,就可以直接使用。但是相比其他开源日志框架,JDK Logger在易用性、功能、扩展性方面都稍逊一筹,被人诟病,所以使用较少。

在Java日志系统(下)中,具体介绍常见的开源日志系统。

转载于:https://www.cnblogs.com/jfzhzo/p/9656094.html

相关文章:

  • BCH社区意见分歧:引领市场VS迎合市场?
  • 063_Apex 的 Test类说明
  • 前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等
  • 开篇:Pyhon基础笔记
  • 外国人又玩出新花样,仅需几行CSS代码就能让iPhone重启、Mac卡顿
  • SaaS技术栈的走势
  • 502错误,让你进一步明白nginx和php-fpm之间的关系
  • Oracle数据库-备份整个数据库与还原整个数据库数据
  • JVM:带你查看常见的问题,以及分析处方法
  • Mozilla开发全新的公开网络API WebXR 来实现增强现实
  • 2019物联网博览会
  • WPF实现QQ群文件列表动画(一)
  • 汉诺塔问题研究——分治法以及递归的设计技巧
  • Java 8: 从永久代(PermGen)到元空间(Metaspace)
  • 直接获取地址栏参数
  • canvas 高仿 Apple Watch 表盘
  • CentOS7 安装JDK
  • Magento 1.x 中文订单打印乱码
  • nodejs:开发并发布一个nodejs包
  • php中curl和soap方式请求服务超时问题
  • spring boot下thymeleaf全局静态变量配置
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于Flux,Vuex,Redux的思考
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何编写一个可升级的智能合约
  • 深度学习中的信息论知识详解
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 线上 python http server profile 实践
  • 用element的upload组件实现多图片上传和压缩
  • 栈实现走出迷宫(C++)
  • 第二十章:异步和文件I/O.(二十三)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #{} 和 ${}区别
  • (10)ATF MMU转换表
  • (4)(4.6) Triducer
  • (4)事件处理——(7)简单事件(Simple events)
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)Knockout 创建自定义绑定
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (万字长文)Spring的核心知识尽揽其中
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)使用VMware vSphere标准交换机设置网络连接
  • **PHP二维数组遍历时同时赋值
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 材料检测系统崩溃分析
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C++进阶篇]STL中vector的使用
  • [caffe(二)]Python加载训练caffe模型并进行测试1