日志技术简介

java日志体系

  1. 日志的主流体系
    日志技术简介
  2. 日志的用途
  3. 软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况。为了让我们能够更加灵活和方便的控制这些调试的信息,所以我们需要专业的日志技术。java 中寻找bug 会需要重现。调试也就是debug 可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更加方便的去重现问题。
  4. 类似于我们sout到控制台在没有日志框架之前确实是这么做的 (加上IO技术永久保存)
  5. 日志的配置
  6. 目前使用的是logback(猜想log4j log4j12也可以用 出自同一个人)
  7. 工作环境是:关闭springboot默认的日志配置 只向控制台输出debug和info级别的日志

            %d{HH:mm:ss} %green([%-5level]) %logger{10}.%method %msg%n
            ${file.charset}

            debug
            ACCEPT
            DENY

            %d{HH:mm:ss} %green([%-5level]) %logger{10}.%M - %msg%n
            ${file.charset}

            info
            ACCEPT
            DENY

  • 标签的含义和用途(请具备xml基础的知识)
  • root: 根目录
    • 功能:本身也是一个logger顶级包的上级
    • 有level属性 指定要记录的日志级别 >=INFO 级别的被记录(级别不区分大小写)
    • 根标签有且仅有一个
    • 在没有logger的情况下 所有包/类的日志级别 都继承自根标签
  • logger
    • 功能:对特定包或类设置要被记录的日志
    • name :具体包或类
    • level:日志级别(>=debug)的生效
    • additivity:是否向上级传递 (如果要记录的包中有日志要被记录,且additivity的值为true(默认值),在有logger的情况下日志将会被记录两次)
    • appender-ref:具体由那种appender来记录
    • 子标签
    • encoder:要被记录的日志的格式进行设置
      • pattern:遵循java.text.Format接口规范
      • charset:字符编码
    • filter:对日志进筛选
      • class:具体执行的类 要配套使用
      • LevelFilter 需要指定 level级别和onMatch(>=level)策略 onMismatch(
      • onMatch策略和onMismatch策略 ACCEPT:接受并处理 DENY:拒绝并抛弃 NEUTRAL:不处理传递给下一个filter
      • ThresholdFilter:对>=level的筛选 只需要指定 level级别 更加细致的控制请看这篇博客: logback logback.xml常用配置详解(一) and – AUB – ITeye博客 记录到file中请看 参考博文
  • appender

    • 功能:日志记录被什么样的类执行
    • class:
    • ConsoleAppender 效果:输出到控制台
    • FileAppender 效果:输出文件
    • name:指定该appender叫什么 被logger/root的appender-ref:引用

    • 日志使用的思考
    • 不同的框架使用的日志技术可能不一样,对框架的日志技术的实现统一使用一种日志技术
    • 独立使用日志的配置文件 设定出适合自己的日志记录
    • 最佳实践
    • 总是使用 Log Facade,而不是具体的 Log Implementation
    • 只添加一个 Log Implementation 依赖
    • 具体的日志依赖应该设置为 optional,并使用 runtime scope
      设为optional,依赖不会传递,这样如果你是个lib项目,然后别的项目使用了你这个lib,不会被引入不想要的Log Implementation 依赖;
      Scope设置为runtime,是为了防止开发人员在项目中直接使用Log Implementation中的类,而不使用Log Facade中的类。
    • 如果有必要, 排除依赖的第三方库中的Log Impementation依赖
      这是很常见的一个问题,第三方库的开发者未必会把具体的日志实现或者桥接器的依赖设置为optional,然后你的项目继承了这些依赖——具体的日志实现未必是你想使用的,比如他依赖了Log4j,你想使用Logback,这时就很尴尬。另外,如果不同的第三方依赖使用了不同的桥接器和Log实现,也极容易形成环。
      这种情况下,推荐的处理方法,是使用exclude来排除所有的这些Log实现和桥接器的依赖,只保留第三方库里面对Log Facade的依赖。 最佳实践的配置

    org.slf4j
    slf4j-api
    ${version}

    ch.qos.logback
    logback-core
    ${version}

    ch.qos.logback
    logback-classic
    ${version}

    org.slf4j
    slf4j-log4j12
    99.0-does-not-exist

    org.slf4j
    log4j-over-slf4j
    ${version}

    org.slf4j
    jcl-over-slf4j
    ${version}

    log4j
    log4j
    99.0-does-not-exist

    apache-log4j
    log4j
    999-not-exist

  1. Java日志体系详解_Jeremy_Lee123的博客-CSDN博客_java 日志体系
  2. 多种java 日志框架【超详细图文】_不埋雷的探长的博客-CSDN博客_java主流日志框架
  3. logback 的使用和 logback.xml 详解 + 多模块项目示例_肖朋伟的博客-CSDN博客
  4. Logback日志使用_半桶水的码农的博客-CSDN博客_logback日志使用
  5. logback logback.xml常用配置详解(一) and – AUB – ITeye博客

2020-7-27

自定义配置遇到的问题:

  1. <root level="off"></root>这样关闭会导致 别人的代码中(框架)的日志消息全部不显示

个人理解的一个误区: 日志像异常一样 在我的包中发生的层层上抛 我的配置可以管理到 &#xD7;

框架中的日志输出根据实现的不同,可以通过日志技术写入控制台,也可以通过标准输出到控制台

2.根据1来推出

  • 1.框架中的日志是都丢给了root 以下是证明

日志技术简介

日志技术简介

结论是:我们不能更加具体的控制框架 什么包输入什么包不输出日志

猜想:1.在root 关闭的基础上 可以通过全局异常捕获(aop)来 抓异常自己输出到控制台(这个网上有类似解决方案)

​ 2.学习代理技术 来解决

  • 2.日志实现可以不通过log.info()…的方式输出到控制台

日志技术简介

日志技术简介

结论:日志写入控制台的方式表面上看 可以有两种 调用log.info()…和 System.out(err)

猜想:写入控制台的本质都是 调用了System.out/err()

​ logback.xml的配置中 <target>System.out</target>

​ application.yml的配置中使用 org.apache.ibatis.logging.stdout.StdOutImpl这中日志实现时

​ 无论root 是否关闭,其都会在控制台输出! logback.xml的配置是对log.info()…这些方式的管理

Original: https://www.cnblogs.com/acman-mr-lee/p/16506495.html
Author: ACMAN-Mr.Lee
Title: 日志技术简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644307/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java基础——JDK1.8后的日期处理类

    Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是: 可变性…

    技术杂谈 2023年7月24日
    079
  • 【leetcode】18. 四数之和

    题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c…

    技术杂谈 2023年7月24日
    073
  • Ribbon、Feign和OpenFeign的区别

    RibbonRibbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件Ribbon 可以用来做客户端负载均衡,调用注册中心的服务Ribbon的使用需要代码里手动调…

    技术杂谈 2023年5月31日
    098
  • 有向图计数与GGF/2022.8.10闲话II

    《コバルトメモリーズ》海岸线は半透明半透明的海岸线,カモメが鸣いた,海鸥声声鸣叫着,ノイズまみれのラジオが歌うよ,掺杂着噪音的收音机正唱着歌,结构前の话,在很久以前,世界が全员喧哗…

    技术杂谈 2023年7月23日
    077
  • 从业20年一直私藏的9个视频素材源头(超好用)

    1、名称:灵感 网站:奇趣生活有灵感 推荐理由:灵感是国内唯一有AI视频搜索功能的APP,就是拍照就能找出视频源头和相关内容,而且内容非常丰富,还能直接登陆外网,正如其名,灵感不断…

    技术杂谈 2023年5月31日
    086
  • 新买的百度云服务器随便玩玩之部署简单页面

    新买的百度云服务器随便玩玩之部署简单页面 1.vscode 连接百度云服务器 vscode下载拓展 2.在远程资源管理器中添加新的远程资源管理 3.输入云服务器公网ip地址;输入密…

    技术杂谈 2023年6月21日
    096
  • SSH加密原理

    1、SSH初次交换公钥 客户端发起链接请求 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥) 客户端生成密钥对 客户端用自己的公钥异或会话ID,计算出一个值Re…

    技术杂谈 2023年7月24日
    096
  • Python 格式化输出相关知识

    第一种用法:相当于占位符 print(‘我叫{},今年{}岁,性别:{}。’.format(‘amwkvi’,27,’男’)) 第二种用法:重复调用格式化输出列表中变量或值 pri…

    技术杂谈 2023年6月21日
    083
  • 初识React,Virutal DOM, State以及生命周期

    React可以看做是MVC中的V,关注的是视图层。React的组件就像Angular的Directive,包括了HTML,CSS,JS以及相关数据等。React的组件被定义在了以&…

    技术杂谈 2023年5月31日
    086
  • Docker 容器虚拟化

    Docker 容器虚拟化 1、虚拟化网络 Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自网络…

    技术杂谈 2023年6月21日
    0114
  • 面向服务的体系架构(SOA)

    1、面向服务的体系架构(SOA) 面向服务的架构(service-oriented architecture)是Gartner于2O世纪9O年代中期提出的面向服务架构的概念。200…

    技术杂谈 2023年6月1日
    0105
  • VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程

    前言这是《VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程》一文的姐妹篇教程,如果你需要阅读它,请点击这里。2020 年,CentOS 宣布:计划未来将重…

    技术杂谈 2023年7月11日
    0103
  • 我的作品

    ESFramework 是一套性能卓越、稳定可靠、强大易用的跨平台通信框架,支持应用服务器集群。 其内置了消息的收发与自定义处理(支持同步/异步模型)、消息广播、P2P通道、文件传…

    技术杂谈 2023年6月1日
    092
  • golang interface用法

    接口是一个或多个方法签名的集合,任何类型的方法集中只要拥有与之对应的全部方法,就表示它”实现”了该接口无须在该类型上显式添加接口声明。 所谓对应方法,是指有…

    技术杂谈 2023年5月31日
    0109
  • 2022年5月数据库排名

    数据来源:https://db-engines.com/en/ranking Original: https://www.cnblogs.com/chujian007/p/1631…

    技术杂谈 2023年7月24日
    060
  • cpp创建对象的多种形式

    1 使用非默认构造函数来创建对象的几种形式 Person person = Person("binny1", 26); 这种方式创建对象,C++标准允许编译器使…

    技术杂谈 2023年7月10日
    062
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球