log日志配置简述

来源:互联网 发布:上海知楚王琦 编辑:程序博客网 时间:2024/06/06 04:40

近期进行log升级,简单配置了下几种常用日志,分别是log4j、log4j2、logback。简单整理,不全不深,仅备后用。
需求:将应用日志以控制台或文件的形式输出。

一、log4j

(1)引入jar包

下载并引入log4j的jar包,log4j-1.*.jar,笔者用的是 log4j-1.2.17.jar。

(2)log的主要节点

log配置文件主要包含三个节点:Logger、Appender、Layout。
Logger:配置打印日志的级别,输出日志的程序范围,以及关联的Appender。
Appender:配置日志的输出形式,输出策略等。
Layout:配置每条日志的内容格式。

(3)配置log4j.properties文件,示例:

#配置根节点log4j.rootLogger=INFO,Log4jConsole,Log4jFile#log不向上层传递log4j.additivity.org.appache=false#设置变量,保存路径 ${catalina.home}/logslogDir=D:/tomcat/logs#控制台输出log4j.appender.Log4jConsole=org.apache.log4j.ConsoleAppenderlog4j.appender.Log4jConsole.Threshold=INFOlog4j.appender.Log4jConsole.ImmediateFlush=truelog4j.appender.Log4jConsole.Target=System.out#输出格式log4j.appender.Log4jConsole.layout=org.apache.log4j.PatternLayoutlog4j.appender.Log4jConsole.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n#文件输出log4j.appender.Log4jFile=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.Log4jFile.Threshold=INFOlog4j.appender.Log4jFile.ImmediateFlush=truelog4j.appender.Log4jFile.Append=truelog4j.appender.Log4jFile.File=${logDir}/log4j.loglog4j.appender.Log4jFile.DatePattern='.'yyyy-MM-dd#输出格式log4j.appender.Log4jFile.layout=org.apache.log4j.PatternLayoutlog4j.appender.Log4jFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

说明:
1.Logger节点配置,“log4j.rootLogger=INFO,Log4jConsole,Log4jFile”。
rootLogger为根节点,必须配置项。日志输出范围为整个project。
若需配置logger子节点,支持以包名或类名控制日志范围。如:log4j.logger.com.demo=*,“com.demo”为程序包名,表示配置该包名范围内的日志。
2.INFO为日志级别,表示输出INFO级别及以上的日志。
常用日志级别:DEBUG < INFO < WARN < ERROR。
3.log4j.additivity属性,表示根据程序的层级结构,下层日志是否向上层传递。
4.Appender节点,示例中的Log4jConsole,Log4jFile均为Appender名称。常用的Appender类型有:
org.apache.log4j.ConsoleAppender,控制台形式输出日志。
org.apache.log4j.DailyRollingFileAppender,按时间策略,文件形式输出日志。
org.apache.log4j.RollingFileAppender,按文件大小策略,文件形式输出日志。
其中:log4j.appender. * .File,设置当前日志文件名称。
log4j.appender.*.DatePattern,设置时间维度,支持按天、按小时等精度生成日志。
5.若以文件形式输出日志,可设置文件保存的相对路径,如tomcat的“${catalina.home}”。
6.Layout设置每条日志内容的输出格式,Layout支持多种类型格式,笔者此次使用的是“org.apache.log4j.PatternLayout”。
设置格式:

[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

代码调用:

logger.info("it is a log for log4j!");

运行效果:

[INFO][2017-08-26 10:22:23][com.demo.log.Log4jTest:writeLog:41]it is a log for log4j!
格式化符号 意义 备注 %p 日志级别 如:INFO、WARN %d 时间 可设置格式,%d{yyyy_MM_dd HH:mm:ss} %t 线程名 %c 类名 如:%-20c,表示,左对齐,最大长度20 %M 方法名 %L 行号 %m 日志内容 代码输出的内容 %n 换行

(4)代码引用

此处为了说明,代码使用log4j自身的类写log。具体运用建议使用slf4j形式,具体后面讲解。

import org.apache.log4j.Logger;......private static Logger logger = Logger.getLogger(Log4j2Test.class);......logger.info("it is a log for log4j!");

log4j、log4j2、logback的配置项相似,只是语法不同,后面仅简述不同的地方,不重复说明。

二、log4j2

(1)引入jar包

下载并引入log4j的jar包,log4j-api-2.*.jar,log4j-core-2.*.jar。笔者用的是 log4j-api-2.8.2.jar,log4j-core-2.8.2.jar。

(2)配置log4j2.xml文件,示例:

<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN" monitorInterval="60">      <Properties>            <!-- 日志输出路径变量 ${sys:catalina.home}/logs -->            <Property name="logDir" value="D:/tomcat/logs" />      <Appenders>            <!-- 控制台输出 -->            <Console name="Log4j2Console" target="SYSTEM_OUT">                  <PatternLayout                        pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />            </Console>            <!-- 文件输出 -->            <RollingFile name="Log4j2File" fileName="${logDir}/log4j2.log"                  filePattern="${logDir}/log4j2.log.%d{yyyy-MM-dd}">                  <PatternLayout                        pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />                  <Policies>                        <TimeBasedTriggeringPolicy />                        <SizeBasedTriggeringPolicy size="100MB" />                  </Policies>            </RollingFile>      </Appenders>      <Loggers>            <Root level="INFO">                  <appender-ref ref="Log4j2Console" />                  <appender-ref ref="Log4j2File"/>            </Root>      </Loggers></Configuration>

说明:
1.Configuration标签中的monitorInterval属性,表示自动扫描的间隔秒数。log4j2定时扫描配置文件,当配置文件发生变化,将重新加载生效。
2.status属性,表示查看log4j2内部日志的日志级别,应用可查看log4j2内部的加载日志。
3.若设置tomcat的相对路径保存日志文件,使用 ${sys:catalina.home},和log4j有区别。
4.RollingFile 文件形式输出日志,支持通过时间、文件大小两种策略生成文件。
5.RollingFile节点的filename属性,可设置当前文件名包含时间戳。如:

fileName="${log.dir}/log4j2.log.${date:yyyy-MM-dd}"

6.本实例中仅配置了root根日志节点,若需配置子节点,在中添加子节点即可。

    <Logger level="INFO" name="com.demo.log" additivity="false">        <appender-ref ref="Log4j2Console" />    </Logger>

7.log4j2支持配置异步写log,以提升日志打印效率。配置如下:

      <Appenders>              <RollingRandomAccessFile name="Log4j2File"                  fileName="${logDir}/log4j2.log" filePattern="${log.dir}/log4j2.log.%d{yyyy-MM-dd}">                  <PatternLayout>                        <Pattern>[%p] %d{MM-dd HH:mm:ss,SSS}-(%c:%M:%L) %m%n</Pattern>                  </PatternLayout>                  <Policies>                        <TimeBasedTriggeringPolicy />                  </Policies>            </RollingRandomAccessFile>            ......      </Appenders>      <Loggers>            <AsyncLogger name="com.demo.log"                  level="INFO" additivity="false">                  <AppenderRef ref="Log4j2File" />            </AsyncLogger>            ......      </Loggers>

(3)代码引用

此处为了说明,代码使用log4j2自身的类写log。具体运用建议使用slf4j形式,具体后面讲解。

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;......private static Logger logger = LogManager.getLogger(Log4j2Test.class);......logger.info("it is a log for log4j2!");

三、logback

(1)引入jar包

下载并引入jar包,笔者用的是:slf4j-api-1.7.7.jar,logback-core-1.1.2.jar,logback-classic-1.1.2.jar。

(2)配置logback.xml文件,配置文件示例:

<?xml version="1.0" encoding="UTF-8"?><Configuration scan="true" scanPeriod="60 seconds" debug="true">      <!-- 60s 自动扫描配置 -->      <!-- 文件路径变量 ${catalina.home}/logs -->      <Property name="logDir" value="D:/tomcat/logs" />      <!-- 控制台输出 -->      <Appender name="LogbackConsole" class="ch.qos.logback.core.ConsoleAppender">            <Encoder>                  <Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n                  </Pattern>            </Encoder>      </Appender>      <!-- 文件输出 -->      <Appender name="LogbackFile"            class="ch.qos.logback.core.rolling.RollingFileAppender">            <File>${logDir}/logback.log</File>            <Append>true</Append>            <RollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">                  <FileNamePattern>${logDir}/logback.log.%d{yyyy-MM-dd}.%i                  </FileNamePattern>            </RollingPolicy>            <TriggeringPolicy                  class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">                  <MaxFileSize>100MB</MaxFileSize>            </TriggeringPolicy>            <Encoder>                  <Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n                  </Pattern>            </Encoder>      </Appender>      <Root level="INFO">            <Appender-ref ref="LogbackConsole" />            <Appender-ref ref="LogbackFile" />      </Root></Configuration>

说明:
1.logback可设置历史日志文件自动压缩,设置fileNamePattern属性添加“.gz”后缀即可。

<fileNamePattern>${log.dir}/logback.log.%i.%d{yyyy-MM-dd}.gz</fileNamePattern>

logback、log4j2的配置文件较相似,读懂了上面log4j2的配置文件,再看logback的配置就很轻松,不做过多说明。

(3)代码引用

import org.slf4j.Logger;import org.slf4j.LoggerFactory;......private final static Logger logger = LoggerFactory        .getLogger(LogbackTest.class);......logger.info("it is a log for logback!");

四、slf4j

slf4j,Simple Logging Facade for Java,Java简单日志门面。它不实现日志打印,只是通过门面模式提供log的api。

此处假装有图的样子

(1)引入jar包,以slf4j+log4j为例:
1. slf4j-api.jar,提供api给应用,如LoggerFactory工厂类。
2. slf4j-log4j.jar,桥接包,关联slf4j及log4j。
3. log4j-*jar,log4j的jar包,实现log打印。
(2)代码采用slf4j形式,同logback的代码示例:

private final static Logger logger = LoggerFactory        .getLogger(LogbackTest.class);......logger.info("it is a log for {}!",type);......

(3)slf4j的好处:1、统一使用slf4j形式写log,不用修改源码,便于日志升级。2、log参数使用占位符{},不使用字符串拼接,语句清晰,性能更好。


写log是一种艺术,良好的log有利于定位问题。

ps:本文仅简单记录三种log的基本配置,许多点并未涉及到。