为什么使用日志:
项目在运行时,要通过日志文件才能知道你的服务器在做什么,了解项目的运行过程、数据的变化,当系统出现问题才能更快的定位问题,针对性优化;
所以我们在写程序日志的时候要知道:
- 在那些地方该加上日志?
- 如何规范的写日志? 不仅让自己看的懂,也要让别人(运维人员)看的懂。
日志框架:SLF4J,Logback,Log4j2,尽量使用异步日志,因为效率会比较高;
重点:
1、如何使用日志工具以及使用它的API,就成为了重点;
https://blog.youkuaiyun.com/pan_junbiao/article/details/104313938
https://blog.youkuaiyun.com/vbirdbest/article/details/71751835
2、知道在什么情况下使用什么日志类型要写入日志文件;
https://www.cnblogs.com/lilinwei340/p/9697287.html
https://blog.youkuaiyun.com/Farrell_zeng/article/details/99303649
3、使用日志分析问题出在哪里;
了解写日志的工具及其API
https://blog.youkuaiyun.com/pan_junbiao/article/details/104313938
https://blog.youkuaiyun.com/vbirdbest/article/details/71751835
JAVA日志及其最佳实践经验
https://www.cnblogs.com/lilinwei340/p/9697287.html
如何选择日志的格式,消息的格式,日志记录的内容,哪种消息对应于哪一种日志级别,则完全是基于经验。
日志的基本使用步骤:
在配置文件中定义日志的级别,比该级别小的信息就不输出;让后定义日志输出的目的地,然后再定义logger;
1、写日志的配置文件:配置文件节点解析
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别 trace<debug<info<warn<error<fatal -->
<!--根节点 <Configuration>
status:用来指定log4j本身的打印日志的级别。
monitorinterval:用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s。-->
<configuration status="info" monitorInterval="30">
<Properties>
<Property name="LOG_HOME">/tmp/logback</Property>
<Property name="FILE_SIZE">200M</Property>
<Property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger :%L - %msg%n</Property>
<Property name="rolling_file_name">-%d{HH:mm:ss.SSS}.%i</Property>
<Property name="rollover_strategy_max">30</Property>
</Properties>
<!--先定义所有的appender 输出源,用于定义日志输出的地方 -->
<appenders>
<!--将日志打印到控制台上-->
<!--name:指定Appender的名字。
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。
-->
<console name="console" target="SYSTEM_OUT">
<!--输出日志的格式不设置默认为:%m%n -->
<PatternLayout>
<Pattern>${log_pattern}</Pattern>
<Charset>UTF-8</Charset>
</PatternLayout>
</console>
<!--<RollingRandomAccessFile>: 该输出源也是写入到文件
不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,
另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则这种方式更加实用,
因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。
-->
<!-- name:指定Appender的名字。
fileName:指定当前日志文件的位置和文件名称
filePattern="${LOG_HOME}/%d{yyyy-MM-dd}/app{rolling_file_name}.log"
immediateFlush="false"
append="true"
-->
<RollingRandomAccessFile name="rollingFile"
fileName="${LOG_HOME}/app.log"
filePattern="${LOG_HOME}/%d{yyyy-MM-dd}/app{rolling_file_name}.log"
immediateFlush="false" append="true">
<!--用于指定输出文件的格式(如 日志输出的时间 文件 方法 行数 等格式) -->
<PatternLayout>
<Pattern>${log_pattern}</Pattern>
<Charset>UTF-8</Charset>
</PatternLayout>
<!--指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
<Policies>
<!--基于指定文件大小的滚动策略,
size:属性用来定义每个日志文件的大小。
-->
<SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
<!--基于时间的滚动策略
interval:属性用来指定多久滚动一次,默认是1hour。
modulate=true:用来调整时间:比如现在是早上3am,interval是4,
那么第一次滚动是在4am,接着是8am,12am...而不是7am。 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,
创建新的(通过max属性)。
-->
<DefaultRolloverStrategy max="${rollover_strategy_max}"/>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}">
<IfFileName glob="*/app*.log" />
<IfLastModified age="20d" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--
level:日志输出级别,共有8个级别,按照从低到高为:
All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。
AppenderRef:Logger的子节点A,用来指定该日志输出到哪个appender,如果没有指定,
就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,
此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。-->
<logger name="com.gillion.ds" level="DEBUG"/>
<!--Root节点用来指定项目的根日志,如果没有单独指定Logger,
那么就会默认使用该Root日志输出。-->
<!--level:日志输出级别,共有8个级别,按照从低到高为:
All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender。-->
<root level="info">
<appender-ref ref="console"/>
</root>
</loggers>
</configuration>
关于日志level。
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
All:最低等级的,用于打开所有日志记录。
Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。
Info:消息在粗粒度级别上突出强调应用程序的运行过程。
Warn:输出警告及warn以下级别的日志。
Error:输出错误信息日志。
Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。
OFF:最高等级的,用于关闭所有日志记录。
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
2、在类中加注解,然后使用log4j2
private static Logger logger =
LoggerFactory.getLogger(RuleServiceImpl.class);