java日志体系
- 日志的主流体系
- 日志的用途
- 软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况。为了让我们能够更加灵活和方便的控制这些调试的信息,所以我们需要专业的日志技术。java 中寻找bug 会需要重现。调试也就是debug 可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更加方便的去重现问题。
- 类似于我们sout到控制台在没有日志框架之前确实是这么做的 (加上IO技术永久保存)
- 日志的配置
- 目前使用的是logback(猜想log4j log4j12也可以用 出自同一个人)
- 工作环境是:关闭springboot默认的日志配置 只向控制台输出debug和info级别的日志
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="10 seconds">
-
- <property name="file.charset" value="UTF-8" />
-
- <appender name="DEBUG_CONSOLE" >
- <encoder>
- <pattern>%d{HH:mm:ss} %green([%-5level]) %logger{10}.%method %msg%n</pattern>
- <charset>${file.charset}</charset>
- </encoder>
- <filter >
- <level>debug</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- </appender>
-
- <appender name="INFO_CONSOLE" >
- <encoder>
- <pattern>%d{HH:mm:ss} %green([%-5level]) %logger{10}.%M - %msg%n</pattern>
- <charset>${file.charset}</charset>
- </encoder>
- <filter >
- <level>info</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- </appender>
- <logger name="com.itheima" level="debug" additivity="false">
- <appender-ref ref="INFO_CONSOLE"/>
- <appender-ref ref="DEBUG_CONSOLE"/>
- </logger>
-
- <root level="off">
- </root>
- </configuration>
复制代码 - 标签的含义和用途(请具备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(=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的依赖。
最佳实践的配置- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-core</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>99.0-does-not-exist</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>log4j-over-slf4j</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>99.0-does-not-exist</version>
- </dependency>
- <dependency>
- <groupId>apache-log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>999-not-exist</version>
- </dependency>
复制代码 参考博文
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |