日志是程序猿的眼睛,好的日志输出能帮助我们快速的解决问题,那我们就要知道日志是怎么配置的,下面是从对8个日志级别的介绍,和如何在项目上配置都详细的说明了,了解日志的小伙版们可以做为参考,看到这篇文章,那就是缘分,感谢有你,希望你前程似锦。
日志的8个级别:
log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
ALL: 最低等级的,用于打开所有日志记录。
TRACE: designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。
DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
INFO: 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
WARN: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
FATAL: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
OFF: 最高等级的,用于关闭所有日志记录。
如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
从我们实验的结果可以看出,log4j默认的优先级为ERROR或者WARN(实际上是ERROR)。
日志怎麽使用呢,先让我们看看在 . properties文件怎么配置
一,配置控制台日志输出
#该定义让日志在控制台和文件输出,并且只输出info级别以上的日志
log4j.rootLogger=info,console,myFile
#控制台日志的实现类是ConsoleAppender(控制台输出源)
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定控制台日志输出格式的格式转换器为PatternLayout实现类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#定义控制台日志输出的具体格式
log4j.appender.console.layout.ConversionPattern=%d %-5p [%c.%M()] - %m%n
二,配置文件日志的输处
#日志文件的实现类是RollingFileAppender(文件输出源)
log4j.appender.myFile=org.apache.log4j.RollingFileAppender
#定义日志文件的存储路径
log4j.appender.myFile.File=src/log/logProperties/log4j.log
#定义日志文件的大小
log4j.appender.myFile.MaxFileSize=1024kb
#定义日志文件最多生成几个(从0开始算1个,即此处最多3个文件)
#超过该大小则会覆盖前面生成的文件
log4j.appender.myFile.MaxBackupIndex=2
#指定日志文件输出格式的格式转换器为PatternLayout实现类
log4j.appender.myFile.layout=org.apache.log4j.PatternLayout
#定义日志文件输出的具体格式
log4j.appender.console.layout.ConversionPattern=%d %-5p [%c.%M()] - %m%n
#######输出格式解释#######
#%d: 日志打印的时间点,默认格式为ISO8601,也可以另外指定格式,
#定义如下: %d{yyy年MM月dd日 HH时mm分ss秒SSS},则会输出:
#2018年01月06日 14时47分45秒590
#%p: 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL
#%-5p:表示字符小于5位,则字符居左(不加“-”号则字符居右),你可以举一反三
#%c: 日志所在类的全名
#%M: 日志所在方法的名字
#%m: 日志信息
#%n: 输出一个回车换行符
#%L: 输出代码中的行号
日志级别配置
日志级别配置可分为3类,一类是配置父类日志记录器的日志级别,第二类是配置子类日志记录器的日志级别,第三类是配置输出源(控制台、文件等)的日志级别。他们的日志级别解析优先级由低到高排列。
解释:
输出源如果没有定义日志级别,它会继承最接近它的子类日志记录器的日志级别;子类日志记录器没有定义日志级别,它会继承最接近它的父类日志记录器。
打印日志时输出源会根据自身定义的日志级别与最接近它的子类日志记录器定义的日志级别比较,如果输出源定义的级别高于子类日志记录器,则按输出源定义的日志级别输出日志,反之则按子类日志记录器的日志级别输出。
logback.xml配置日志:
先介绍一下各个配置都是做什么的,以及配上例子以便能更好的理解
<appender> :
<appender>是<configuration>的子节点,是负责写日志的组件。
ConsoleAppender :
把日志添加到控制台,有以下子节点:
<encoder> : 对日志进行格式化。
<target> : 字符串 System.out 或者 System.err ,默认 System.out
<!-- 表示打印到控制台 -->
<appender name="limeFlogger" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<target>System.err</target>
</appender>
FileAppender :
把日志添加到文件,有以下子节点:
<file> : 被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append> : 如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<encoder> : 对记录事件进行格式化。
<prudent> : 如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
<appender name="limeFileLogger" class="ch.qos.logback.core.FileAppender">
<file>limeFileLogger.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<prudent>false</prudent>
</appender>
RollingFileAppender :
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
1,<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
2,<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
3,<encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
4,<rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名,。
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
(1),<fileNamePattern>:指定文件命名格式,每隔一段时间改变一次
(2),<maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件
5,<triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
SizeBasedTriggeringPolicy: 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
<maxFileSize>:这是活动文件的大小,默认值是10MB。
<prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
例如:每天生成一个日志文件,保存30天的日志文件
<!--文件输出info日志的配置-->
<appender name="fileInfolog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--滚动策略 按照时间来滚动 每日创建一个日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/log/fileInfolog%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
</appender>
例如:当文件大于20MB时生成新的日志文件
<!--文件输出info日志的配置-->
<appender name="fileInfolog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--当文件大于20MB时,生成新的日志文件-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
</appender>
<filter>:
过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。
过滤器被添加到<Appender>中,为<Appender> 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。<Appender>有多个过滤器时,按照配置顺序执行。
LevelFilter:
级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点:
<level>:设置过滤级别
<onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作
<!--文件输出info日志的配置-->
<appender name="fileInfolog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--为了在info中不出现error的日志,因为error的日志级别最高,所以我们不用普通的过滤器,而是在权限过滤器下匹配相应级别的日志,进行筛选-->
<!--筛选的级别有三种 DENY ACCEPT NEUTRAL 禁止,接受和中立 具体看类 filterReply-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--设置权限-->
<level>ERROR</level>
<!--命中-->
<onMatch>DENY</onMatch>
<!--未命中-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略 按照时间来滚动 每日创建一个日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/log/fileInfolog%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
<!--文件输出error日志的配置-->
<appender name="fileErrorlog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--为了在error日志中没有info日志,所以我们设置一个过滤器 记住是ThresholdFilter,不是levelFilter-->
<filter class = "ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略 按照时间来滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/log/fileErrorlog%d.log</fileNamePattern>
</rollingPolicy>
</appender>
EvaluatorFilter:
求值过滤器,评估、鉴别日志是否符合指定条件。有一下子节点:
<evaluator>:
鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签<expression>,用于配置求值条件,有以下子节点:。
< onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作
<encoder> :
负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。
目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个<pattern>节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“\%”进行转义。
<logger>:
用来设置某一个包或者具体的某一个类的日志打印级别,有以下子节点:
name:用来指定受此loger约束的某一个包或者具体的某一个类。
<level>:用来设置打印级别
addtivity:是否向上级loger传递打印信息。默认是true。
<loger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger
<logger name="test.log4j.test8.UseLog4j" additivity="false">
<level value ="WARN"/>
<appender-ref ref="fileInfolog"/>
</logger>
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="test.log4j.test8.UseLog4j_" additivity="false">
<level value ="ERROR"/>
<appender-ref ref="fileErrorlog"/>
</logger>
<root>:
输出日志级别
设置root的日志级别为info,指定所有<apender>的日志级别为info
<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。
<root level="info">
<appender-ref ref="consolelog"/>
<appender-ref ref="fileInfolog"/>
<appender-ref ref="fileErrorlog"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="limeFileLogger"/>
</root>
如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--配置控制台的输出-->
<appender name="consolelog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> %d- %msg%n</pattern>
</layout>
</appender>
<!--文件输出info日志的配置-->
<appender name="fileInfolog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--为了在info中不出现error的日志,因为error的日志级别最高,所以我们不用普通的过滤器,而是在权限过滤器下匹配相应级别的日志,进行筛选-->
<!--筛选的级别有三种 DENY ACCEPT NEUTRAL 禁止,接受和中立 具体看类 filterReply-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--设置权限-->
<level>ERROR</level>
<!--命中-->
<onMatch>DENY</onMatch>
<!--未命中-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略 按照时间来滚动 每日创建一个日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/log/fileInfolog%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--过滤掉所有日志消息中不包含“billing”字符串的日志。-->
<appender name="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
<filterclass="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator><!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<appender name="limeFileLogger" class="ch.qos.logback.core.FileAppender">
<file>limeFileLogger.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<prudent>false</prudent>
</appender>
<!--文件输出error日志的配置-->
<appender name="fileErrorlog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--为了在error日志中没有info日志,所以我们设置一个过滤器 记住是ThresholdFilter,不是levelFilter-->
<filter class = "ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略 按照时间来滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/log/fileErrorlog%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<logger name="test.log4j.test8.UseLog4j" additivity="false">
<level value ="WARN"/>
<appender-ref ref="fileInfolog"/>
</logger>
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="test.log4j.test8.UseLog4j_" additivity="false">
<level value ="ERROR"/>
<appender-ref ref="fileErrorlog"/>
</logger>
<root level="info">
<appender-ref ref="consolelog"/>
<appender-ref ref="fileInfolog"/>
<appender-ref ref="fileErrorlog"/>
</root>
</configuration>